iT邦幫忙

2021 iThome 鐵人賽

1
Arm Platforms

STM32 基礎入門教學系列 第 19

【Day20】:Servo控制-By PWM輸出

  • 分享至 

  • xImage
  •  

Servo

對於簡單的角度控制,大家第一個想到的就是伺服馬達了吧,大小也適中,非常適合用在機器人上。
https://ithelp.ithome.com.tw/upload/images/20210921/20141525pR8xDfIA3M.jpg
還記得我們以前在Arduino的時代是怎麼控制Servo的嗎?
伺服馬達總共就只有三條線(通常是咖啡色、紅色、黃色),分別對應到GND、5V、PWM,前面兩個應該沒什麼問題吧,而PWM的那條線我們就會把他接到Arduino上面有一個波浪號的腳位上,然後再打一行程式:

Servo myservo;  
void setup() {
  myservo.attach(9);  // 設定要將伺服馬達接到哪一個PIN腳
}
void loop() {   
  myservo.write(50)

而上面的三行程式碼中,最關鍵的就是myservo.write()了,這一行事實上就是做方波的輸出,而這個方波的頻率是490Hz(~500Hz)。

用STM32控制Servo

昨天我們已經介紹了PWM的輸出,因此只要配置好PSC、ARR等值,並不難,真正難的點在於,究竟是多少dutycycle對應到多少角度呢?這個問題的答案我真的查了好久,我不知道是我查的方式有問題還是怎樣,但我就是查不太到這個數據。
起初我將0%對應到0度,100%對應到180度,結果很顯然Servo完全不受控,因為根本就不是這樣嘛...
而最後聰明的我就想到,只要在arduino用myservo.write()將servo轉到兩個角度,我再用視波器去量測我到底輸出了什麼東西就可以啦!

void loop() {   
  myservo.write(0)
  myservo.write(150)

經過我的測量,我得到的結果如下:

角度 duty cycle(%)
0 3%
150 10.5%

很吃驚吧,居然是這麼詭異的數字。而用哪兩個角度並不是太重要,總之你知道角度與dutycycle是線性的關係,有兩點你就可以反推線性方程式了。
我們就直接給出結果:

duty = 3 + (double) angle / 150 * 7.5;

可以將angle代入0、150驗算一下,duty分別是3與10.5。

小結

幫大家整理一下,總之控制伺服馬達很簡單,就是輸出一個PWM到黃色那條線,而設定的部分,預設的情況時鐘的頻率是16MHz,PSC設為15、ARR設為20000,這樣輸出的方波頻率就會是500Hz,接著Pulse的部分可以先設為600讓servo轉到0度。在程式內部我們可以用昨天教的

__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 20000*duty);

這個函式來改pulse的值,(timer跟channel要看你腳位的配置),duty這個變數就是dutycycle,而角度換算成dutycycle的公式就用上面的那行即可。

就實際接線,看看Servo有沒有照著自己設定的角度來轉動吧~


上一篇
【Day19】:PWM輸出-模擬類比訊號
下一篇
【Day21】:客製化的PWM輸出
系列文
STM32 基礎入門教學28
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
TsaiiiY
iT邦新手 4 級 ‧ 2022-02-23 19:38:58

您好,想詢問您方波輸出為500hz是如何計算出來的~
我計算出來的為50,想詢問您是否錯誤,謝謝!

對的,應為50Hz

我要留言

立即登入留言