10. STM32——PWM 控制舵机(超声波感应开盖垃圾桶)

2023-05-16

STM32——PWM 控制舵机

  • 通用定时输出PWM
    • PWM的工作原理
    • PWM的模式
      • TIM_OCMode_PWM1 (边沿对齐模式)
      • TIM_OCMode_PWM2(中央对齐模式)
    • 占空比
  • 舵机
    • 实物图
    • 接线
    • 舵机工作原理
    • 周期T
    • PWM占空比
  • TIM3 PWM输出 驱动SG90电机 配置过程:
    • 1. 使能GPIO时钟,TIM定时器时钟,部分重映射时钟
    • 2. 重映射定时器
    • 3. 配置GPIO结构体
    • 4. 配置通用定时器TIM结构体
    • 5. 配置PWM
  • stm32 超声波感应开盖垃圾桶
    • motor.c
    • motor.h
    • HC_SR04.c
    • HC_SR04.h
    • usart.c
    • usart.h
    • main.c
    • stm32 超声波感应开盖垃圾桶 效果展示

通用定时输出PWM

以TIM3为例,STM32的通用定时器氛围TIM2,TIM3,TIM4,TIM5,每个定时器都有独立的四个通道可以用来作为: 输入捕获,输出比较,PWM输出,单脉冲模式输出等。

STM32的定时器除了TIM6和TIM7(基本定时器)之外,其他的定时器都可以产生PWM波输出,高级定时器TIM1,TIM8可以同时产生7路PWM输出,而通用定时器可以同时产生4路PWM输出,这样STM32可以最多同时输出30路PWM输出!

PWM的工作原理

在这里插入图片描述

以向上计数为例,讲述PWM原理:

  1. 在PWM输出模式下除了CNT(计数器当前值),ARR(自动重装载值),CCRx(捕获/比较寄存器值)。

  2. 当CNT小于CCRx时,TIMx_CHx通道输出低电平

  3. 当CNT等于或大于CCRx时,TIMx_CHx通道输出高电平

所谓脉宽调制信号(PWM波),就是一个TIMx_ARR自动重装载寄存器确定频率(由它决定PWM周期),TIM_CCRx寄存器确定占空比信号。

PWM的模式

TIM_OCMode_PWM1 (边沿对齐模式)

在这里插入图片描述

向上计数时: 当TIMx_CNT<TIMx_CCRx时通道1为有效电平,否则为无效电平;

向下计数时: 一旦TIMx_CNT>TIMx_CCRx,CCR1通道1为无效电平,否则为有效电平。

TIM_OCMode_PWM2(中央对齐模式)

向上计数时: 当TIMx_CNT<TIMx_CCRx时通道1为无效电平,否则为有效电平;

向下计数时: 一旦TIMx_CNT>TIMx_CCRx,CCR1通道1为有效电平,否则为无效电平。

占空比

在这里插入图片描述

是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比。

舵机

实物图

在这里插入图片描述

接线

SG9O电机

硬件接线:

红线 : 3.3v/ 5v
黑 / 棕线 : GND
黄线 : 信号线

舵机工作原理

舵机的主要组成部分为伺服电机,所谓伺服就是服从信号的要求而动作。在信号来之前,转子停止不动;信号来到之后,转子立即运动。因此我们就可以给舵机输入不同的信号,来控制其旋转到不同的角度。
舵机接收的是PWM信号,当信号进入内部电路产生一个偏置电压,触发电机通过减速齿轮带动电位器移动,使电压差为零时,电机停转,从而达到伺服的效果。简单来说就是给舵机一个特定的PWM信号,舵机就可以旋转到指定的位置。

在这里插入图片描述

舵机上有三根线,分别是GND、VCC和SIG,也就是地线、电源线和信号线,其中的PWM波就是从信号线输入给舵机的。
一般来说,舵机接收的PWM信号频率为50HZ,即周期为20ms。当高电平的脉宽在0.5ms~2.5ms之间时舵机就可以对应旋转到不同的角度。

