之前已經做了好幾個 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,以讀取其電位來設置伺服馬達的軸位置。
如為下載程式庫(Library)安裝方法請參考另一篇文章: Arduino筆記:安裝 Arduino IDE 程式庫(Library)。
使用 CP2102 USB的 5V電源供電給伺服馬達,轉動起來明顯比較穩定:
[程式二]使用可變電阻控制伺服馬達的情況:
使用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
如為下載程式庫(Library)安裝方法請參考另一篇文章: Arduino筆記:安裝 Arduino IDE 程式庫(Library)。
[材料]
- STM32F103C8T6開發板
- USB轉TTL序列傳輸線 CP2102
- MG90S伺服馬達
- 可變電阻10K歐姆
- 排線 n 條
[接線圖]
CP2102 | STM32F103C8T6 | 伺服馬達 | 10K可變電阻 |
---|---|---|---|
GND | GND | GND | GND |
3V3 | 3.3V | - | - |
RX | PA9 | - | - |
TX | PA10 | - | - |
- | 5V | VCC | VCC |
- | PA0 | PWM | - |
- | 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電源供電給伺服馬達,轉動起來明顯比較穩定:
[程式二]使用可變電阻控制伺服馬達的情況:
張貼留言