STM32CubeMX笔记--定时器生成PWM特定波形,控制舵机转动
Posted 杰尼君
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32CubeMX笔记--定时器生成PWM特定波形,控制舵机转动相关的知识,希望对你有一定的参考价值。
定时器生成PWM特定波形,控制舵机转动
1、舵机相关知识
1.1 相关舵机的知识点:
-
舵机的分类
按照旋转角度
180°舵机:能给定角度、固定转速。 只能在0度到180度之间运动,超过范围,舵机轻则齿轮打坏,重则烧坏内部电路.
360°舵机:能360度转动, 能控制转速。但不能调节转动的角度
按照控制信号
模拟舵机:要持续提供PWM信号才能固定角度。优点:便宜。
数字舵机:只要给一次PWM信号就能固定角度。优点:高精度,响就快,抖动小,更大的角度固定力。 -
几个重要参数
最大扭矩
如MG996, 最大扭矩: 13KG/cm. 这个是在舵机堵转时测得的, 其时距离轴中心1cm处能挂起的重量.
工作电压
如常用的3.0V~7.2V, 接入电压不同, 所能产生的工作扭矩自然不同. 直接影响角度固定力。 -
引脚说明
红色:供电;电流比较大,除非测试, 真不建议在开发板上取电;
粽色:地线;必须与控制器, 如SMT32芯片共地;
橙色:PWM信号线;接芯片的TIMx外设的CHx脚;
1.2 舵机的控制:
-
原理简介
舵机接收的是PWM信号,能使舵机内部电路产生一个偏置电压,触发电机通过减速齿轮带动电位器移动,当电压差为零时,电机停转,从而达到伺服的效果。
即,给舵机提供一个特定的PWM信号,舵机就可以旋转到指定的位置。 -
PWM信号、角度
舵机接收的PWM信号频率为50HZ,即周期为20ms。当高电平的脉宽在0.5ms-2.5ms之间时舵机就可以对应旋转到不同的角度。
为了更好地理解其信号,和编写代码,把PWM关键点转换如下:
PWM信号周期: 20000us
0度时,高电平时长: 500us
180度时, 高电平时长:2500us
每增加1 °,需增加高电平时长:(2500-500)÷180 = 11.1us
某角度值A,需要的总高电平时长:(A x11.1 +500)us
故在设置定时器参数时
预分频(PSC)
:72-1;
计数值(Counter)
:20000-1;(计数从0开始,所以要减1)
设置计数值为20000对应PWM信号周期:20000us;
控制对应的为对应通道的CCR设置为:500-2500;
重点解释一下:PSC, ARR, CCR, CNT
PSC:TIM时钟的分频系数:72;内部时钟经PSC值分频后, 传给CNT计数器使用;
CNT:计数器,CNT每计数一次的脉冲时长为:1÷(CLK÷PSC) = 1÷(72000000÷72) = 0.000001s/次 = 1us/次;
ARR:自动重装载值:20000,AutoReload Register
也称为Counter Period
,CNT计数器经过多少次脉冲就重新开始计数。用这个值可控制需要的PWM信号周期:1us x 20 000次 = 20 000us = 20ms
CCR:用于控制周期内高电平时长, 当CNT<CCR时, 为有效电平. 而有效电平的高低, 则是通过CCER寄存器设置的, 默认的有效电平为高电平.
特别地说明: 把所有ms值, 转换为us值, 是为了方便代码的编写和理解
2、STM32CubeMX引脚设置和代码生成
2.1 相关STM32CubeMX生成代码配置如下:
相关外部晶振的设置参考:STM32CubeMX笔记(5)–定时器中断
1、在STM32CubeMX软件右侧:
选择Times
定时器设置项,根据下图进行配置相对应的定时器相关参数的设置。
(选择内部时钟源、设置通道的模式、设置预分频、计数值)
定时器频率=时钟频率/(预分频*计数值)
T i m e s ( H z ) = I n t e r n e l C l o c k ( M H z ) P S C ∗ C o u n t e r . Times(Hz) = \\frac{InternelClock(MHz)}{PSC*Counter}. Times(Hz)=PSC∗CounterInternelClock(MHz).
下面图中设置的舵机的频率为50Hz,使用定时器8生成PWM波
其中内部时钟频率为APB1(InternelClock)
频率为72MHz(根据时钟树看出)
预分频(PSC)
:72-1; 计数值(Counter)
:20000-1;(计数从0开始,所以要减1)
设置计数值为20000对应PWM信号周期:20000us;
控制对应的为对应通道的CCR设置为:500-2500;
设 置 生 成 的 频 率 = 72000000 72 ∗ 20000 = 50 H z 设置生成的频率= \\frac{72000000}{72*20000}=50Hz 设置生成的频率=72∗2000072000000=50Hz
2、在STM32CubeMX软件右上角,点击GEBERATE CODE项,生成代码。
相关定时器的参数设置:(定时器8为例)
3、编写相关的C函数文件
3.1、相关PWM函数开启:
1)添加定时器8的通道1和通道2的PWM生成开启使能函数,放置于到main.c
中的用户代码区。
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim8,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim8,TIM_CHANNEL_2);
/* USER CODE END 2 */
3.2、相关PWM占空比设置:
2)通过类似如下的设置,即可设置定时器8的通道1和通道2的相关占空比寄存器,直接控制PWM的占空比输出
TIM8->CCR1 = 800;
TIM8->CCR2 = 1800;
3.3、相关PWM占空比设置函数改进:
3)将上述寄存器进行改进,整合出相关的函数文件
/**************************************************************************
函数功能:定时器TIMx的PWM输出占空比CCRx设置函数
入口参数:[TIMx]:TIM1~8、[CHx]:TIM_CHANNEL_1~4、[CCR]:0~65535(舵机控制时:0~2500)
返回 值:无
说 明:通过设置TIMx寄存器CCRx的值设置输出通道的占空比
**************************************************************************/
void TIM_SetCCR(TIM_TypeDef *TIMx, uint32_t CHx, uint16_t CCR)
{
if(CHx==TIM_CHANNEL_1) TIMx->CCR1 = CCR;
if(CHx==TIM_CHANNEL_2) TIMx->CCR2 = CCR;
if(CHx==TIM_CHANNEL_3) TIMx->CCR3 = CCR;
if(CHx==TIM_CHANNEL_4) TIMx->CCR4 = CCR;
}
函数的引用效果如下:
以下两个代码片段的使用效果相同,如下。
设置通道1占空比为50hz,高电平时间800us;
设置通道2占空比为50hz,高电平时间1800us;
TIM_SetCCR(TIM8,TIM_CHANNEL_1,800);
TIM_SetCCR(TIM8,TIM_CHANNEL_2,1800);
TIM8->CCR1 = 800;
TIM8->CCR2 = 1800;
进一步测试,将以下代码复制到主函数的循环中:
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
TIM_SetCCR(TIM8,TIM_CHANNEL_1,800);
TIM_SetCCR(TIM8,TIM_CHANNEL_2,1800);
HAL_Delay(1000);
TIM_SetCCR(TIM8,TIM_CHANNEL_1,1800);
TIM_SetCCR(TIM8,TIM_CHANNEL_2,800);
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
4、编译工程文件,使用ST-Link烧录,测试定时器中断
将对应的通道输出接口连接上舵机的PWM控制线,进行相关转角的测试。
对应舵机来回旋转。
以上是关于STM32CubeMX笔记--定时器生成PWM特定波形,控制舵机转动的主要内容,如果未能解决你的问题,请参考以下文章
STM32G070RBT6基于STM32CubeMX配置定时器 PWM功能案例
基于STM32F030F4P9和STM32 CUBEMX 输出PWM波形
STM32F103VET6基于STM32CubeMX利用EXTI外部中断测量PWM频率
STM32G4备战蓝桥杯嵌入式---模块配置---LIS302DL(拓展板)