在这里插入图片描述

t = 0.5ms——————-舵机会转到 0 °
t = 1.0ms——————-舵机会转到 45°
t = 1.5ms——————-舵机会转到 90°
t = 2.0ms——————-舵机会转到 135°
t = 2.5ms——————-舵机会转到 180°

周期T

PWM周期为20ms = 0.02s = (7200*200)/72000000

PWM占空比

是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比.由于PWM周期为20ms,所以(以舵机会转动 45°为例),占空比就应该为1ms/20ms = 5%,所以TIM_SetCompare1的 TIMx 捕获比较 1 寄存器值就为200 * 5% = 10

单位: % (0%~100%)

TIM3 PWM输出 驱动SG90电机 配置过程:

1. 使能GPIO时钟,TIM定时器时钟,部分重映射时钟

//1.使能GPIO时钟、定时器时钟、复用时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

2. 重映射定时器

在这里插入图片描述

//2.重映射定时器
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);

3. 配置GPIO结构体

GPIO_InitTypeDef gpioInitStructure;

//3.配置GPIO
gpioInitStructure.GPIO_Mode  = GPIO_Mode_AF_PP; //复用推挽输出
gpioInitStructure.GPIO_Pin   = GPIO_Pin_5; //引脚5
gpioInitStructure.GPIO_Speed = GPIO_Speed_10MHz; //10Hz

GPIO_Init(GPIOB, &gpioInitStructure); //初始化

4. 配置通用定时器TIM结构体

TIM_TimeBaseInitTypeDef timInitStructure;


//4.配置定时器
timInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //不分频
timInitStructure.TIM_CounterMode   = TIM_CounterMode_Up; //向上计数模式
timInitStructure.TIM_Period        = 200-1; //设置了在下一个更新事件装入活动的自动重装载寄存器周期的值。
timInitStructure.TIM_Prescaler     = 7200-1; //设置了用来作为 TIMx时钟频率除数的预分频值。

TIM_TimeBaseInit(TIM3, &timInitStructure); //初始化

5. 配置PWM

在这里插入图片描述

//5.配置PWM
timOCInitStructure.TIM_OCMode      = TIM_OCMode_PWM1; //边沿对齐模式
timOCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能
timOCInitStructure.TIM_OCPolarity  = TIM_OCPolarity_High; //设置为高电平有效
		
TIM_OC2Init(TIM3, &timOCInitStructure); //初始化
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //配置自动加载的预加载寄存器
		
TIM_Cmd(TIM3, ENABLE); //使能

stm32 超声波感应开盖垃圾桶

motor.c

#include "motor.h"
#include "stm32f10x.h"

void motor_Init(void)
{
		GPIO_InitTypeDef gpioInitStructure;
		TIM_TimeBaseInitTypeDef timInitStructure;
		TIM_OCInitTypeDef timOCInitStructure;
		
		//1.使能GPIO时钟、定时器时钟、复用时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

		
		//2.重映射定时器
		GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);

		//3.配置GPIO
		gpioInitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
		gpioInitStructure.GPIO_Pin   = GPIO_Pin_5;
		gpioInitStructure.GPIO_Speed = GPIO_Speed_10MHz;
		
		GPIO_Init(GPIOB, &gpioInitStructure);
		
		//4.配置定时器
		timInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
		timInitStructure.TIM_CounterMode   = TIM_CounterMode_Up;
		timInitStructure.TIM_Period        = 200-1;
		timInitStructure.TIM_Prescaler     = 7200-1;
		
		TIM_TimeBaseInit(TIM3, &timInitStructure);
		
		//5.配置PWM
		timOCInitStructure.TIM_OCMode      = TIM_OCMode_PWM1;
		timOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
		timOCInitStructure.TIM_OCPolarity  = TIM_OCPolarity_High;
		
		TIM_OC2Init(TIM3, &timOCInitStructure);
		TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
		
		TIM_Cmd(TIM3, ENABLE);
		
}

