stm32+pca9685控制舵机机械臂
程序员文章站
2024-02-23 22:39:04
...
1.硬件
PCA9685是一款基于IIC总线通信的12位精度16通道PWM波输出的芯片,该芯片最初由NXP推出时主要面向LED开关调光,但就目前国内的形式来看,好像在被Arduino在舵机控制领域使用的更广泛。
该模块由于主要活跃在Aruino周边,所以在使用Arduino开发其底层驱动库是十分完善的,但对于单片机开发人员就不太友好了,需要自行根据用户手册在单片机上编写底层的驱动。
其地址的分配是通过模块右上方的短接焊盘来确定的,从A0-A5表示地址的最低位到最高位,也就是最多可级联2^5=32个模块,地址为: 1+A5+A4+A3+A2+A1+A0+rw。如果不用短接的话Ax=0;短接的话Ax=1;rw为写的话rw=0;rw为读的话rw=1;所以写入数据不做短接则地址应该为1000 0000 =0x80,许多人包括淘宝商家误以为默认地址是0x40,坑爹啊。
2.IIC通信
SCL接PH4,SDA接PH5,VCC接3.3V,GND接,V+单纯只是供电,在驱动大功率舵机时不接,但是外接电源的两个端口要接上正负极,否则无法供电。
3.程序
首先要有IIC通信的底层驱动文件,同时要有pca9685的驱动文件,pca9685的驱动可以在pcf8574的驱动文件的基础上进行修改,关键在于以下两个函数:
void setPWM(u8 num, u16 on, u16 off)
void setPWMFreq(u8 freq)
注意用u8,不要用unsigned int。
同时有个地方要注意:
IIC_Send_Byte(PCA9685_adrr|0X01); //发送器件地址+读命令
这里是上面提到的r/w,既然这里是读地址,必然是0X01。
主函数中:
PCA9685_write(PCA9685_MODE1,0x0);
setPWMFreq(50);
setPWM(0, 0, 220);
delay_ms(2000);
setPWM(2, 0,110);
delay_ms(2000);
setPWM(1, 0,130);
delay_ms(2000);
setPWM(1, 0,150);
delay_ms(2000);
setPWM(1, 0,175);
delay_ms(2000);
setPWM(1, 0,195);
delay_ms(2000);
对于180度的舵机,只能通过延时和细分角度来防止速度过快造成冲击过大的现象。
4.程序源码
完整工程下载地址
点击此处下载