iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 28
1
IoT

熟悉Arduino的Maker必看!30天帶你快速入門基於STM32嵌入式開發~系列 第 28

[Day 28]-【STM32系列】實作-伺服馬達 SG- 90 PWM控制

SG-90轉起來!

今天要來玩伺服馬達~
我們使用 SG-90 透過PWM控制 精準控制角度從0° ~ 180°
常使用在旋轉物體、移動機器人手、腳或是移動感測器等等
https://ithelp.ithome.com.tw/upload/images/20201013/20120093fhmP69Pcq8.jpg

伺服馬達(servo motor)由減速齒輪、控制電路、電位器、直流馬達和減速齒輪,當我們送入脈衝信號後,馬達轉動造成電位器改變,內部的控制電路會判斷電位器與目標角度位置至相同時停止轉動,即可精準控制電路。

SG-90 接腳:

  • 棕色 -> 接地Gnd
  • 紅色 -> 正電+5V
  • 橙色 -> PWM 輸入

旋轉角度控制

SG-90可控角度在0° ~ 180°之間,控制方式就是輸入50Hz脈衝訊號,同時脈衝的寬度(也就是高電位的持續時間)必須在 1ms ~ 2ms之間:

  • 1.0ms的脈衝寬度 -> -90°
  • 1.5ms的脈衝寬度 -> 0°
  • 2.0ms的脈衝寬度 -> 90°

我們來計算一下,頻率為 50 Hz每一週期為 1/50 = 0.02s,也就是 20ms

  • 1.0 ms 的脈衝寬度其工作週期為 1.0/20 * 100% = 5.0%
  • 1.5 ms 的脈衝寬度其工作週期為 1.5/20 * 100% = 7.5%
  • 2.0 ms 的脈衝寬度其工作週期為 2.0/20 * 100% = 10.0%

Setup

1.pinout settings

https://ithelp.ithome.com.tw/upload/images/20201014/20120093dF7y0IGPN9.png

  • 基本設定:
    RCC → HSE、LSE → Crystal/Ceramic Resonator ✅
    SYS → Debug Serial Wire ✅

  • 額外設定:
    TIM21 → Channel1 → PWM Generation CH1 ✅

2.Clock

https://ithelp.ithome.com.tw/upload/images/20201001/20120093mwsW2dOAkz.png
最快32MHz

3.Detail

TIM21設定預分頻器(Prescalar)、ARR暫存器:
https://ithelp.ithome.com.tw/upload/images/20201014/20120093XzyMF6m83S.png
頻率必須為50 Hz,Clock頻率為32MHz,所以(32 MHz / 50 Hz) = 640k
我將640分到預分頻器(Prescalar),ARR暫存器分到1000
這1000相當是1000%的脈衝寬度,如果我要改變脈衝寬度,只需要調整CCR1的值為X%

假如今天我要1ms的脈衝寬度,就是(1ms * 1000/20) = 50%,將這50%放入CCR1
2毫秒為100%,1.5毫秒為75%,依此類推
但在經過實驗測試之後,發現雖然輸出確實為 1ms ~ 2ms 的脈衝寬度
伺服馬達卻沒有旋轉完整的180°,所以我稍微改變了一下
脈衝寬度範圍改變至 0.5ms ~ 2.5ms,可正常工作!
隨後記得開啟中斷
https://ithelp.ithome.com.tw/upload/images/20201014/20120093pmSijfzYjP.png

CODE

HAL_TIM_PWM_Start_IT(&htim21, TIM_CHANNEL_1);

      TIM21->CCR1 = 25; //佔空比為0.5ms,旋轉角度-90°
	  HAL_Delay(1000); 
	  TIM21->CCR1 = 75; //佔空比為1.5ms,旋轉角度0°
	  HAL_Delay(1000); 
	  TIM21->CCR1 = 125; //佔空比為2.5ms,旋轉角度90°
	  HAL_Delay(1000); 

相關連結


結語

快結束了!


上一篇
[Day 27]-【STM32系列】UART/USART RX 資料接收篇(下)
下一篇
[Day 29]-【STM32系列】實作-步進馬達 + ULN2003 控制
系列文
熟悉Arduino的Maker必看!30天帶你快速入門基於STM32嵌入式開發~30

尚未有邦友留言

立即登入留言