手擼六足機器人(一)----------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的舵機控制原始碼,有需要的留下郵箱,我會定時看看的,歡迎大家一起交流呀哈哈哈哈!

多模塊級聯方式比較簡單,自行參考百度
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/256867.html
標籤:其他
下一篇:ESP32開發 0.windows Vscode開發環境搭建,基于esp-idf-V4.2 | Cmake | Vscode插件
