跳转到内容

主控(PCA9685)

介绍

本模块使用PCA9685芯片作为核心,这是一款基于 I²C 总线的 16 通道、12 位 PWM 控制器,可以用于控制舵机、LED等需要 PWM 信号控制的设备。每个通道都可以独立设置 PWM 输出的频率和占空比。

官方数据手册 https://www.nxp.com/docs/en/data-sheet/PCA9685.pdf

寄存器

命令字节

命令字节是在写入传输过程中地址字节后的第一个字节,用作指针,以确定接下来写入或读取哪个寄存器。

命令寄存器
0x00模式寄存器1
0x01模式寄存器2
......
0x06LED0 开启低字节
0x07LED0 开启高字节
0x08LED0 关闭低字节
0x09LED0 关闭高字节
0x0a ~ 0x45LED1 ~ LED15
......
0xFEPWM输出预分频器频率

寄存器0x00:模式寄存器1 (MODE1)

该寄存器用于控制 PCA9685 的基本工作模式。

Bit76543210
符号RESTARTEXTCLKAISLEEPSUB1SUB2SUB3ALLCALL
默认值00010001

字段说明:

  • 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)

该寄存器用于配置输出特性。

Bit7 ~ 543210
符号保留位INVRTOCHOUTDRVOUTNE1OUTNE0
默认值010000

字段说明:

  • 保留位 (Bit 7 ~ 5)
  • INVRT (Bit 4): 输出逻辑反转
  • OCH (Bit 3): 输出改变时序
  • OUTDRV (Bit 2): 输出开漏或推挽结构
  • OUTNE[1:0] (Bits 1-0): 输出未启用状态

寄存器0xFE:预分频寄存器 (PRE_SCALE)

该寄存器用于设置 PWM 输出频率。

Bit7-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%