本帖最后由 电子烂人 于 2025-2-15 10:36 编辑
0.前言
前面把摄像头成功驱动好了。摄像头有了,还需要一个可动的云台来调整方向,才能是一个完整的监视器;
这一期来尝试用硬件PWM驱动舵机。
1.PWM实现原理
树莓派硬件PWM基于专用时钟电路生成精确脉冲信号
硬件PWM的接口很少,只有两个PWM通道:
PWM0:GPIO12(通道0)或 GPIO18(通道0复用)
PWM1:GPIO13(通道1)或 GPIO19(通道1复用)
注意事项:
-
硬件PWM需root权限操作
-
软件PWM频率超过1kHz时可能出现抖动
-
多核负载下建议使用硬件PWM保证时序精度
-
驱动感性负载时应添加保护电路
应用场景对比:
类型 |
精度 |
频率范围 |
CPU占用 |
适用场景 |
硬件PWM |
±5ns |
0-12.5MHz |
<1% |
伺服控制/精密调速 |
软件PWM |
±50μs |
1Hz-1kHz |
10-30% |
LED调光/简单控制 |
故这里先演示一下硬件PWM,之后也会贴出软件PWM的代码。
2.硬件PWM配置
以配置GPIO12为例,检查下/boot/config.txt这个文件里有没有GPIO12的配置:
-
- dtoverlay=pwm-2chan,pin=12,func=4,pin2=13,func2=4
舵机需要的PWM波形比较特殊,在舵机控制中的 PWM 信号的周期=20ms,脉宽(高电平宽度)范围=0.5ms~2.5ms。
以180°的舵机为例,不同占空比的波形控制的角度不同,比如:
0.5ms————0°
1.0ms————45°
1.5ms————90°
2.0ms————135°
2.5ms————180°(有死区无法完全伸展)
图源:网络
典型参数设置流程:
- import pigpio
-
- pi = pigpio.pi()
- if not pi.connected:
- exit()
-
- pi.set_PWM_frequency(12, 50)
- pi.set_PWM_range(12, 200)
- pi.set_PWM_dutycycle(12, 95)
-
- try:
- while True:
- pass
- except KeyboardInterrupt:
- pi.stop()
当硬件资源不足时,可使用RPi.GPIO库的软件实现。软件PWM的代码也贴出,不过推荐在控制舵机的时候还是使用硬件PWM更精准。
- import RPi.GPIO as GPIO
- GPIO.setmode(GPIO.BCM)
- GPIO.setup(17, GPIO.OUT)
- pwm = GPIO.PWM(17, 50)
- pwm.start(25)
晚点把演示的视频贴上来