STM32筆記(6):使用可變電阻控制MG90S伺服馬達

之前已經做了好幾個 Arduino 控制伺服馬達的專案,可參考:
這篇文章要在這個基礎上,改用 STM32 來控制伺服馬達,使用可變電阻控制伺服馬達的轉動,同時也瞭解一下 STM32 利用 PWM(Pulse Width Modulation) 作為控制的方法。


使用PWM(Pulse Width Modulation,脈衝寬度調製)可以透過改變其輸入電壓來控制直流電機的速度。PWM利用發送一系列ON-OFF的脈衝來調節輸入電壓平均值的技術,以容易懂的言語來說,就是頻繁變更電壓的開關,在固定時間內程式高速切換,電壓被開關很多次,當開的時間長一點時,馬達的速度就會比較快;如果時間內,關的時間長一點,馬達的速度就會比較慢。我們將給予電壓的時間比例稱為佔空比(Duty Cycle)。佔空比越高,施加到直流電動機的平均電壓越高(高速),佔空比越低,施加到直流電動機的平均電壓越低(低速)。例如:燈光的亮度控制、馬達轉速控制、螢幕亮度控制、喇叭大小聲/聲音頻率高低控制等。

STM32F103C具有15個PWM引腳和10個ADC(Analog-to-digital converter, 簡稱ADC)引腳(PA0-PB1)。ADC的轉換精密度是12位元,即 2^12 = 4096,也就是說作為類比輸出時,其範圍可取得的最大值為 4096,而 Arduino 僅到 1024。STM32F103C還具有7個定時器,每個PWM輸出由連接到4個定時器的通道提供,且具有16位PWM分辨率,即2 ^ 16。

因此,其計數器和變量可以高達65535。由於其時鐘頻率為72MHz,其PWM輸出的最大周期約為1毫秒。STM32的15個PWM引腳(PA0,PA1,PA2,PA3,PA6,PA7,PA8,PA9,PA10,PB0,PB1,PB6,PB7,PB8,PB9)中,任一個引腳都可用於對伺服馬達提供脈衝電機的PWM功能。以下實作就將一個引腳(PA5)用於Analogread,以讀取其電位來設置伺服馬達的軸位置。

[MG90S規格]

  • 產品型號:MG90s
  • 產品重量:13.6g
  • 產品尺寸:22.8*12.2*28.5mm
  • 產品扭力:2.0kg(4.8v)
  • 產品速度:0.11s(4.8v)
  • 轉動角度:最大90°
  • 使用溫度:0°-55°
  • 產品結構材質:金屬銅齒、空心杯電機、雙滾珠軸承
  • 適用範圍:450電直 斜盤舵機 固定翼 航模遙控飛機

[安裝程式庫Library]

本實作需要安裝以下程式庫:
  • Servo
直接到 Arduino IDE 功能表選單,選擇 [草稿碼 Sketch] → [匯入程式庫 Include Library] → [ 管理程式庫 Manage Libraries...],在出現的視窗搜尋處輸入 Servo,如以下畫面,按下安裝(我的Arduino已經安裝過了,看到的是「更新」)即可。


如為下載程式庫(Library)安裝方法請參考另一篇文章:  Arduino筆記:安裝 Arduino IDE 程式庫(Library)

[材料]

  • STM32F103C8T6開發板
  • USB轉TTL序列傳輸線 CP2102
  • MG90S伺服馬達
  • 可變電阻10K歐姆
  • 排線 n 條

[接線圖]

CP2102STM32F103C8T6伺服馬達10K可變電阻
GNDGNDGNDGND
3V33.3V--
RXPA9--
TXPA10--
-5VVCCVCC
-PA0PWM-
-PA5-Data(中間Pin)



[程式一]

伺服馬達從0轉動到180度,再迴轉至0度,每次轉動2度。
#include <Servo.h>
Servo myservo;    // 建立一個 servo 物件,最多可建立 12個 servo
int pos = 0;      // 設定 Servo 位置的變數

void setup() 
  myservo.attach(PA0);  // 將serv物件連接到PA0
}

void loop() {  
  for (pos = 0; pos <= 180; pos += 2){ //正轉,從0度旋轉到180 度,每次2度
    myservo.write(pos);             // 告訴 servo走到'pos'位置
    delay(20);                     // 等待20ms讓Servo走到指定位置
  }
  
  for (pos = 180; pos >= 0; pos -= 2){ //反轉,從180度旋轉到0度,每次2度 
    myservo.write(pos);          
    delay(20);                   
  }
}

[程式二]

加上可變電阻,作為控制伺服馬達轉動角度用。
#include <Servo.h>
int servoPin = PA0;    //定義Servo輸出PWM的接腳 
int potPin = PA5;     //可變電阻接腳      
int angle;            //讀取電位器控制的模擬值declare varible angle as int
int reading;                      

Servo myservo;         //建立一個伺服馬達控制物件 

void setup() 
{ 
   Serial.begin(9600);
   myservo.attach(servoPin);   // 由PA0控制伺服馬達
} 

void loop() 
{ 
   reading = analogRead(potPin); //讀取可變電阻的類比值,範圍在0-4096
   Serial.println(reading);                                                                                                           
   angle = (reading/24);   //設定Servo當時所在的角度,將reading值4096分成170度的等分,每等分約24
   myservo.write(angle);   //控制伺服馬達角度 
   delay(100);            //等待100ms讓伺服馬達到達指定位置 
}

[實作結果]

直接使用 STM32開發板的電源供電給伺服馬達,有不穩定唧唧聲音且有跳動情況:

使用 CP2102 USB的 5V電源供電給伺服馬達,轉動起來明顯比較穩定:

[程式二]使用可變電阻控制伺服馬達的情況:

[參考資料]

Post a Comment

較新的 較舊