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);  // 结束时间(高字节和低字节)
}
相关推荐
hahaha601612 分钟前
RK3588和FPGA桥片之间IO电平信号概率性不能通信原因
单片机·嵌入式硬件·fpga开发
茯苓gao3 小时前
STM32G4 电机外设篇(三) TIM1 发波 和 ADC COMP DAC级联
stm32·单片机·嵌入式硬件
君鼎4 小时前
STM32——CAN总线
stm32·单片机·嵌入式硬件
阿川!4 小时前
嵌入式软件--stm32 DAY 8.5 基础复习总结
stm32·单片机·嵌入式硬件
小猪写代码7 小时前
STM32中,如何理解看门狗
stm32·单片机·嵌入式硬件
Lester_11017 小时前
嵌入式学习笔记 - STM32 HAL库以及标准库内核以及外设头文件区别问题
笔记·stm32·单片机·学习
小智学长 | 嵌入式8 小时前
SOC-ESP32S3部分:23-文件系统
单片机·esp32
不脱发的程序猿9 小时前
MCU如何从向量表到中断服务
单片机·嵌入式硬件
仰泳之鹅13 小时前
【STM32F1标准库】理论——定时器/计数器中断
stm32·单片机·嵌入式硬件
Ronin-Lotus13 小时前
嵌入式硬件篇---蜂鸣器
嵌入式硬件·有源蜂鸣器·无源蜂鸣器