目录
大家好,这里是程序员杰克。一名平平无奇的嵌入式软件工程师。
上篇推送分享主要是对舵机的一些相关知识点进行了总结,本篇推送内容主要是对舵机控制转角与脉宽的换算。正常而言,只要频率、脉宽符合舵机控制要求,都可以实现舵机控制。本示例是使用STM32定时器的PWM输出功能进行控制。
要实现STM32的PWM控制舵机在转角范围内转到任意角度,要实现以下两点:
-
明确舵机脉宽与转角的换算
-
实现对应转角的PWM脉宽输出控制
下面正式进入本章推送的内容。
01 脉宽与转角换算
-
计算舵机任意角度脉宽
舵机转动的角度与脉宽在0.5ms~2.5ms的区间内呈线性关系。舵机有90°、180°、270°、360°最大转角,这里以180°舵机为例来说明脉冲宽度和角度的关系,其他角度舵机参考具体参数,180°舵机周期为20ms时的脉宽和转角关系如下图:
杰克这里,对舵机输出轴转角进行重定义:-90°认为是0位置,90°认为是180位置:
脉冲宽度 | 0.5ms | 1ms | 1.5ms | 2ms | 2.5ms |
转动角度 | -90° | -45° | 0° | 34° | 90° |
重定义转角 | 0° | 45° | 90° | 135° | 180° |
以0.5ms为0位置时, 从0位置转到180位置,脉宽的最大增量 = (2.5ms - 0.5ms) = 2ms,有: 任意角脉宽 = 0°脉冲宽度 + 角度值 *(脉宽的最大增量 / 180°),即: 任意角脉宽 = 0.5ms + 角度值 *(2ms/180°) |
02 PWM控制与输出
舵机的转动最终还是由驱动脉宽所控制。对于本篇推送而言(以STM32F1系列为例),脉宽控制是由定时器的PWM输出功能。控制信号引脚接在定时器的通道引脚上便可,编程上重点是要实现PWM的周期、占空比的控制。
下面开始分享本人的设计思路(STM32F103系列为例):既然是要控制输出PWM的周期和占空比,需要明确定时器的周期、PWM输出占空比计算公式:
定时器频率计算公式:f = sys_clk / [ ( arr + 1 ) * ( psc + 1 ) ]; 占空比计算公式:duty = ccr/arr * 100%; | |
sys_clk | 系统运行时钟 |
psc | 定时器时钟预分频值 |
arr | 计数重装载值 |
ccr | 比较计数值 |
-
定时器设置与角度值换算
本示例使用的舵机为周期20ms、转角180°的模拟舵机。本示例编程推导思路如下:
①任意角脉宽计算公式 :angle = 0.5ms + 角度值 *(2ms/180°)[角度值=[0,180]] ②占空比计算公式 :duty = ccr/arr * 100% ③定时器频率计算公式:f = sys_clk / [ ( arr + 1 ) * ( psc + 1 ) ] | |
1. 设置arr(计算重装载值) | 公式①推导时有:从0位置转到180位置, 脉宽的最大增量 = (2.5ms - 0.5ms) = 2ms; 此处将arr设置为(2000-1) |
2. 设置psc(预分频值) | 根据公式③有: psc = sys_clk/[ f * (arr + 1) ] - 1; 本示例中f=50hz,sys_clk=72Mhz,arr=(2000-1),即: psc = 72Mhz/(50hz * 2000) - 1; psc = 720 |
3. 角度与ccr值换算 | ccr = 500 + 角度值 *(2000/180°) |
-
定时器设置与角度值换算
篇幅有限,具体的代码就不在公众号贴了,杰克认为本编程的最重要的思想:“将角度值[-90°, 90°]在编程上以[0°, 180°]表征”,该思想的转换函数如下:
#define PWM_OUT_CCR (2000)
......
angelTopwmOutCCR(-90); //控制舵机转到-90°
angelTopwmOutCCR(90); //控制舵机转到90°
......
uint8_t angelTopwmOutCCR(int angle)
{
int Compare1 = 500 + ((90 + angle)/180) * PWM_OUT_CCR;
htim1.Instance->CCR1 = Compare1;
}
......
03 文章总结
相对其他运动电机而言,模拟舵机无论是控制电路,还是编码实现都相对简单。舵机在固定转角机构(机器人多关节转动等)普遍使用,因此对于学习电机控制入门、个人兴趣DIY设计而言,学习舵机的知识以及控制原理是非常有必要的。