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 備註:戰神