motor.h

#include "stm32f10x.h"

void motor_Init(void);

HC_SR04.c

在STM32第9篇中可以找到 9. STM32——HC_SR04超声波测距

HC_SR04.h

在STM32分栏第9篇中可以找到 9. STM32——HC_SR04超声波测距

usart.c

在STM32分栏第6篇中可以找到 6. STM32——用串口发送数据点亮LED(串口的中断接收)

usart.h

在STM32分栏第6篇中可以找到 6. STM32——用串口发送数据点亮LED(串口的中断接收)

main.c

#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "shake.h"
#include "relay.h"
#include "exti.h"
#include "usart.h"
#include "tim.h"
#include "motor.h"
#include "SysTick.h"
#include "HC_SR04.h"

int main()
{
		float Length=0;
//		int pwmval=155;
	
		motor_Init();
		HC_SR04Init();
		usart_init();
		
//		printf("abc");
		
		while(1)
		{
				Length=Get_Length();
				printf("%.3f\r\n",Length);
				delay_ms(100);
				
				if(Length<5)
				{
						TIM_SetCompare2(TIM3, 15);
						delay_ms(1000);
						
				}
				else if(Length>5)
				{
						TIM_SetCompare2(TIM3, 25);
				}

		}

}

stm32 超声波感应开盖垃圾桶 效果展示

在这里插入图片描述

如果觉得这篇文章对你有用。欢迎大家点赞、评论哈哈
需要整个工程代码,欢迎大家打赏,评论区留上你的邮箱 or vx or qq。o( ̄︶ ̄)o

在这里插入图片描述

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

