手撸六足机器人(一)----------PCA9685[16路舵机控制]各寄存器详解及控制源码示例[STM32实现]
机器人外观
模块外观
芯片引脚
I2C通信----内部寄存器
内部地址(hex) | 名称 | 功能 |
---|---|---|
Harry Potter | Gryffindor | 90 |
Hermione Granger | Gryffindor | 100 |
Draco Malfoy | Slytherin | 90 |
00 | MODE1 | 设置寄存器1 |
01 | MODE2 | 设置寄存器2 |
02 | SUBADR1 | i2c-bus subaddress1 |
03 | SUBADR2 | i2c-bus subaddress2 |
04 | SUBADR3 | i2c-bus subaddress3 |
05 | ALLCALLADR | |
06 | LED0_ON_L | |
07 | LED0_ON_H | |
08 | LED0_OFF_L | |
09 | LED0_OFF_H | |
… | … | … |
0x06 + 4*X | LEDX_ON_L | |
0x06 + 4*X + 1 | LEDX_ON_H | |
0x06 + 4*X + 2 | LEDX_OFF_L | |
0x06 + 4*X + 3 | LEDX_OFF_H | |
… | … | … 上面共16路通道 |
FA | ALL_LED_ON_L | |
FB | ALL_LED_ON_H | |
FC | ALL_LED_OFF_L | |
FD | ALL_LED_OFF_H | |
FE | PRE_SCALE 控制周期的寄存器 | |
FF | TestMode |
三种寄存器:模式选择、通道配置、频率设置 、总线子地址
模式选择: MODE1、MODE2
通道配置:**LEDx_ON_ (L/H),LEDx_OFF_(L/H) **
频率设置:PRE_SCALE
总线子地址: SUBADR1,SUBADR2,SUBADR3
MODE1寄存器详解
位 | 名称 | 功能 |
---|---|---|
D7 | RESTART | 重启位 |
D6 | EXTCLOCK | 时钟位 |
D5 | AI | 内部地址自增位 |
D4 | SLEEP | 睡眠位 |
D3 | SUB1 | |
D2 | SUB2 | |
D1 | SUB3 | |
D0 | ALLCALL | 响应地址位 |
D7:RESTART重启位
软件置1,硬件自动置0
备注:在向RESTART位写1之前,SLEEP位一定要至少持续500us为0
情况1:
若PCA9685处于工作状态,没有关闭PWM通道的情况下,用户决定让芯片进入SLEEP状态
那么在最后一个PWM周期结束后,RESTART位才会被置1,时钟停止后,各PWM通道控制寄存器内容会被保留。
情况2:
接情况1,重启之前保留的PWM设置
按如下步骤进行:
1.读取MODE1寄存器内容。
2.检查第7位(RESTART)是否是1--------如果是,清空D4(SLEEP写0),等待500us使时钟稳定。
3.写MODE1的D7写1,所有的PWM通道将会重新工作,且RESTART位会清空。
情况3:
以下情况均会清空D7
其他可以清空RESTART位的情况:
- 上电。
- I2C软件重启命令。
- 如果MODE2 OCH位为0,向任何PWM寄存器写数据后,I2C总线产生STOP。
- 如果MODE2 OCH位为1,向任何通道的所有4个PWM寄存器都写一次数据。
情况4:
若用户在设置SLEEP位之前,人为的关闭所有PWM通道,RESTART位也会被清空。
如果这样做,所有的PWM寄存器的内容都会作废,在重新启用之前需要设置。
人为的关闭所有PWM通道有两个方法:
- 最快的方法是向ALL_LED_OFF_H寄存器的4位写1;
- 向所有通道的LEDn_OFF_H寄存器的4位写1
D6:EXTCLOCK时钟位
软件写入0/1
0-使用内部时钟(25MHz) 1-使用外部时钟引脚的时钟。
修改此位前,一定要先SLEEP,再修改此位(此时SLEEP位仍然写1),再退出SLEEP。
D5:AI内部地址自增位
软件写入0/1
0-内部地址读写后不自动增加 1-内部地址读写后自动增加。
一般I2C设备在对从机读写后内部地址都会自动增加,这个芯片可以手动设置是否自动增加
D4:SLEEP睡眠位
软件写入0/1
0-退出SLEEP模式 1-进入SLEEP模式。
0---------退出sleep模式后,最多等500us后即可产生稳定的时钟信号。
1---------进入sleep模式后,时钟会关闭。
注意:修改时钟源寄存器EXTCLOCK和周期寄存器PRE_SCALE之前必须先进入sleep模式
D0:ALLCALL响应地址位
0-不响应0x70通用i2c地址。1-响应0x70通用i2c地址。
这芯片除了可以通过A5:A0自定义i2c地址外,还有一个通用i2c地址0x70
此寄存器可以控制是否响应这个通用地址。
注意:这个寄存器的设置好像掉电会保存的
MODE2寄存器详解
位 | 名称 | 功能 |
---|---|---|
D7 | / | / |
D6 | / | / |
D5 | / | / |
D4 | INVRT | 输出逻辑位 |
D3 | OCH | 装载位 |
D2 | OUTDRV | 输出方式位 |
D[1:0] | OUTNE | 输出响应位 |
D4:INVRT输出逻辑位
软件置1/0
1------ 输出逻辑状态反转
0------ 输出逻辑状态不反转
D3:OCH装载位
软件置1/0
0------STOP信号时装载
1------ACK信号时装载
D2:OUTDRV装载位
软件置1/0
1------开漏输出
0------推挽输出
D[1:0]:输出响应位
软件置1/0
00------当【OE非】=1时,各路输出为0
01、10------当【OE非】=1时,当OUTDRV=1时各路输出为1,当OUTDRV=0时各路输出为高阻
11------当【OE非】=1时,各路输出为高阻
PRE_SCALE寄存器详解
PWM频率
osc_clock是时钟
update_rate是频率
注意:实际应用中发现有误差,需要加入校准,要把udpate_rate乘以0.915。
SG90舵机控制
注意
模块使用时只需接入Vcc,GND,SCL、SDA即可
MODE1写入0x01,MODE2写入0x04 即能正常使用
文章内容取自芯片手册(做了个翻译罢了哈哈哈)
才疏学浅,只能提供一个F407的舵机控制源码,有需要的留下邮箱,我会定时看看的,欢迎大家一起交流呀哈哈哈哈!
多模块级联方式比较简单,自行参考百度