PCA9685舵机控制板使用

1. 概述

PCA9685 是一款由 NXP 半导体公司生产的 16 通道 PWM 驱动器,广泛应用于多个舵机、LED 灯带控制等场景。它通过 I2C 总线与主控芯片(如 STM32)通信,可以高效地控制多个舵机的运动和多通道 PWM 输出。该模块适用于多舵机控制、机器人、电动玩具、遥控模型等应用。

使用舵机驱动板,可以解决有些MCU PWM口不足的问题,同时降低MCU的CPU利用率,提升CPU性能,毕竟电机的驱动工作交给了PCA9685芯片。

2. 主要特点

【1】I2C 接口:通过 I2C 总线与主控芯片(如 STM32)进行通信,支持多达 62 个设备通过 I2C 总线连接。

【2】16 通道 PWM 输出:每个通道可以独立控制,适用于 16 个舵机或其他 PWM 控制设备。

【3】可调 PWM 输出频率:频率范围从 24Hz 到 1526Hz,用户可以根据需要调整。

【4】集成电流限制器:内置电流限制功能,避免过流损坏设备。

【5】低功耗设计:在低功耗模式下工作,适合嵌入式系统。

3. 硬件接口说明

3.1 引脚定义

引脚 描述 连接说明
VCC 电源输入(3.3V 或 5V) 连接到主控芯片的电源
V+ 电源输入(舵机电源 5V、6V 或 7.4V) 连接到舵机电源(一般不接,使用图片上的绿色端子供电)
SDA I2C 数据线 连接到主控的 SDA 引脚
SCL I2C 时钟线 连接到主控的 SCL 引脚
GND 地线 连接到主控地线
OE 输出使能(控制是否输出 PWM 信号) 默认接地,启用 PWM 输出

3.2 舵机连接

PCA9685 支持 16 个独立的 PWM 通道,每个通道连接一个舵机或其他 PWM 控制设备。每个通道有三个引脚:

V+:连接到舵机电源。

PWM 输出:用于输出 PWM 信号,控制舵机位置。

GND:连接到舵机地线。

3.3 电源要求

VCC:主控电源,一般为 3.3V 或 5V,取决于 I2C 总线的工作电压。

V+:舵机电源,一般为 5V、6V 或 7.4V,根据所使用的舵机型号进行选择。

注意:实际为了接线方便,V+口一般空出,使用图片上的绿色段子进行舵机的电源供电。

4. I2C 通信协议

PCA9685 通过 I2C 接口与主控芯片通信。每个 PCA9685 模块都有一个 7 位 I2C 地址,默认值为 0x40,可以通过地址选择引脚修改。

4.1 I2C 操作

PCA9685 支持标准的 I2C 写/读操作。主控芯片通过发送命令来配置 PCA9685,设置 PWM 信号的频率和占空比。

  • 地址选择 :PCA9685 默认 I2C 地址为 0x40,可以通过接地址引脚选择其他地址,最大支持 62 个设备。
  • 寄存器操作:通过 I2C 总线访问 PCA9685 的寄存器,设置 PWM 输出参数。

4.2 常用寄存器

寄存器地址 寄存器名称 描述
0x00 MODE1 控制寄存器,配置 PCA9685 的基本工作模式
0x01 MODE2 输出控制寄存器,用于设置输出的驱动方式
0xFE PRESCALE 设置 PWM 输出频率
0x06 LED0_ON_L 通道 0 PWM 输出的开启时间低字节
0x07 LED0_ON_H 通道 0 PWM 输出的开启时间高字节
0x08 LED0_OFF_L 通道 0 PWM 输出的关闭时间低字节
0x09 LED0_OFF_H 通道 0 PWM 输出的关闭时间高字节

5. 软件控制

5.1 初始化 PCA9685

PCA9685 的初始化步骤包括配置 I2C 通信、设置频率、启用 PWM 输出等。

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

c 复制代码
#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 输出的占空比,从而控制舵机的角度。

c 复制代码
// 设置指定通道的 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);  // 结束时间(高字节和低字节)
}
相关推荐
Ch_Jany几秒前
C51 Proteus仿真实验17:数码管显示4×4键盘矩阵按键
单片机·51单片机·proteus
蓝白小手套1 小时前
“消失的中断“
单片机·嵌入式硬件·bug
shixiexunnie1 小时前
从点灯开始的51单片机生活
单片机·嵌入式硬件·学习·51单片机
电子艾号哲1 小时前
STC89C52单片机学习——第17节: [7-1]定时器
单片机·嵌入式硬件·学习
傍晚冰川4 小时前
【STM32】USART串口协议&串口外设-学习笔记
笔记·科技·stm32·单片机·嵌入式硬件·学习
触角0101000111 小时前
STM32 RS232通信开发全解析 | 零基础入门STM32第五十九步
驱动开发·stm32·单片机·嵌入式硬件·物联网
绿算技术12 小时前
MCU的工作原理:嵌入式系统的控制核心
单片机·嵌入式硬件
FreakStudio12 小时前
三分钟教学:手把手教你实现Arduino发布第三方库
单片机·mcu·github·嵌入式·arduino·开发工具·电子diy·电子计算机
dujunqiu12 小时前
UDS中多帧传输详解(配合实例)--ISO 15765-2(网络层服务)
嵌入式硬件
智木芯语13 小时前
【09】单片机编程核心技巧:变量赋值,从定义到存储的底层逻辑
单片机·嵌入式硬件·嵌入式·#stm32·#stc8