10. STM32——PWM 控制舵机(超声波感应开盖垃圾桶) 的相关文章

  • 在地址“0xXXXXXX”处中断,没有可用的调试信息,或在程序代码之外

    配置 使用 Nucleo L476RG 使用 GNU ARM Eclipse 我从 STM32CubeMX 生成了一个极简代码 我已经在我的板载 ST Link 中刷新了 J link 驱动程序 一直在尝试为我的代码运行调试器 但我的程序计
  • 如何让printf在STM32F103上工作?

    我是 STM32F103 世界的新手 我有一个STM32F103的演示代码 我正在使用arm none eabi来编译它 我尝试了在谷歌上可以找到的内容 但到目前为止没有任何效果 我已经花了三天时间来解决这个问题 任何人都可以给我一个运行良
  • 优化 ARM Cortex M3 代码

    我有一个 C 函数 它尝试将帧缓冲区复制到 FSMC RAM 这些函数将游戏循环的帧速率降低至 10FPS 我想知道如何分析反汇编的函数 我应该计算每个指令周期吗 我想知道CPU把时间花在哪里 在哪个部分 我确信该算法也是一个问题 因为它的
  • 当数据大小较小时,内存到内存 DMA 传输是否需要权衡?

    我正在学习 STM32 F4 微控制器 我正在尝试找出使用 DMA 的限制 根据我的理解和研究 我知道如果数据量较小 即设备使用DMA生成或消耗少量数据 则开销会增加 因为DMA传输需要DMA控制器执行操作 从而不必要地增加系统成本 我做了
  • 140-基于stm32单片机智能晾衣杆控制系统Proteus仿真+源程序

    资料编号 140 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 光敏传感器 蜂鸣器 LED灯 制作一个基于stm32单片机智能晾衣杆控制系统Proteus仿真 2 通过光敏传感器
  • 135-基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真+源程序

    资料编号 135 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 电机 超声波传感器 制作一个基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真 2 通过DHT11传感器检测当前
  • rt-thread studio中新建5.0不能用

    文章目录 一 版本对比 二 文件和文件夹打斜杠 在使用RT Thread studio创建新工程5 0版本的时候 结果发现新建完成之后程序不能正常运行 但是创建4 10版本的时候却能运行 那肯定是新版本出现了BUG 一 版本对比 首先对比了
  • STM32用一个定时器执行多任务写法

    文章目录 main c include stm32f4xx h uint32 t Power check times 电量检测周期 uint32 t RFID Init Check times RFID检测周期 int main Timer
  • STM32超声波——HC_SR04

    文章目录 一 超声波图片 二 时序图 三 超声波流程 四 单位换算 五 取余计算 六 换算距离 七 超声波代码 一 超声波图片 测量距离 2cm 400cm 二 时序图 1 以下时序图要先提供一个至少10us的脉冲触发信号 告诉单片机我准备
  • [MM32硬件]搭建灵动微MM32G0001A6T的简易开发环境

    作为学习单片机的经典 自然是通过GPIO点亮LED 或者是响应按钮的外部中断例程 这我们看看SOP8封装的芯片MM32G0001A6T得引脚 除了VDD和GND固定外 我们可以使用PA14 PA1 PA13 PA15 PA2 PA3这六个G
  • HAL 锁定和解锁函数如何使用以及为什么?

    我试图理解另一位程序员编写的代码 它使用了I C http en wikipedia org wiki I C2 B2C通信以将数据写入 STM32 微控制器的 EEPROM 一般来说 我理解他的代码是如何工作的 但我不明白他为什么使用HA
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • BeagleBone Black (v4.14) 上的 PWM 芯片到引脚映射

    关于如何在较新版本的内核上配置 Beaglebone 进行 PWM 的信息非常少 我按照以下指示进行操作BeagleBone Black v4 14 上的 PWM https stackoverflow com questions 5020
  • Freertos低功耗管理

    空闲任务中的低功耗Tickless处理 在整个系统运行得过程中 其中大部分时间都是在执行空闲任务的 空闲任务之所以执行 因为在系统中的其他任务处于阻塞或者被挂起时才会执行 因此可以将空闲任务的执行时间转换成低功耗模式 在其他任务解除阻塞而准
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • STM32 上的 ADC 单次转换

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • STM32F0、ST-link v2、OpenOCD 0.9.0:打开失败

    我在用着发射台 http www ti com ww en launchpad about htmlgcc arm none eabi 4 9 2015q2 为 STM32F0 进行编译 现在我想使用该集合中的 arm none eabi
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能
  • STM32F4 定时器 - 计算周期和预分频,以生成 1 ms 延迟

    我在用STM32F407VGT6 with CubeMX 因此 我从通用定时器开始 但我被预分频值和周期值所困扰 基本上我想每隔一段时间生成一个定时器中断n 其中 n 1 2 3 ms 并执行一些任务 计算周期和预分频值的公式有很多变化 公

