PCA9685舵机控制板使用-5. 软件控制

时间:2025-02-08 10:29:36

5.1 初始化 PCA9685
PCA9685 的初始化步骤包括配置 I2C 通信、设置频率、启用 PWM 输出等。
I2C的配置和使用我在前面的博文中说过很多遍了,这里我默认I2C驱动是完好的,直接描述PCA9685的初始化,初始化完成后,MCU通过I2C通信控制舵机驱动板子,完成多路电机控制,解决了部分MCU PWM引脚不足的问题,比如STM32F103C8T这款常见的MCU只有一路标准电机控制PWM口。

#include "stm32f1xx_hal.h"

I2C_HandleTypeDef hi2c1;

#define PCA9685_ADDR 0x40  // I2C 地址

// I2C 写操作
void I2C_Write(uint8_t reg, uint8_t data) {
    HAL_I2C_Mem_Write(&hi2c1, PCA9685_ADDR, reg, I2C_MEMADD_SIZE_8BIT, &data, 1, 1000);
}

// 初始化 PCA9685
void PCA9685_Init(void) {
    I2C_Write(0x00, 0x01);  // 设置模式寄存器,启用设备
    I2C_Write(0x01, 0x04);  // 设置输出驱动
    I2C_Write(0xFE, 0x79);  // 设置预分频器,调整频率(50Hz)
}

5.2 设置 PWM 输出

可以通过修改寄存器来设置 PWM 输出的占空比,从而控制舵机的角度。

// 设置指定通道的 PWM 占空比
void PCA9685_SetPWM(uint8_t channel, uint8_t pulse) {
    uint8_t reg_on = 0x06 + channel * 4;    // 通道的开启时间寄存器
    uint8_t reg_off = 0x08 + channel * 4;   // 通道的关闭时间寄存器
    
    // 设置占空比的低字节和高字节
    I2C_Write(reg_on, 0x00);  // 开始时间(低字节)
    I2C_Write(reg_off, pulse);  // 结束时间(高字节和低字节)
}