ESP32-DC直流馬達測試

 ESP32-DC直流馬達測試

直流馬達是微控板常常在用的元件,最常搭配的是L298N
驅動裝置,因為如果把馬達直接接上微控板會導致燒掉

L298N驅動板

OUT1:直流電機A+端子
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信號,則可以控制電機的速度。電機速度與占空比成正比。但是,
請注意,對於小占空比,電機可能不會旋轉,並發出持續的嗡嗡聲。


接線

*記得L298N的GND要拉一條到ESP32的GND,否則馬達不會動作

程式

int M1 = 27;
int M2 = 26;
int enb = 14;
int duty = 150;
void setup() {
  Serial.begin(115200);
  pinMode(M1OUTPUT);
  pinMode(M2OUTPUT);
  pinMode(enbOUTPUT);

  ledcSetup(030008);
  ledcAttachPin(enb0);
}

void loop() {
  //forward
  Serial.println("forward");
  digitalWrite(M1LOW);
  digitalWrite(M2HIGH);
  delay(2000);
  //stop
  Serial.println("stop");
  digitalWrite(M1LOW);
  digitalWrite(M2LOW);
  delay(2000);
  //back
  Serial.println("back");
  digitalWrite(M1HIGH);
  digitalWrite(M2LOW);
  delay(2000);
  //stop
  Serial.println("stop");
  digitalWrite(M1LOW);
  digitalWrite(M2LOW);
  delay(2000);
  //pwm forward
  Serial.println("forward");
  digitalWrite(M1LOW);
  digitalWrite(M2HIGH);
  delay(2000);
  while (duty <= 255){
    Serial.println(duty);
    ledcWrite(0duty);
    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_IN1OUTPUT);
  pinMode(M1_IN2OUTPUT);
  pinMode(enbOUTPUT);
  //頻道0, 頻率3000, 解析度8
  ledcSetup(030008); 
  //enblePin, 通道
  ledcAttachPin(enb0);
}


loop裡面最後有while(),因為duty最大值到255,所以要讓它從150漸增到255
來觀察pwm的動作

void loop() {
  //forward
  Serial.println("forward");
  digitalWrite(M1_IN1LOW);
  digitalWrite(M1_IN2HIGH);
  delay(2000);
  //stop
  Serial.println("stop");
  digitalWrite(M1_IN1LOW);
  digitalWrite(M1_IN2LOW);
  delay(2000);
  //back
  Serial.println("back");
  digitalWrite(M1, HIGH);
  digitalWrite(M2, LOW);
  delay(2000);
  //stop
  Serial.println("stop");
  digitalWrite(M1_IN1LOW);
  digitalWrite(M1_IN2LOW);
  delay(2000);
  //pwm forward
  Serial.println("forward");
  digitalWrite(M1_IN1LOW);
  digitalWrite(M1_IN2HIGH);
  delay(2000);
  while (duty <= 255){
    Serial.println(duty);
    ledcWrite(0duty);
    duty += 5;
    delay(500);
  }
  delay(2000);
  duty = 150;
}

















































留言

這個網誌中的熱門文章