引言:
設計一種基於Arduino直流電機PWM調速系統,
PWM電機調速是開環控制技術,精度比較低,容易實現;
更高階的自動控制技術要用到PID控制。
直流電機調速系統是電機調速控制中發展得最為成熟,應用非常廣泛的電力傳動系統。
工具/原料
Arduino板一片;
電機驅動板一片;一般是L298;
杜邦線一些;
直流電機2個;
方法/步驟
硬體準備:
如圖所示:
電路連線:
L298N out1,out2分別直接電機引用
L298N N1,N2分別接arduino 10,11引腳
L298N ENA使能端接arduino 6引腳,高電平有效
L298N +5V腳接arduino +5V
L298N GND腳接arduino GND
analogWrite():
功能:給埠寫入一個模擬值(PWM波)。
可以用來控制LED燈的亮度變化,或者以不同的速度驅動馬達。
當執行analogWrite()命令後,埠會輸出一個穩定的佔空比的方波。除非有下一個命令來改變它。
PWM訊號的頻率大約為490Hz.
在使用analogWrite()命令前,可以不使用pinMode()命令把埠定義為輸出埠,當然如果定義了更好,這樣利於程式語言規範。
delayMicroseconds():
作用:產生一個延時,計量單位是微秒,1000微秒=1毫秒。
目前delayMicroseconds()最大值為16383。
如果值大於1000,推薦使用delay() 命令。
PWM(Pulse-width modulation)脈寬調製
PWM是使用數字手段來控制模擬輸出的一種手段。
使用數字控制產生佔空比不同的方波(一個不停在開與關之間切換的訊號)來控制模擬輸出。
arduino的數字埠電壓輸出只有LOW與HIGH兩個開關,
對應0V與5V的電壓輸出,
週期為PWM頻率的倒數。
如果arduino PWM的頻率是500Hz,那麼兩綠線之間的週期就是2毫秒。 analogWrite() 命令中可以操控的範圍為0-255,
analogWrite(255)表示100%佔空比(常開),
analogWrite(127)佔空比大約為50%(一半的時間)。
如圖所示:
傳統方法實現PWM:
除了使用analogWrite()命令實現PWM,
還可以通過傳統方法來控制電平的開關時間來設定。
優點:可以使用任意數字埠做輸出埠,且可以自己隨意設定佔空比與頻率;
缺點:是任何中斷都會影響時鐘,導致很大的抖動,除非禁用中斷;
以及CPU在處理輸出的時,無法做其他事情。
程式:
void setup(){
pinMode(13, OUTPUT);//設定13號埠為輸出
}
void loop(){
digitalWrite(13, HIGH);
delayMicroseconds(100); // 大約10%佔空比的1KHz方波
digitalWrite(13, LOW);
delayMicroseconds(900);
}
PWM直流電機調速(程式碼):
int i=0;
void Forward();
void Back();
void Turn_left();
void Turn_right();
void Speed_up();
void Slow_down();
void setup() {
// put your setup code here, to run once:
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
Forward();
Back();
Turn_left();
Turn_right();
Speed_up();
Slow_down();
}
void Forward(){
//you guys must understand which pin connect to VCC,which pin connect to GND
digitalWrite(9,HIGH);
digitalWrite(10,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,LOW);
delay(4000);
}
void Back(){
digitalWrite(9,LOW);
digitalWrite(10,HIGH);
digitalWrite(5,LOW);
digitalWrite(6,HIGH);
delay(4000);
}
void Turn_left(){
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,LOW);
delay(4000);
}
void Turn_right(){
digitalWrite(9,HIGH);
digitalWrite(10,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
delay(4000);
}
void Speed_up(){
for(i=0;i<=255;i+=5){
analogWrite(9,i);
analogWrite(10,0);
analogWrite(5,i);
analogWrite(6,0);
delay(50);
}//speed up
}
void Slow_down(){
for(i=255;i>=0;i-=5) {
analogWrite(9,i);
analogWrite(10,0);
analogWrite(5,i);
analogWrite(6,0);
delay(50);
}
}
注意事項
硬體電路連線要正確;
analogWrite():給埠寫入一個模擬值(PWM波)。
analogWrite(255)表示100%佔空比(常開), analogWrite(127)佔空比大約為50%(一半的時間)。
傳統方法實現PWM;