JetBot 小車使用的電機(jī)驅(qū)動(dòng)模塊上用了 PCA9685 擴(kuò)展 I/O ,一邊與主控通過 I2C 總線通信,另一邊連接 TB6612 馬達(dá)驅(qū)動(dòng)芯片。
本篇 Sugar 就來有根有據(jù)地說一說 PCA9685 的使用,以及 RT-Thread PCA9685 驅(qū)動(dòng)組件。
硬件特點(diǎn)
1、每路 12 位分辨率(4096 級(jí))的 PWM;
2、最多 16 路 PWM 輸出,所有路 PWM 頻率統(tǒng)一,每路占空比可以獨(dú)立控制;
3、I2C 通信方式;
4、支持 2.3V~5.5V 電壓,邏輯電平 3.3V;
5、復(fù)位方式:上電復(fù)位、軟件復(fù)位。
用于舵機(jī)控制的 PWM
一、明確控制信號(hào)
1、用于舵機(jī)控制的 PWM 頻率是 50Hz(周期 20000us)
2、對(duì)于 12 位分辨率而言,時(shí)間控制精度(即:時(shí)間分辨率)就是
3、舵機(jī)的控制脈寬是0.5ms ~ 2.5ms,時(shí)間伸縮范圍是 2000us
4、伸縮范圍在 4.88us 時(shí)間分辨率下可以分成近 410 份。
5、時(shí)間伸縮范圍 2000us 對(duì)應(yīng)舵機(jī)轉(zhuǎn)動(dòng)范圍 0~180 度,因此舵機(jī)的角度分辨率約為 0.439 度
二、在 PCA9685 手冊(cè)里查芯片用法
1、芯片長什么樣
2、引腳功能
3、I2C 地址
地址引腳由 A0 ~ A5 組成,因此最多可以有 64 個(gè)地址。由于芯片本身保留 All Call 7 位地址 0xE0 以及 Software Reset 7位地址 0x06,所以有 62 個(gè)地址可用。
在默認(rèn)情況下(即:A0 ~ A5 全部接地),其 7 位地址為 0x40。
4、目標(biāo)寄存器
(1) MODE1 寄存器,地址0x00,可讀、可寫。
(2) MODE2 寄存器,地址0x01,可讀、可寫。
(3) 每路 PWM 有 4 個(gè) 8 位控制寄存器,地址見 datasheet,可讀、可寫。
4 個(gè) 8 位寄存器在手冊(cè)上說成:2 路 12 位寄存器。2 個(gè) 12 位寄存器分別控制該路輸出的高、低電平時(shí)間,最大數(shù)值是 4095。
根據(jù)下面的 Example 1 不難了解到這 2 個(gè) 12 位寄存器的意思是:每個(gè)周期從第幾個(gè) count 開始置 1,則 LEDx_ON 寄存器寫幾(十六進(jìn)制形式);每個(gè)周期從第幾個(gè) count 開始清 0,則 LEDx_OFF 寄存器寫幾。
下圖的 4 個(gè) example 表示了一般情況下 2 個(gè) 12 位寄存器設(shè)置情況與輸出的關(guān)系。
下圖的 4 個(gè) example 表示了 ON 寄存器值 《 OFF 寄存器值情況下的輸出。
下圖的 4 個(gè) example 表示了 ON 寄存器值 》 OFF 寄存器值情況下的輸出。
(4) PWM 頻率設(shè)置寄存器 PRE_SCALE,地址0xFE,可讀、可寫。
芯片內(nèi)置 25MHz 的晶振,update_rate 是以 Hz 為單位的頻率值。因此,對(duì)于 50Hz 的 PWM 來講此寄存器應(yīng)設(shè)置為 121。
RT-Thread 的 PCA9685 驅(qū)動(dòng)組件
硬件連接如上圖,Sugar 使用了最常見的 PCA9658 舵機(jī)控制模塊,接上邏輯分析儀看數(shù)據(jù)。
一、第 1 段
展開第一段通信內(nèi)容,如下圖:
上圖黃色框中“向 40 號(hào)地址寫兩個(gè) 0 ”的意思是:向地址為 40 的設(shè)備地址為 0 的寄存器寫入數(shù)據(jù) 0。
相應(yīng)的,后面藍(lán)色框就解讀為:讀取地址為 40 的設(shè)備地址為 0 的寄存器值,設(shè)備反回目標(biāo)寄存器里的數(shù)據(jù)值為 0。
下面到代碼里去找這段通信的相關(guān)內(nèi)容,如下:
二、第 2 段
根據(jù) PCA9685 的 datasheet 所述,設(shè)置 PWM 輸出頻率的時(shí)候要先進(jìn)入 SLEEP 模式。并且從 SLEEP 模式重啟的流程是在 datasheet 里指定的。
在 RT-Thread 的 PCA9685 的組件包里,把設(shè)置頻率相關(guān)的一干操作都封裝到了一個(gè)函數(shù) pca9685_set_pwm_freq() 里面。
三、第 3 段
上面已經(jīng)把研究方法說透了,這里就不再把邏輯分析儀的圖放上來了。通過對(duì)代碼的分析,Sugar 發(fā)現(xiàn) RT-Thread 這個(gè) PCA9685 的驅(qū)動(dòng)組件包傳承了 RT-Thread 本身小而美的特點(diǎn),按照 PCA9685 的 datasheet 封裝函數(shù),這樣使得對(duì) PCA9685 的了解容易很多。
以 Arduino “以使用方便”為目的不同,PCA9685 組件包傾向于真正讓人弄懂 PCA9685 的用法。在懂了之后,個(gè)人就有能力自己“以使用方便”為目的再次做一遍封裝。很多玩過 Arduino 的人都覺得做起來真簡單,離了 Arduino 的環(huán)境真不會(huì)。
Arduino 面對(duì)的是小白,以方便體驗(yàn)為主,而 RT-Thread 和其一眾組件能夠讓人真正了解深層次的本源,搞懂這些能讓人在成為高手的路上走得更輕松。當(dāng)成為高手之后,再回頭看 Arduino 才能體會(huì)到 Arduino 封裝的真正智慧。
-
PCA9685
+關(guān)注
關(guān)注
5文章
7瀏覽量
16396 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1306瀏覽量
40420
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
C51單片機(jī)如何使用PCA9685舵機(jī)驅(qū)動(dòng)板
PCA9685智能LED控制器內(nèi)部框圖及功能介紹
如何用PCA9685去完成無刷電機(jī)的驅(qū)動(dòng)方法?
STM32F103控制PCA9685模塊驅(qū)動(dòng)多個(gè)舵機(jī) 精選資料分享
pca9685芯片手冊(cè) stm32 hal iic
如何使用編程PCA9685
請(qǐng)問PCA9685如何通過IIC協(xié)議控制多個(gè)舵機(jī)?
怎么使用PCA9685擴(kuò)展PWM端口呢
STM32使用PCA9685控制舵機(jī)的過程分享
PCA9685設(shè)計(jì)的16路12位LED驅(qū)動(dòng)控制方案
![<b class='flag-5'>PCA9685</b>設(shè)計(jì)的16路12位LED<b class='flag-5'>驅(qū)動(dòng)</b>控制方案](https://file1.elecfans.com//web2/M00/A5/B4/wKgZomUMObGAKiDmAABp24i3wQE141.gif)
PCA9685與STC12C5A60S2單片機(jī)突然不能工作了!
![<b class='flag-5'>PCA9685</b>與STC12C5A60S2單片機(jī)突然不能工作了!](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評(píng)論