主控(PCA9685)
介绍
本模块使用PCA9685芯片作为核心,这是一款基于 I²C 总线的 16 通道、12 位 PWM 控制器,可以用于控制舵机、LED等需要 PWM 信号控制的设备。每个通道都可以独立设置 PWM 输出的频率和占空比。
寄存器
命令字节
命令字节是在写入传输过程中地址字节后的第一个字节,用作指针,以确定接下来写入或读取哪个寄存器。
| 命令 | 寄存器 |
|---|---|
| 0x00 | 模式寄存器1 |
| 0x01 | 模式寄存器2 |
| ... | ... |
| 0x06 | LED0 开启低字节 |
| 0x07 | LED0 开启高字节 |
| 0x08 | LED0 关闭低字节 |
| 0x09 | LED0 关闭高字节 |
| 0x0a ~ 0x45 | LED1 ~ LED15 |
| ... | ... |
| 0xFE | PWM输出预分频器频率 |
寄存器0x00:模式寄存器1 (MODE1)
该寄存器用于控制 PCA9685 的基本工作模式。
| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| 符号 | RESTART | EXTCLK | AI | SLEEP | SUB1 | SUB2 | SUB3 | ALLCALL |
| 默认值 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 |
字段说明:
- RESTART (Bit 7): 重启标志位
- EXTCLK (Bit 6): 使用外部时钟输入
- Auto-Increment(AI) (Bit 5): 自动增加寄存器地址
- SLEEP (Bit 4): 低功耗模式,关闭内部振荡器
- SUB1 (Bit 3): 响应子地址1
- SUB2 (Bit 2): 响应子地址2
- SUB3 (Bit 1): 响应子地址3
- ALLCALL (Bit 0): 响应全部调用地址
寄存器0x01:模式寄存器2 (MODE2)
该寄存器用于配置输出特性。
| Bit | 7 ~ 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|
| 符号 | 保留位 | INVRT | OCH | OUTDRV | OUTNE1 | OUTNE0 |
| 默认值 | 0 | 1 | 0 | 0 | 0 | 0 |
字段说明:
- 保留位 (Bit 7 ~ 5)
- INVRT (Bit 4): 输出逻辑反转
- OCH (Bit 3): 输出改变时序
- OUTDRV (Bit 2): 输出开漏或推挽结构
- OUTNE[1:0] (Bits 1-0): 输出未启用状态
寄存器0xFE:预分频寄存器 (PRE_SCALE)
该寄存器用于设置 PWM 输出频率。
| Bit | 7-0 |
|---|---|
| 符号 | PRE_SCALE |
| 默认值 | 0x1E |
计算公式:
c++
// 内置振荡器时钟
int oscillator_clock = 25000000;
int prescale = round(oscillator_clock / (4096 * PWM频率)) - 1注:PCA9685 内部振荡器频率典型值为 25MHz。
寄存器0x06~0x45:LEDn_ON 和 LEDn_OFF控制寄存器
n表示对应的通道
每个 PWM 通道都有两个 12 位寄存器控制开启和关闭时刻:
- LEDn_ON_L (地址 0x06 + 4*n): LED n 开启时间低字节
- LEDn_ON_H (地址 0x07 + 4*n): LED n 开启时间高字节 (只使用低 4 位)
- LEDn_OFF_L (地址 0x08 + 4*n): LED n 关闭时间低字节
- LEDn_OFF_H (地址 0x09 + 4*n): LED n 关闭时间高字节 (只使用低 4 位)
占空比控制
通过设置 LEDn_ON 和 LEDn_OFF 的值来控制占空比:
- 当 ON = 0 且 OFF = 4096 时,输出始终为高电平
- 当 ON = 4096 且 OFF = 0 时,输出始终为低电平
- 当 ON = 0 且 OFF = 2048 时,输出占空比为 50%