1. OpenMV与PWM的基础知识
第一次接触OpenMV的PWM功能时,我完全被它的简洁性震惊了。作为一个经常用STM32做项目的开发者,OpenMV的PWM配置简直就像打开了新世界的大门。你可能不知道,OpenMV本质上就是一颗STM32芯片,但它把很多底层操作都封装成了Python接口,这让硬件控制变得异常简单。
PWM(脉冲宽度调制)是控制舵机最常用的方式。简单来说,PWM就是通过调节高电平在一个周期内的占比(占空比)来控制设备。对于常见的舵机来说,它们需要50Hz的PWM信号(周期20ms),其中脉冲宽度在0.5ms到2.5ms之间对应着0°到180°的旋转角度。我在调试时发现,如果频率偏差超过±5%,舵机就可能出现抖动或无法正常工作的问题。
OpenMV有9个GPIO引脚,其中6个可以输出PWM。这6个引脚分布在不同的定时器上:
- 定时器2:P4、P5、P6
- 定时器4:P7、P8、P9
- 定时器1:保留给摄像头使用,不能动
在实际项目中,我强烈建议先规划好引脚用途。比如P4和P5通常用于串口通信,如果要用作PWM输出,就得考虑是否会影响其他功能。我曾经在一个项目中同时使用串口和PWM,结果因为引脚冲突调试了大半天。
2. 四轴机械臂的PWM资源分配
去年做一个垃圾分类项目时,我需要用OpenMV控制一个四轴机械臂抓取不同颜色的物体。这个经历让我深刻理解了PWM资源分配的重要性。四轴机械臂意味着需要四个独立的PWM通道,而OpenMV正好可以满足这个需求。
具体分配方案我通常这样安排:
- 定时器4的三个通道(P7、P8、P9)控制机械臂的三个关节
- 定时器2的一个通道(P6)控制末端执行器(夹子)
- P4和P5保留给串口通信,用于和主控交换数据
这里有个坑我踩过:定时器1绝对不能碰!官方文档明确说明它用于摄像头驱动。有次我不小心配置了定时器1,结果不仅PWM不工作,连图像采集都出问题了。错误提示也不明显,排查了好久才发现问题所在。
如果你需要控制多于四个舵机,我有两个建议:
- 考虑使用PCA9685这类PWM扩展芯片
- 或者改用主控+OpenMV的方案,让主控专门负责舵机控制
3. 完整代码实现与解析
下面是我在实际项目中验证过的四轴机械臂控制代码,包含详细的注释:
import time from pyb import Pin, Timer # 初始化两个定时器,频率设为50Hz(舵机标准频率) tim4 = Timer(4, freq=50) # 控制机械臂三个关节 tim2 = Timer(2, freq=50) # 控制末端执行器 # 配置定时器4的三个通道 # 关节1(底座旋转):初始位置90度(1.5ms脉冲宽度) tim4.channel(1, Timer.PWM, pin=Pin("P7"), pulse_width_percent=7.5) # 关节2(大臂):初始位置90度 tim4.channel(2, Timer.PWM, pin=Pin("P8"), pulse_width_percent=7.5) # 关节3(小臂):初始位置90度 tim4.channel(3, Timer.PWM, pin=Pin("P9"), pulse_width_percent=7.5) # 配置定时器2的一个通道 # 末端执行器(夹子):初始位置闭合 tim2.channel(1, Timer.PWM, pin=Pin("P6"), pulse_width_percent=5) def set_servo_angle(timer, channel, angle): """通用舵机角度设置函数""" pulse_width = 2.5 + 10 * angle / 180 # 将角度转换为百分比 timer.channel(channel, pulse_width_percent=pulse_width) # 示例:控制机械臂运动 set_servo_angle(tim4, 1, 45) # 底座转到45度位置 time.sleep_ms(500) # 等待舵机到位 set_servo_angle(tim2, 1, 10) # 打开夹子代码中几个关键点需要注意:
pulse_width_percent参数将占空比设置为百分比形式,7.5%对应1.5ms脉冲宽度(90度位置)- 我封装了一个
set_servo_angle函数,可以直接用角度值控制舵机,比直接操作占空比更直观 - 舵机运动需要时间,记得在关键动作之间添加适当的延时
4. 调试技巧与常见问题
调试PWM控制时,我总结出几个非常实用的技巧:
示波器是必备工具:没有示波器的情况下调试PWM就像闭着眼睛走路。通过示波器可以确认:
- 实际输出的频率是否准确(应该是50Hz±1%)
- 脉冲宽度是否与代码设定一致
- 信号是否干净(有无毛刺)
电源问题要注意:
- 舵机在运动时会产生较大的电流波动
- 建议给OpenMV和舵机使用独立的电源
- 如果必须共用一个电源,一定要加足够大的电容(我通常用470μF以上)
常见问题排查:
舵机无反应:
- 检查接线是否正确(信号线接对了没)
- 用万用表测量电源电压(应该在4.8-6V之间)
- 确认没有误用定时器1
舵机抖动或发热:
- 检查PWM频率是否准确
- 确保机械结构没有卡死
- 尝试降低电源电压(有些舵机在6V时会有问题)
控制不精确:
- 不同品牌的舵机中位脉冲宽度可能有差异
- 建议对每个舵机单独校准
- 考虑使用PID算法提高控制精度
一个实用的调试技巧是先用代码让舵机在0度和180度之间缓慢摆动,观察运动是否平滑。这样可以快速发现机械结构或控制信号的问题。