舵机PWM占空比计算

今年参与的实验室项目里,很多事情都离不开舵机,平时虽然也做一些硬件,但控制方面还不是那么熟悉。话不多说,直接进入主题。

在一个舵机驱动里面有这样一段代码:

1
2
var duty = 0.025 + 0.1 * angle / 270;
this._pwm.setDuty(duty);

这段代码适用于一个270度的舵机,但如果实际使用的是一款180度范围的舵机,很显然这个公式:

无法使用了。

上述公式的修改可以看成是,求解一个一元线性函数的两个参数。

通过分析可得

即 $a$是舵机在零度时的占空比

即每一度所对应的占空比差。

可以使用联立等式,求解方程组的方式来计算。


2020年8月28日更新:

我从后台发现不少朋友对这个问题比较关注,而我也确实发现有些关于舵机PWM控制的文章讲的不是很明白。

上面的数学公式可能不是很明确,在此继续补充一下,对于模拟舵机来说,PWM波的频率一般是$50Hz$,即周期为$20ms$,也有频率更高的舵机,输入频率低一般不会造成什么太大问题,表现为性能差点,但是频率高于设计工作频率容易烧舵机;模拟舵机的正常工作需要不断输入PWM波信号,数字舵机有所不同,下段将说明。此时就需要关注PWM波的占空比了,占空比和舵机旋转角度一般为线性关系(非严格),此时就可以用上文中的方法计算出公式中的两个参数,可以通过测试的方式,也可以参考厂家给出的参数。下面给出算例

1
2
3
若给出条件:模拟舵机、8ms信号为-90°(最小角度)、12ms信号为0°,最大角度+90°。
则可以得出每一度对应的信号脉宽为4ms/90,对应占空比为4/90/20,为1/450
0度占空比为12ms/20,为0.6

上述算例仅为一个例子,计算方法和最终代码公式形式可以有所不同,具体数字根据实际厂家参数进行带入。

但对数字舵机来说,通常厂家资料不以占空比和频率来描述,因为数字舵机和模拟舵机最大的不同是,数字舵机的控制只需输入一次脉冲就可以完成旋转操作,不需要持续的输入信号。一般描述为脉冲宽度 $x(us)$,常用值一般是在中位$900us$(仅作举例)。在此我不直接给出算例,仅简单谈一下我的处理方法,可以用单次触发也可以持续触发方式输出一个高频的信号,用这个定时器构造出一个符合实际控制需求的脉宽,无需过度关注频率。

无论采取哪种方式,均不要输入超出动作范围的信号,不然会烧舵机。

如果这篇文章对您有帮助,欢迎您在下方留言,谢谢。