stm32+pca9685控制舵机机械臂

1.硬件

PCA9685是一款基于IIC总线通信的12位精度16通道PWM波输出的芯片,该芯片最初由NXP推出时主要面向LED开关调光,但就目前国内的形式来看,好像在被Arduino在舵机控制领域使用的更广泛。
stm32+pca9685控制舵机机械臂_第1张图片
该模块由于主要活跃在Aruino周边,所以在使用Arduino开发其底层驱动库是十分完善的,但对于单片机开发人员就不太友好了,需要自行根据用户手册在单片机上编写底层的驱动。
stm32+pca9685控制舵机机械臂_第2张图片
其地址的分配是通过模块右上方的短接焊盘来确定的,从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,坑爹啊。
stm32+pca9685控制舵机机械臂_第3张图片

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.程序源码

完整工程下载地址
点击此处下载

你可能感兴趣的:(05STM32)