MSP430F5529 多路PWM輸出控制舵機和電機

MSP430F5529有比較豐富的定時器資源,這次我給大家帶來的是輸出多路PWM波,可以實現控制舵機,當然簡單修改後也可以實現控制電機  實驗平臺是 TI的MSP-EXP430F5529LP 也就是我們常說的launchpad,相信很多做電賽的小夥伴都是人手一塊的

首先先簡單的說一下控制電機和控制數字舵機的區別,控制電機的話只需要我們可以輸出一定的佔空比即可,不需要精確控制週期,然而控制舵機則需要我們準確的控制佔空比和週期 。 電機控制我們不多談,只要保證自己輸出的頻率不是太低(電機嗡嗡響)也不是太高(太高也會有問題,此處不展開)。 咱們初步設定電機調速用的頻率是5KHz。數字舵機的控制需求,我這裏就不多說了20ms的週期 高電平持續時間是0.5~2.5ms。咱們先說一般的電機控制 產生一個頻率可以調整的5KHz頻率的方波信號。

這裏是代碼鏈接: 代碼鏈接   實現效果會放在文章的最後  主要和大家分享的還是實現的過程

第一步:IO口複用

IO複用對於學過一點STM32 或除了51以外單片機的小夥伴應該都不陌生(甚至像STC12xx這樣的增強型51也有IO複用這個功能) 只是功能的介紹  我們就先生成四路PWM 稍微演示一下。。。。

打開我們的芯片的 Datasheet 在Terminal Function這一部分有IO的複用功能介紹

IO複用在MSP裏面做的很簡單(複用功能比較少,單一映射的不多。。) 只需要將PxSEL寄存器的指定位置1 就可以了  操作是這樣的

第二步:對定時器的相關寄存器進行設置

這裏 我用的是SMCLK這個時鐘,未經過時鐘升頻的時鐘(1MHz) 至於怎麼提高系統的時鐘 見這篇 博客   這是地址

我們打開msp430F5529的用戶手冊(user_guide,不是datasheet)

從上面的圖我們可以看到大概兩部分的寄存器,第一部分是時鐘主體的設置:

如上圖 我們所需要設置的寄存器參數主要就是這四個選項:第一個選項是時鐘源,這裏我選用的是1MHz的SMCLK(Subsystem master clock  子系統主時鐘)

在頭文件庫 #include <msp430F5529.h>裏面我找到了關於 TA0CTL的 相關位

繼續向下找,官方的頭文件裏面都說的明明白白了 實用的方法很簡單

TA0CTL |= TASSEL__SMCLK ;就是這麼簡單  時鐘就選完了! 接下來的操作就是配置 ID 和IDEX 兩個寄存器

ID是第一次分頻  第二次分頻是 IDEX 

我們需要計算一下我們需要的分頻參數    不過在這之前 我們還需要配置一下其他的一些參數:比如模式

模式的選擇直接決定了你的用法,進而改變了參數的意義!   模式的選擇就是我們先前圖片的MC 的位

我們可以看到 模式的控制時這兩個bit在控制的

這裏是這兩個bit 組合出來的四種 模式  後面都有定義  電機控制和舵機控制都必須選擇模式1,這個我們可以簡單的計算一下,即便我的時鐘不進行分頻  也就是計數頻率是1MHz (最高25MHz) 那麼 我們的脈衝的頻率也就是1M/65536 = 15或者是25M/65536 = 381, 在我們1M的情況下只能使用 MC_Up這個選項,也就是把 CCR0 當做ARR(Auto Reload)寄存器用 ,當定時器的CNT計數到 CCR0時 重新置0 以電機控制爲例  假設我們的電機控制的精度是1000(這裏涉及到一個精度問題,我的理解是這樣的 你想要把你一個週期時間分成多少個脈衝就是這個精度。精度也就是和ARR 有關。 例如在控制舵機時你的脈衝20ms分成200份(ARR = 2000),那麼你能控制的最小脈衝時間是20ms/2000 =  10us  也就是你不可能產生一個不是10us整數倍的脈衝,你的脈寬最小的步進值就是10us 這個步進值會影響到你的舵機等的控制精度,ARR會影響到你電機速度控制閉環時的輸出值的取值範圍!) ARR的取值還是很值得深入研究的  ARR過高 計數值會比較大,控制精度很高,但是在430定時器的頻率高就意味着 多費電,甚至爲此你還需要去產生一個遠高於  正常系統時鐘 的時鐘! 取值過小則會浪費精度(比如高精度的舵機)

我在這裏取 SMCLK = 1MHz ID和IDEX 都是默認設置(不分頻) CCR0 取100   此時產生得到PWM的頻率是

SMCLK / (ID*IDEX*CCR0)   =  100 0000/(1*1*100) = 10KHz   

以上是生成的10KHz頻率( 這裏的誤差較大,是因爲時鐘不是1Mhz 而是1.05Mhz,至於是爲什麼是1.05MHz我會查出來。。。 接下來的文章都是按照1.05M的之中在測試的!!!!  文中的計算都是有問題的! 這裏就不做後續的修改了,望讀者們理解,至於爲什麼是1.05MHz 的時鐘  看這裏------->   鏈接地址

要設置我們的5KHz  只需要調整ID即可

以上脈衝可以用於 電機控制  但是不能用於舵機控制 , 接下來我們設計舵機控制的配置

假設我們是180度舵機 我希望可以達到步進值 是1 度 我們不妨設置CCR寄存器數值變化180個單位時 脈衝時間變化2ms 這樣整個週期就需要 1800 個脈衝 也就是我們的CCR0 需要設置成1800  ,計算一下此時 如果不分頻的話的頻率是多少 SMCLK/CCR0 = 1000000/1800 = 555.555   Hz  > 50Hz   應該可以通過分頻得到指定的頻率!

接下來 我們應該計算一下分頻的係數  我們大概需要的分頻係數是  555.5/50 = 11.1  這個數字有點小了可靠的拆分應該是 2*6 = 12

我們獲得的是 42Hz的方波   接下來我們調整一下IDEX = 5

Amazing!  我們得到了49Hz的方波,舵機控制應該是沒有問題了! 

代碼鏈接 我整理以後會奉上。 通過這些測試我也發現了,其實MSP430的時鐘波動是比較大的,時鐘也不是那麼穩定,要想獲得最好的參數還是需要自己去測試,測試出來的實際結果和預想的還是有一定差距的

調試用的示波器是 Loto的虛擬示波器 OSC802,可以直接插在電腦上調試的一個工具,調試代碼簡直不要太方便啊!

我是最近才重新撿起430的  還有很多生疏之處,如有錯誤,請大佬們不吝賜教,代碼我整理完了會分享的!

最後推薦一下我所用的示波器 Loto OSC802  對虛擬示波器 感興趣的小夥伴可以加 QQ羣 706769836  備註:戰神  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章