随机推荐

  • HTML基础(一)

    本文是作者在学习html过程中对知识的初步整理 1 第一个程序 span class token doctype lt DOCTYPE html gt span span class token tag span class token t
  • 结构体的数组

    结构数组 也就是结构体的数组 的组成 xff1a struct 结构名 变量名 数组大小 span class token macro property span class token directive hash span span c
  • kali详细安装教程

    vmware虚拟机下载地址 xff1a https www vmware com cn products workstation pro workstation pro evaluation html kali ISO镜像 https cd
  • Armbian (jammy) 上安装 Docker

    一 Armbian 的软件源配置 Ubuntu 的软件源配置文件是 etc apt sources list 默认注释了源码镜像以提高 apt update 速度 xff0c 如有需要可自行取消注释 deb https mirrors tu
  • c语言结构体中的冒泡排序

    题目 xff1a 使用结构体以及函数 xff0c 首先录入学生信息 xff0c 依据学生成绩 xff0c 对学生相关信息进行排序 include lt stdio h gt include lt string h gt struct stu
  • csp序列查询(C语言)

    csp序列查询 span class token macro property span class token directive hash span span class token directive keyword include
  • 数据库学习

    数据库学习 一 span class token keyword SELECT span span class token operator span span class token keyword FROM span customers
  • Spring框架-ioc和JdbcTemplate

    前提 xff1a 我们用了Mybatis时 xff0c 已经不需要再使用其他的持久层框架了 用了mybatis之后 xff0c 我们只需要写持久层接口以及sql语句即可 但是为了讲解spring中的事务 xff0c 我们把JdbcTempl
  • 发送Promise请求出现以下错误origin ‘null‘ has been blocked by CORS policy

    错误如下 Access to XMLHttpRequest at span class token string 39 http localhost 9090 data 39 span from origin span class toke
  • VB.net与VB6 调用Websocket功能的方法--Websocket For VB

    概述 Websocket 功能在现今的通信应用开发中越来越普遍 xff0c 因为Websocket的消息机制 xff0c 在应用程序进行即时通信时使用非常合适 xff0c 而且Websocket 是长连接方式 xff0c 比起以前的http
  • sql当前日期

    查询本周 从周一开始计算 1 7 从周日开始计算就删除1 7 SELECT FROM 表名 WHERE YEARWEEK date format 时间字段 39 Y m d 39 1 61 YEARWEEK now 7 查询当月 SELEC
  • 【乐视秒杀架构】每秒处理10万请求—数据库分库分表

    随着乐视硬件抢购的不断升级 xff0c 乐视集团支付面临的请求压力百倍乃至千倍的暴增 作为商品购买的最后一环 xff0c 保证用户快速稳定的完成支付尤为重要 所以在15年11月 xff0c 我们对整个支付系统进行了全面的架构升级 xff0c
  • 单点登录(SSO)

    单点登录概述 xff1a 多系统共存下 xff0c 用户在一处地方登录 xff0c 得到其他所有系统的信任 xff0c 无需再次登录 在前端用户点击登陆之后触发后端的登录接口 xff0c 用户名密码验证通过之后 xff0c 自动生成一个JW
  • 【超详细】Consul的安装的使用附多环境配置(傻瓜式教程)

    一 Consul概述 Consul 是 HashiCorp 公司推出的开源工具 xff0c 用于实现分布式系统的服务发现与配置 与其他分布式服务注册与发现的方案 xff0c Consul 的方案更 一站式 xff0c 内置了服务注册与发现框
  • 【IDEA报错总结】修改Java编译版本-maven工程

    Warning 21 17 java 从发行版 10 开始 xff0c 39 var 39 是受限制的本地变量类型 xff0c 无法用于类型声明 xff0c 也无法用作数组的元素类型 之前一直使用的JDK8 xff0c 这个项目因为需要用到
  • 建一个链表

    单独的一个类 public class LinkNode int val LinkNode next LinkNode int x val 61 x 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • 判断数据类型的5种方法

    1 typeof 可以判断数据类型 xff0c 它返回表示数据类型的字符串 xff08 返回结果只能包括number boolean string function object undefined xff09 xff1b 可以使用type
  • 用python实现给女朋友自动发微信

    女朋友说上班都不回她微信 xff0c 于是给她安排一个定时自动发微信的功能 效果预览 实现过程 一 启动微信进程二 获取微信窗口在桌面的坐标三 发送消息1 鼠标依次点击打开聊天框2 输入发送内容 四 设置定时任务 一 启动微信进程 正常情况
  • 7. STM32——定时器中断(1秒闪烁灯)

    STM32 定时器中断 xff08 1秒闪烁灯 xff09 基本框架1 配置定时器时钟在 stm32f10x rcc h 头文件中查找相关函数函数 2 配置定时器结构体在 stm32f10x tim h 头文件中查找相关函数函数 3 开启定
  • 10. STM32——PWM 控制舵机(超声波感应开盖垃圾桶)

    STM32 PWM 控制舵机 通用定时输出PWMPWM的工作原理PWM的模式TIM OCMode PWM1 xff08 边沿对齐模式 xff09 TIM OCMode PWM2 xff08 中央对齐模式 xff09 占空比 舵机实物图接线舵