前一篇實作Arduino筆記(54):L293D驅動馬達 利用 L293D 來控制風扇馬達,使用線性電阻來控制轉速,這僅是L293D小小的功能之一。要完全控制直流電機,就是控制其速度和旋轉方向。這可以透過以下這兩種技術來完成:

當開關S1和S4 (下圖左方) 閉合且S2和S3是打開的,正電壓將依照電流方向使馬達正轉。當S1和S4的開關打開且S2和S3的開關閉合 (下圖右方) ,此電壓是相反的,會使馬達轉向相反。使用這個電路時,開關S1和S2不應該在同一時間被封閉,因為這將導致輸入電壓短路,電流就會從正極穿過兩個電晶體直接回到負極,同樣的S3和S4也不能同時閉合,這種情況被稱為直通 (shoot-through),是有可能燒壞電晶體的。在實際驅動電路中通常要用硬體電路方便地控制電晶體的開關。
L293D的接腳 2跟7是控制電流方向,會影響接腳3、6(馬達的接線)的輸出,亦即控制馬達的轉動方向。下表是2,7兩個Input電位高低時,馬達的作動情況。
• Arduino UNO R3 x 1
• 直流 5V 馬達 x 2
• L293D IC x 1
• 外接電源變壓器 x 1
• 18650 電池 x 2
• 連接線 x N條
註:外接電源的負極,與 Arduino GND 及 L293D 的 4, 12 一起接地。
● Lastminuteengineers:Interface L298N DC Motor Driver Module with Arduino
- PWM :用於控制速度
- H-Bridge :用於控制旋轉方向
[PWM]
使用PWM(Pulse Width Modulation, 脈衝寬度調製)可以透過改變其輸入電壓來控制直流電機的速度。PWM是一種利用發送一系列ON-OFF的脈衝來調節輸入電壓平均值的技術。以容易懂的言語來說,就是頻繁變更電壓的開關,在固定時間內程式高速切換,電壓被開關很多次,當開的時間長一點時,馬達的速度就會比較快;如果時間內,關的時間長一點,馬達的速度就會比較慢。我們將給予電壓的時間比例稱為佔空比(Duty Cycle)。佔空比越高,施加到直流電動機的平均電壓越高(高速),佔空比越低,施加到直流電動機的平均電壓越低(低速)。例如:燈光的亮度控制、馬達轉速控制、螢幕亮度控制、喇叭大小聲/聲音頻率高低控制等。[H-Bridge]
H-Bridge,根據維基百科的解釋H-Bridge是一種電子電路,可使其連接的負載或輸出端兩端電壓反相/電流逆向。相信看過上面這句話的解釋,很多人還是不懂什麼是H-Bridge,先用以下的例子來說明,可能比較容易懂些。H-Bridge 以4個開關跟一個馬達為例,連接的方式如下圖:
圖片來源:Wikipedia
當開關S1和S4 (下圖左方) 閉合且S2和S3是打開的,正電壓將依照電流方向使馬達正轉。當S1和S4的開關打開且S2和S3的開關閉合 (下圖右方) ,此電壓是相反的,會使馬達轉向相反。使用這個電路時,開關S1和S2不應該在同一時間被封閉,因為這將導致輸入電壓短路,電流就會從正極穿過兩個電晶體直接回到負極,同樣的S3和S4也不能同時閉合,這種情況被稱為直通 (shoot-through),是有可能燒壞電晶體的。在實際驅動電路中通常要用硬體電路方便地控制電晶體的開關。
圖片來源:Wikipedia
L293D的接腳 2跟7是控制電流方向,會影響接腳3、6(馬達的接線)的輸出,亦即控制馬達的轉動方向。下表是2,7兩個Input電位高低時,馬達的作動情況。
| Input 1 | Input 1 | 旋轉方向 |
|---|---|---|
| Low (0) | Low (0) | 馬達停止 |
| High(1) | Low (0) | 正轉 |
| High(0) | Low (1) | 反轉 |
| Low (1) | Low (1) | 馬達停止 |
[材料]
• 麵包板 x 1• Arduino UNO R3 x 1
• 直流 5V 馬達 x 2
• L293D IC x 1
• 外接電源變壓器 x 1
• 18650 電池 x 2
• 連接線 x N條
[線路連接與電路圖]
| Arduino | L293D IC接腳 | 馬達一 | 馬達二 |
|---|---|---|---|
| Pin 3 | 1 | - | - |
| Pin 4 | 2 | - | - |
| - | 3 | - | 一端 |
| GND | 4 | - | - |
| - | 6 | - | 另一端 |
| Pin 5 | 7 | - | - |
| - | 8(外接電源+) | - | - |
| Pin 11 | 9 | - | - |
| Pin 10 | 10 | - | - |
| - | 11 | 一端 | - |
| GND | 12 | - | - |
| - | 14 | 另一端 | - |
| Pin 9 | 15 | - | - |
| 5V | 16 | - | - |
[程式碼]
//馬達一
#define M1Pin1 10
#define M1Pin2 9
#define E1Pin 11
//馬達二
#define M2Pin1 5
#define M2Pin2 4
#define E2Pin 3
void setup() {
pinMode(M1Pin1,OUTPUT);
pinMode(M1Pin2,OUTPUT);
pinMode(E1Pin,OUTPUT);
pinMode(M2Pin1,OUTPUT);
pinMode(M2Pin2,OUTPUT);
pinMode(E2Pin,OUTPUT);
motorstop();
}
void loop() {
directionControl();
motorstop();
delay(2000);
speedControl();
motorstop();
delay(3000);
}
void motorstop()
{
// 馬達停止
digitalWrite(M1Pin1, LOW);
digitalWrite(M1Pin2, LOW);
digitalWrite(M2Pin1, LOW);
digitalWrite(M2Pin2, LOW);
}
void directionControl()
{
// 設定馬達為最大速度,可設定範圍為 0 to 255
analogWrite(E1Pin, 255);
analogWrite(E2Pin, 255);
// 啟動馬達
digitalWrite(M1Pin1, HIGH);
digitalWrite(M1Pin2, LOW);
digitalWrite(M2Pin1, HIGH);
digitalWrite(M2Pin2, LOW);
delay(2000);
// 改變轉動方向
digitalWrite(M1Pin1, LOW);
digitalWrite(M1Pin2, HIGH);
digitalWrite(M2Pin1, LOW);
digitalWrite(M2Pin2, HIGH);
delay(2000);
}
// 控制馬達速度
void speedControl()
{
// 啟動馬達
digitalWrite(M1Pin1, LOW);
digitalWrite(M1Pin2, HIGH);
digitalWrite(M2Pin1, LOW);
digitalWrite(M2Pin2, HIGH);
// 加速 從最小到最大
for (int i = 0; i < 256; i++)
{
analogWrite(E1Pin, i);
analogWrite(E2Pin, i);
delay(20);
}
// 減速 從最大到最小
for (int i = 255; i >= 0; --i)
{
analogWrite(E1Pin, i);
analogWrite(E2Pin, i);
delay(20);
}
}
[實作結果]
[參考資料]
● Wikipedia:H-Bridge● Lastminuteengineers:Interface L298N DC Motor Driver Module with Arduino



如果要把L293D IC改成按鈕,要如何做電路,求解
回覆刪除請問可以讓它i遞減的速度更快嗎
回覆刪除張貼留言