为什么需要PWM扩展板
Arduino UNO只有6个硬件PWM引脚,做一个6自由度机械臂刚好够用。但如果你要做一个12自由度机器狗,或者需要控制8个以上舵机的云台系统,6个PWM引脚就不够了。PCA9685是Adafruit出品的一款16路12位PWM驱动板,通过I2C接口和Arduino通信,一片就能控制16路舵机。多片还能级联,最多可以扩展到992路。
I2C接线和供电
PCA9685的I2C接线和所有I2C设备一样:VCC接Arduino 5V,GND接GND,SDA接A4,SCL接A5。默认I2C地址是0x40,每块板背面有6个地址跳线,可以改到0x41到0x7F之间的任意地址。最关键的是供电:舵机需要单独的6V电源(V+端子),不要和Arduino共用5V。一个SG90舵机空载电流200mA,堵转电流800mA,4个同时动就是3A多,Arduino的5V电源根本扛不住。用6V/10A的开关电源给PCA9685的V+供电,基本能覆盖大多数项目。
频率和脉冲宽度
标准舵机的PWM频率是50Hz(周期20ms),脉宽0.5ms到2.5ms对应0到180度。PCA9685的12位分辨率意味着每个PWM周期被分成4096个步进,50Hz下每个步进约5微秒。对于标准舵机来说,5微秒的精度大约是0.9度的角度分辨率,完全够用。注意PCA9685默认频率不是50Hz,需要在初始化时调用setPWMFreq(50)设置。MG996R这类大扭矩舵机的频率可能要求40到60Hz,设置时参考规格书。
角度控制的代码逻辑
控制代码的核心是一个映射函数:把0到180度映射到对应的PWM值。Adafruit_PWMServoDriver库提供了setPWM(通道, 0, 脉宽)方法。脉宽的计算方式是:50Hz下,4096×0.5ms/20ms = 102 对应最小脉宽(0度),4096×2.5ms/20ms = 512 对应最大脉宽(180度)。所以角度映射公式就是:脉宽 = map(角度, 0, 180, 102, 512)。把这套逻辑封装成setAngle(channel, angle)函数,调用时直接传角度值就行。
机械臂项目里的注意事项
多路舵机同时动作时,瞬时电流会很大。如果你的项目里有16个舵机需要同时运动,电源至少需要6V/20A。另外,上电瞬间所有舵机会回到中位(90度),如果你的机械臂零点不在中位,需要在上电前先断电摆好位置,或者在代码里做零点偏移。还有一种做法是在代码开头把所有通道设到零位,避免上电时机械臂突然乱动。










建议加个电流检测模块,过流保护很重要
级联方案做多足机器人很合适,四片64路舵机
上电回中位这个问题在做机械臂时确实头疼
12位分辨率0.9度的精度对机械臂来说绰绰有余
16路同时动电流确实吓人,之前没加独立电源差点烧了板子