舵机
舵机(Servo),由直流电机、减速齿轮组、传感器和控制电路组成的一套自动控制系统。其控制方式为PWM控制,通过调节控制信号的占空比来实现舵机转动指定角度。
舵机控制
驱动舵机的PWM信号周期需要为20ms(50HZ),而控制脉宽为0.5~2.5ms,如下图所示。
公式如下
控
制
数
=
占
空
比
∗
脉
冲
数
−
1
控制数=占空比*脉冲数-1
控制数=占空比∗脉冲数−1
占 空 比 = ( 0.5 + a n g l e 90 ) 20 占空比=\frac{(0.5+\frac{angle}{90})}{20} 占空比=20(0.5+90angle)
STM32驱动
在STM32当中通用定时器和高级定时器均可以产PWM信号,且可以独立控制,这里以通用定时器为例,使用CubeMX配置
CubeMX配置
定时器有预分频器和主计数器两个设值。由于定时器的定时公式为
T
i
m
e
r
=
(
P
S
C
+
1
)
(
C
N
T
+
1
)
单
片
机
频
率
Timer=\frac{(PSC+1)(CNT+1)}{单片机频率}
Timer=单片机频率(PSC+1)(CNT+1)
控制舵机需要设置周期为20ms,并且为了能够给PWM调节留出更多的冗余。由此设置PSC=719,CNT=1999。
需要注意的是CH Polarity 用于设置有效电平,具体使用看最后示例。
程序编写
HAL库控制PWM输出首先需要调用下面这个函数来开启。
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1)//前者为对应定时器句柄,后者为响应通道
若要改变PWM脉宽则需要调用下面这个宏定义
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,pwmval);//第一个参数为定时器句柄,第二个为响应通道,最后一个是需要设定的值
示例
使用CubeMx生成工程
假设我们需要25%占空比,即设置设定数为500
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,500);
此时若设定的CH Polarity为Low,表示有效电平为低电平,波形如下图
而设定CH Polarity为High时,表示有效电平为高电平,波形如下图
由于舵机受高电平控制,因此设置的CH Polarity决定我们选用的公式。
当CH Polarity为Low,
控
制
数
=
(
1
−
(
0.5
+
a
n
g
l
e
90
)
20
)
∗
脉
冲
数
−
1
控制数=(1-\frac{(0.5+\frac{angle}{90})}{20})*脉冲数-1
控制数=(1−20(0.5+90angle))∗脉冲数−1
即负占空比×脉冲数
当CH Polarity为High
控
制
数
=
(
0.5
+
a
n
g
l
e
90
)
20
∗
脉
冲
数
−
1
控制数=\frac{(0.5+\frac{angle}{90})}{20}*脉冲数-1
控制数=20(0.5+90angle)∗脉冲数−1
即正占空比×脉冲数
假设需要让舵机转到90°,设定CH Polarity为Low,使用上述公式求得控制数为1849.
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,1849);
文中若有错误,欢迎各位在评论区指正,共同学习!