控制直流電機(jī)比較簡單,主要利用Lm298n構(gòu)成H橋來控制電機(jī)正反轉(zhuǎn)。。
器件:
LM298N模塊1塊;arduino uno 1塊;直流電機(jī) 1個。
接線:
LM298n除了控制部分和電機(jī)輸入電源線各2根外,輸入In1~In4,分別對應(yīng)輸出OUT1~OUT4. 接直流電機(jī)時OUT1、2接電機(jī)1的兩條電源線;OUT3、4接電機(jī)2。這里只用了一個直流電機(jī)所以直接out1、2.
輸入端還有兩條線EnA、EnB分別用于輸入pwm波對兩個電機(jī)調(diào)速。
In1:High,In2:Low 時,電機(jī)正傳(其實無所謂方向正負(fù))。反之,反轉(zhuǎn)。
In1--》P13;in2--》p12; EnA--》P11(需要可以輸出pwm波的端口)
程序:
對網(wǎng)上找的的程序進(jìn)行修改,實測可用:
#define motor1pin1 13 //定義IN1引腳
#define motor1pin2 12 //定義IN2引腳
#define motor1pwm 11 //定義ENA引腳(我的是Mega2560的板子)
#define motor2pin1 9 //定義IN3引腳
#define motor2pin2 8 //定義IN4引腳
#define motor2pwm 10 //定義ENB引腳
unsigned long lastMillis =0;
unsigned long currentMillis =0;
unsigned long lastMicros =0;
unsigned long currentMicros =0;
unsigned long intervalMillis =0 ;
unsigned long intervalMicros =0;
void motor(int motorpin1,int motorpin2,int motorpwm,int val) //定義一個電機(jī)轉(zhuǎn)動函數(shù)
{
pinMode(motorpin1,OUTPUT); //輸出第一個引腳
pinMode(motorpin2,OUTPUT); //輸出第二個引腳
digitalWrite(motorpin2,0); //將第二個引腳置低
digitalWrite(motorpin1,1); //將第一個引腳抬高
analogWrite(motorpwm,val); //給EN引腳設(shè)定模擬值,設(shè)定轉(zhuǎn)速
}
void setup()
{
Serial.begin(9600);
}
void loop()
{
int i;
currentMicros=micros();
intervalMicros = currentMicros - lastMicros;
Serial.println(intervalMicros);
lastMicros=currentMicros;
// for(i=100;i<=255;i++) //讓電機(jī)的轉(zhuǎn)速從100到255轉(zhuǎn)動,A,B轉(zhuǎn)速不一樣,完成轉(zhuǎn)向
// {
// // motor(motor2pin1,motor2pin2,motor2pwm,255); //電機(jī)B保持255勻速轉(zhuǎn)動
// motor(motor1pin1,motor1pin2,motor1pwm,i); //電機(jī)A從100到255轉(zhuǎn)動
// delay(500); //間隔500ms
// }
// for(i=100;i<=255;i++) //讓電機(jī)從100到255轉(zhuǎn)動,功能同上
// {
// motor(motor1pin1,motor1pin2,motor1pwm,255);
// // motor(motor2pin1,motor2pin2,motor2pwm,i);
// delay(500);
// }
motor(motor1pin1,motor1pin2,motor1pwm,125); //電機(jī)A以 轉(zhuǎn)速轉(zhuǎn)動
delay(500);
motor(motor1pin1,motor1pin2,motor1pwm,0);
delay(500);
motor(motor1pin2,motor1pin1,motor1pwm,125); //電機(jī)A反向轉(zhuǎn)動
delay(500);
motor(motor1pin1,motor1pin2,motor1pwm,0);
delay(500);
}
結(jié)論:
對直流電機(jī)的方向和速度控制簡單。一個電機(jī)需要3個I/o口,因此一片arduino uno 只能控制4個電機(jī),而且無法增加反饋。實際測量A0~A5也是可以輸出數(shù)字信號的,如果可以加入,最多可控制6個電機(jī),這個以后看看avr的接口再說。
電機(jī)自帶一個霍爾元件構(gòu)成的碼盤,測量成功,但還沒用于電機(jī)速度位置控制,在網(wǎng)上搜了一下閉環(huán)控制的內(nèi)容,發(fā)現(xiàn)首先需要采集足夠多的編碼器信號,如果對編碼器進(jìn)行4倍頻,又需要占用1個中斷2個接口,多個電機(jī)時處理速度上不知道是否可以保證;pid控制方面的例子也比較少,只好拔了一下arduino.cc,發(fā)現(xiàn)有人提供了庫函數(shù)。后面有時間試試。