手撸六足机器人(一)----------PCA9685[16路舵机控制]各寄存器详解及控制源码示例[STM32实现]

手撸六足机器人(一)----------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

扫描二维码关注公众号,回复: 12679056 查看本文章

情况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位的情况:

  1. 上电。
  2. I2C软件重启命令。
  3. 如果MODE2 OCH位为0,向任何PWM寄存器写数据后,I2C总线产生STOP。
  4. 如果MODE2 OCH位为1,向任何通道的所有4个PWM寄存器都写一次数据。

情况4:

若用户在设置SLEEP位之前,人为的关闭所有PWM通道,RESTART位也会被清空。

如果这样做,所有的PWM寄存器的内容都会作废,在重新启用之前需要设置。

人为的关闭所有PWM通道有两个方法:

  1. 最快的方法是向ALL_LED_OFF_H寄存器的4位写1;
  2. 向所有通道的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的舵机控制源码,有需要的留下邮箱,我会定时看看的,欢迎大家一起交流呀哈哈哈哈!

在这里插入图片描述

多模块级联方式比较简单,自行参考百度

猜你喜欢

转载自blog.csdn.net/qq_45704265/article/details/113641269