ESP32-DC直流馬達測試
ESP32-DC直流馬達測試
直流馬達是微控板常常在用的元件,最常搭配的是L298N
驅動裝置,因為如果把馬達直接接上微控板會導致燒掉
L298N驅動板
OUT1:直流電機A+端子
OUT2:直流電機 A – 端子
OUT3:直流電機B+端子
OUT4:直流電機 B – 端子
OUT2:直流電機 A – 端子
OUT3:直流電機B+端子
OUT4:直流電機 B – 端子
這裡要特別注意的地方
在底部,您有一個帶有 +12V、GND 和 +5V 的三接線端子。
一般用18650電池二~三顆供電的話接+12V和GND,如果要
額外接微控板例如esp32或arduino,在+5V和GND就是往外
供電給微控板的5V。
注意:如果供電超過12V,需要去掉跳線,給+5V端供電5V。
使能(Enble)引腳
如果您向使能 A 引腳發送 HIGH 信號,則電機 A 已準備好以最大速度進行控制;
如果向使能 A 引腳發送 LOW 信號,則電機 A 關閉;
如果發送PWM信號,則可以控制電機的速度。電機速度與占空比成正比。但是,
如果您向使能 A 引腳發送 HIGH 信號,則電機 A 已準備好以最大速度進行控制;
如果向使能 A 引腳發送 LOW 信號,則電機 A 關閉;
如果發送PWM信號,則可以控制電機的速度。電機速度與占空比成正比。但是,
請注意,對於小占空比,電機可能不會旋轉,並發出持續的嗡嗡聲。
接線
*記得L298N的GND要拉一條到ESP32的GND,否則馬達不會動作
程式
int M1 = 27;
int M2 = 26;
int enb = 14;
int duty = 150;
void setup() {
Serial.begin(115200);
pinMode(M1, OUTPUT);
pinMode(M2, OUTPUT);
pinMode(enb, OUTPUT);
ledcSetup(0, 3000, 8);
ledcAttachPin(enb, 0);
}
void loop() {
//forward
Serial.println("forward");
digitalWrite(M1, LOW);
digitalWrite(M2, HIGH);
delay(2000);
//stop
Serial.println("stop");
digitalWrite(M1, LOW);
digitalWrite(M2, LOW);
delay(2000);
//back
Serial.println("back");
digitalWrite(M1, HIGH);
digitalWrite(M2, LOW);
delay(2000);
//stop
Serial.println("stop");
digitalWrite(M1, LOW);
digitalWrite(M2, LOW);
delay(2000);
//pwm forward
Serial.println("forward");
digitalWrite(M1, LOW);
digitalWrite(M2, HIGH);
delay(2000);
while (duty <= 255){
Serial.println(duty);
ledcWrite(0, duty);
duty += 5;
delay(500);
}
delay(2000);
duty = 150;
}
解析
//馬達1的正反轉腳位
int M1_IN1 = 27;
int M1_IN2 = 26;
int enb = 14; //使能控制腳位
int duty = 150; //PWM的dutyclcyle預設150,不能太小,值太小馬達不會轉
void setup() {
Serial.begin(115200);
pinMode(M1_IN1, OUTPUT);
pinMode(M1_IN2, OUTPUT);
pinMode(enb, OUTPUT);
//頻道0, 頻率3000, 解析度8
ledcSetup(0, 3000, 8);
//enblePin, 通道
ledcAttachPin(enb, 0);
}
loop裡面最後有while(),因為duty最大值到255,所以要讓它從150漸增到255
來觀察pwm的動作
void loop() {
//forward
Serial.println("forward");
digitalWrite(M1_IN1, LOW);
digitalWrite(M1_IN2, HIGH);
delay(2000);
//stop
Serial.println("stop");
digitalWrite(M1_IN1, LOW);
digitalWrite(M1_IN2, LOW);
delay(2000);
//back
Serial.println("back");
digitalWrite(M1, HIGH);
digitalWrite(M2, LOW);
delay(2000);
//stop
Serial.println("stop");
digitalWrite(M1_IN1, LOW);
digitalWrite(M1_IN2, LOW);
delay(2000);
//pwm forward
Serial.println("forward");
digitalWrite(M1_IN1, LOW);
digitalWrite(M1_IN2, HIGH);
delay(2000);
while (duty <= 255){
Serial.println(duty);
ledcWrite(0, duty);
duty += 5;
delay(500);
}
delay(2000);
duty = 150;
}
留言
張貼留言