上一篇 使用VHDL語言實現 I²C協定,用來控制PCA9685(VHDL篇) 主要著重在VHDL語言實做 I²C 協定上,而這篇則來探討如何透過它來控制PCA9685用於伺服馬達控制。
我們知道伺服馬達的角度(或轉速)控制是以PWM的方式,藉由改變脈波的寬度來決定伺服的角度。
由圖中得知PWM的頻率要設定在50Hz(頻率 = 1 / 週期),PCA9685設定頻率的計算公式如下:
osc_clock 為振盪頻率,這邊使用PCA9685內部的振盪器,頻率為 25MHz
update_rate 為設定的目標頻率 = 50Hz
計算得到的結果為 121,等於16進制的 79h (實際測試時,我要將此數值修正到 7Fh 才能得到較接近 20mS的週期)
而脈波寬度的計算如下:
PCA9685 每個PWM通道輸出由LOW轉HIGH(ON),及由HIGH轉LOW(OFF)的時間皆可獨位設置。ON到OFF的差距保持對應的 Value,即可得到對應的脈波寬度
我們以寫入暫存器位置0xFE PRE_SCALE 為例,說明一下使用方法:
- Start <= '0' ,進入停止狀態
- Addr <= "000011",設置 Slave 的位址 (依據Slave實際位址, 這邊設置的是 3)
- RegAddr <= X"FE",設置暫存器位址 (頻率設置暫存器位址)
- RegData <= X"79",設置暫存器數值 (50Hz的計算值)
- Start <= '1',開始傳輸
- 確認 Complete 是否為 '1',為 '1' 時代表傳輸結束
- 檢查 NoACK 是否為 '0','0'代表正確傳送;'1'代表Slave沒有應答(ACK)
以上步驟即可寫入一個暫存器的值。要使PCA9685作動,可能須要寫入一個以上的暫存器
這邊以控制第一個通道(LED0)輸出為例,列出操作步驟:
- 將 SLEEP (Mode1, bit4) 設為 1, 進入待機模式(Low power mode),必須在此模式下才能改變頻率設定
- 設定頻率 (寫入 PRE_SCALE 暫存器)
- 將 SLEEP 設為 0,進入正常模式
- 分別寫入LED0_ON_L、LED0_ON_H、LED0_OFF_L 及 LED0_OFF_H 四個暫存器
上述四個步驗即可完成基本的控制,其餘皆使用預設值即可
用於伺服馬達控制,由於頻率是固定的,因此步驟 1~3 只需執行一次,接下來改變脈波寬度只需要執行步驟 4即可。
而步驟 4中,為了使用上的方便,可將 LED0_ON_L 及 LED0_ON_H 皆設為 0,而 LED0_OFF_L 及 LED0_OFF_H 設為對應脈波寬度的數值,這樣較為直觀,且改變脈波寬度只需改變存放 OFF 數值的兩個暫存器
最後放上我測試用的電路板,就這樣囉~
