1. 程式人生 > >Arduino控制直流電機

Arduino控制直流電機

認識直流電機

直流電機內部有磁鐵、轉子和碳刷等元件組成,將電機的+、-極和電池相連,即可正轉或逆轉。
電機在運轉時,碳刷和整流子之間會產生火花,進而引發干擾,影響到微處理器或無線遙控器的執行。為了消除噪聲,通常在碳刷電機的+、-極之間焊接一個0.01~0.1uF的電容。
步進電機 是一種易於控制旋轉角度和轉動圈數的電機,常見於需要精確定位的自動控制系統,比如:印表機、光碟機等,僅僅接上電源,步進電機是不會轉動的,步進電機有四條控制線和兩條電源線,微處理器從控制線輸入脈衝(即:高、低電位變化),步進電機的轉子就會配合脈衝數轉動到對應的角度。
脈衝產生器發出的訊號,輪流驅使電機轉動一個角度,轉動一圈所需要的次數以及每次轉動的角度,分別稱為“步數”和“步進角”。

缺點: 體積、重量以及消耗電力都比較大,因此許多需要控制旋轉角度的裝置,都改用 舵機

直流電機 又稱為“碳刷電機”,因為它通過碳刷將電力傳輸給轉子。碳刷需要清理也會損耗,因此許多電器逐步改用無刷電機,無刷電機的結構以及驅動方式,都和一般碳刷電機不同
直流電機的技術檔案
從電機的技術檔案所列舉的轉速和扭力引數,可得知該電機是否符合轉速和負重的需求;工作電壓和消耗電流引數,則關係到電源和控制器的配置。
表:RF-300電機

最大效率 堵轉(STALL)
工作電壓 轉速 電流 扭力 輸出 扭力 電流
1.6~6.5V 1710轉/分鐘 0.0525A 0.27mN·m 2.8g·cm 0.049W 1.22mN·m 12g·cm 0.18A
表:**FA-130**電機
最大效率 堵轉(STALL)
工作電壓 轉速 電流 扭力 輸出 扭力 電流
1.5~3V 6990轉/分鐘 0.66A 0.59mN·m 6.0g·cm 0.43W 2.55mN·m 26g·cm 2.20A
設計電機的電晶體控制電路時,最重要的兩個引數是**工作電壓和堵轉電流**。堵轉代表電機軸心受到外力卡住而停止,此時電機線圈形同短路狀態,電機的負荷越重,電流越大,發熱量也就增加。

認識電晶體元器件

電晶體是最基本的驅動介面,微處理器只需要送出微小的訊號,即可通過它控制外部裝置。它很像水管中的閥門,平時處於關閉狀態,但只要稍微施力,就能啟動閥門,讓大量水流通過。
電晶體有三隻引腳,分別叫做B(基極)C(集電極)E(發射極)集電極(Collector) 代表收集電流,發射極(Emitter) 代表射出電流,基極(Base) 相當於控制檯。

控制電機正反轉的H橋式電機控制電路

使用專用IC(L298)控制電機

L298內部包含兩組H橋式電路,可以驅動並控制電機的正反轉,
L298N內部原理圖
L298N內部原理圖
L298N引腳圖及功能
L298N引腳圖
L298N 有兩組電源輸入腳,一個用於IC本身(晶片電源,5V),另一個用於電機;有兩個使能引腳,用於決定是否供電給電機。L298N 有檢測電機是否處於“堵轉”狀態,原理是:“當電機的負荷增加時,消耗的電流量也跟著增加,因此,從電流的消耗量,可得知電機是否執行平順。”如果要啟用這項功能,必須在“電流監測”腳位連線電阻;若不適用“電流監測”功能,請將電流監測的1和15腳位接地。
一組電機都有三個控制引腳,使能、輸入A和輸入B,這三個引腳和電機的運轉關係:
L298N邏輯功能表

使能A 輸入1A 輸入1B 電機狀態
正轉
反轉
輸入1B 輸入1A 快速停止(剎車)
× × 停止(自由滑行)

×:代表任何狀態
在需要精確定位的場合,可以將兩個輸入訊號反轉,造成“剎車”效果

有些L298N電機控制器,使用另一個IC(型號:74HC14)來簡化電機正反轉控制,每個輸入端只有使能和正反轉兩個引腳

這種控制器的輸入輸出關係表

EA/EB(使能) IA/IB(正反轉) 電機狀態
正轉
反轉
× ×

活動一:自動迴避障礙物的自走車

實驗說明: 採用一個L298N控制器以及超聲波感測器,製作一個遇到前方有障礙物時,能自動轉向的自走車。
實驗材料:

物品 數量
超聲波感測器 1
L298N電機控制模組 1
電機(請在小電機的電源焊接一個0.1uF(104)電容,避免電機的噪聲干擾處理器 2
const byte TrigPin = 13;
const int EchoPin = 12;
const int dangerThresh =580;
cont byte speed = 100;

long distance ;
const byte ENA = 5;
const byte ENB = 6;
const byte IN1 = 10;
const byte IN2 = 9;
const byte IN3 = 8;
const byte IN4 = 7;

byte dir = 0;
void stop() {
	analogWrite(ENA, 0);
	analogWrite(ENB, 0);
}

void forward() {
	analogWrite(ENA, speed);
	digitalWrite(IN1, HIGH);
	dititalWrite(IN2, LOW);
	analogWrite(ENB, speed);
	digitalWrite(IN3, HIGH);
	digitalWrite(IN4, LOW);
}

void backward() {
	analogWrite(ENA, speed);
	digitalWrite(IN2, HIGH);
	dititalWrite(IN1, LOW);
	analogWrite(ENB, speed);
	digitalWrite(IN4, HIGH);
	digitalWrite(IN3, LOW);
}

void turnLeft() {
	analogWrite(ENA, speed);
	digitalWrite(IN2, HIGH);
	dititalWrite(IN1, LOW);
	analogWrite(ENB, speed);
	digitalWrite(IN3, HIGH);
	digitalWrite(IN4, LOW);
}

void turnRight() {
	analogWrite(ENA, speed);
	digitalWrite(IN1, HIGH);
	dititalWrite(IN2, LOW);
	analogWrite(ENB, speed);
	digitalWrite(IN4, HIGH);
	digitalWrite(IN3, LOW);
}
long ping() {
	digitalWrite(TrigPin, HIGH);
	delayMicroseconds(5);
	digitalWrite(TrigPin, LOW);
	return pulseIn(EchoPin, HIGH);
}

void loop() {
	distance = ping();
	if (distance > dangerThresh) {
		if (dir != 0) {
			dir = 0;
			stop();
			delay(500);
		}
		forward();
	} else {
		if (dir != 1) {
			dir = 1;
			stop();
			delay(500);
		}
		turnRight();
	}
	delay(1000);
}

實驗結果: 編譯與下載程式之後,兩個電機將開始正轉,若超聲波感測器感知到遮擋,兩個電機首先暫停0.5秒,接著,A電機將持續正轉,B電機則會反轉;若前方無障礙物,兩個電機首先暫停0.5秒,再一起正轉。每次在切換電機狀態之前先暫停0.5秒,可以避免電機頻繁地正、反轉而導致壽命降低。