STM32控制16路舵机控制板PCA9685

介绍

PCA9685 是最新的快速模式 Plus(Fm+)系列中的一员。 Fm+器件可以提供更高的频率
(高达 1MHz)和更频繁(densely populated) 的总线操作(高达 4000pF)。
OE引脚一定要至低使能,或者直接接地

网上Arduino的教程很多,商家给的也是Arduino的驱动文件,那怎么在STM32上用呢?

STM32与驱动板的连接

驱动板 STM32
VCC 3.3V
GND GND
SCL I2C_SCL
SDA I2C_SDA
OE  GND(低电平)
V+  不接

V+可以不接而采用电源接线柱使用外部供电,用5V的充电宝即可

由于PCA9685是使用IIC的,那么如何使用IIC通信呢?

STM32CubeMx提供的HAL库就可以实现

那么如何实现PCA9685的驱动文件呢?

其实驱动文件只要实现几个函数即可,IIC读PCA函数,IIC写PCA函数,PCA复位函数,设置PWM频率函数和设置角度函数

驱动文件如下

void PCA9685_Reset()
{
    PCA9685_write(PCA9685_MODE1,0x00);
}

void PCA9685_Go()
{
    PCA9685_Reset();
}
void SetPWMFreq(float freq)
{
    uint32_t prescale,oldmode,newmode;
    float prescaleval;
    freq *= 0.92;  // Correct for overshoot in the frequency setting 
    prescaleval = 25000000;
    prescaleval /= 4096;
    prescaleval /= freq;
    prescaleval -= 1;
    prescale = floor(prescaleval + 0.5);

    oldmode = PCA9685_read(PCA9685_MODE1);
    newmode = (oldmode&0x7F) | 0x10; // sleep
    PCA9685_write(PCA9685_MODE1, newmode); // go to sleep
    PCA9685_write(PCA9685_PRESCALE, prescale); // set the prescaler
    PCA9685_write(PCA9685_MODE1, oldmode);
    PCA9685_write(PCA9685_MODE1, oldmode | 0xa1);

}
void SetPWM(uint32_t num,uint32_t on,uint32_t off)
{
    PCA9685_write(LED0_ON_L+4*num,on);
    PCA9685_write(LED0_ON_H+4*num,on>>8);
    PCA9685_write(LED0_OFF_L+4*num,off);
    PCA9685_write(LED0_OFF_H+4*num,off>>8);
}

uint8_t PCA9685_read(uint8_t startAddress) {
    //Send address to start reading from.
    uint8_t tx[1];
    uint8_t buffer[1];
    tx[0]=startAddress;

    HAL_I2C_Master_Transmit(&hi2c2,PCA9685_adrr, tx,1,10000);
    HAL_I2C_Master_Receive(&hi2c2,PCA9685_adrr,buffer,1,10000);
    return buffer[0];
}

void PCA9685_write(uint8_t startAddress, uint8_t buffer) {
    //Send address to start reading from.
    uint8_t tx[2];
    tx[0]=startAddress;
    tx[1]=buffer;
    HAL_I2C_Master_Transmit(&hi2c2,PCA9685_adrr, tx,2,10000);


}

在main函数中中使用初始化函数然后设置频率之后就可以通过SetPWM控制舵机的转动了

你可能感兴趣的:(物联网系统,STM32)