脉冲宽度调制(PWM)
脉冲宽度调制(Pulse-width modulation,PWM),简称脉宽调制,即对输出波形中的脉冲宽度(高电平持续时间)按照需要进行调整,一般情况下 PWM 输出波形的周期是固定的,通过调整一个周期内高电平时间与低电平时间的比值(占空比)便可以驱动如逆变电路、舵机、电调等,至于为什么可以实现 PWM 对这些电路的控制因本文重点不在这里故不再赘述,感兴趣可以自行学习。
PCA9685
PCA9685 是一个 I2C 总线控制的 16 通道 LED 控制器,每个输出都有 12 位分辨率(4096步)固定频率的独立 PWM 控制器,其工作频率可以从典型的 40Hz 到 1000Hz 编程控制,占空比可从 0% 到 100% 进行调节。PCA9685 的工作电源电压范围为 2.3V 至 5.5V,输入输出均为 5.5V 耐受。虽然 PCA9685 为 LED 控制器,但因为它是通过输出 PWM 进行控制,故也可用于控制舵机等由 PWM 控制的器件。
设备地址
PCA9685 的地址由一个固定的最高位 1
以及 6 个硬件地址引脚构成可编程地址,A0~A5 可通过对其拉低或拉高组成最多有64个可能的可编程地址,其中两个地址为“软件复位(0x02)”与“LED 全调用(0xE0)”不可使用,由于按照 I2C 通信协议,器件地址的最低位必须为对读写控制位,故在实际编程中不考虑最低位,即当 A0~A5 全部接地时,PCA9685 的器件地址为 40h
(0100 0000)。
输出频率
PCA9685 的输出频率由 PRE_SCALE 寄存器控制对时钟进行预分频,寄存器地址为 FEh
,通过配置这个寄存器便可以修改全部 16 个 PWM 输出通道的频率。
$$ 预分频值=round\left ( \frac{时钟频率}{4096\times 输出频率} \right ) $$
例如使用默认的芯片内部时钟频率为 25MHz,对于输出频率为 200Hz,预分频值即 PRE_SCALE 寄存器中的值应为 30。
$$ 预分频值=round\left ( \frac{25MHz}{4096\times 200Hz} \right ) $$
输出波形
PCA9685 的开启时间和 PWM 占空比由 LEDx_ON 与 LEDx_OFF 两个 12 位寄存器独立控制,这两个寄存器将分别储存一个从 0 到 4095 的值, LEDx_ON 储存开启时间的值, LEDx_OFF 储存关闭时间的值,LEDx 引脚 ON 与 OFF 的时间将与一个 12 位的计数器的值进行比较,该计数器将按照分频后的时钟频率由 000h
到 0FFFh
连续累加。
LEDx_ON 与 LEDx_OFF 又由两个 8 位寄存器组成,因为输出分辨率仅为 12 位,故只使用了低 8 位的全部、高 8 位的后 4 位以及高 8 位的第 4 位(从 0 开始)用来控制该输出引脚的全关或全开。下图为全部 LED 控制寄存器(地址从 FAh
到 FDh
)的位描述,其他 16 个引脚(地址从 06h
到 45h
)的 64 个寄存器与之相似。
例如使用 LED0 输出,首先延时 10%,PWM 占空比 20%(LED 开启时间 20%,LED 关闭时间 80%):
- 延时时间=10%=4096X0.1=409.6≈410=19Ah
由于计数器从 0 开始,在 4095 结束,故将其减去 1,延时时间为 199h
,即将 LED0_ON_H 设置为 1h
,LED0_OFF_L 设置为 99h
,其含义为当内部计数器计数数值为 199h
时 LED0 输出高电平。
- 开启时间=20%=4096X0.2=819.2≈819
- 关闭时间=延时时间+开启时间=410+819=1228=4CCh
故 LED0_OFF_H 设置为 4h,LED0_OFF_L 设置为 CCh。
本文仅简单介绍了 PCA9685 的基本用法,更详细的配置描述以及芯片的更多功能请参照数据手册。
驱动代码参考:micropython-adafruit-pca9685、Adafruit_CircuitPython_PCA9685
舵机
舵机有三根线:电源线、地线以及信号线。电源线通常为红色,连接 5V 电源,地线通常为黑色或棕色,信号线通常为黄色或白色,由 PWM 信号控制。
PWM 控制
标准舵机脉冲宽度范围为 1ms 到 2ms,通常发送频率为 50Hz,即 1ms 脉冲为 5% 占空比,2ms 脉冲为 10% 占空比,最重要的就是脉冲的长度必须在 1ms 到 2ms 的范围内,对应舵机从 0° 到 180° 的转动角度。
由于对舵机的教程很多,故这里也不再描述,如果想更加详细了解可以在 Arduino Servo Motors 以及其他教程中进一步学习。
电调 (Hobbywing Quicrun WP 1625)
由于我对电调的了解也并不多,故这里只针对 Hobbywing Quicrun WP 1625 这款电调做简单介绍。
PWM 控制
WP1625 这款电调为有刷电调,可以实现有刷电机的正转、反转以及刹车控制,通过 PWM 信号脉冲时间控制这三种状态以及电机的转速。
与舵机相似,这款电调的控制脉冲宽度为 1ms(全速反转)到 2ms(全速正转)以及 1.5ms(停止),所以这意味着如果使用不同的频率,那么占空比必须调整以获得 1ms 到 2ms 的脉冲。
例如,如果使用 60hz 频率,则 1 ms 脉冲需要 6% (0.05 X 60 / 50 = 0.06
) 的占空比,这里将 PCA9685 的频率设置为 60 hz,所以 1 ms 脉冲是 0.06 X 4096 ≈ 246
,0.09 占空比的停止脉冲是 0.09 X 4096 ≈ 367
,0.12 占空比的全速正转脉冲是 0.12 X 4096 ≈ 492
。
注意:WP1625 为“双向”模式, 即正反转带刹车模式,提供了倒车功能,该模式通常用于日常训练。此模式采用双击
式倒车方式,即油门摇杆在第一次从中点区域推至反向区域时,电机只是刹车,不会产生倒车动作;当油门摇杆快速回到中立点区域并第二次推至反向区域时(即所谓的“双击”),如果此时电机已停止,则产生倒车动作,如果电机未停止,则不会倒车,仍是刹车,需要再次将油门回到中点并推向反向区才会倒车,这样做的目的是防止车辆行驶过程中因多次点刹而造成误倒车。
对电调更加详细的了解可以参考知乎文章 无人机初级篇系列第 7 讲:电调与PWM信号。