ESP32-DC直流馬達測試


ESP32-DC直流馬達測試

tags: esp32 dc moto l298n

直流馬達是微控板常常在用的元件,最常搭配的是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(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;

}


文章作者: blairan
版權聲明: 本博客所有文章除特別聲明外,均採用 CC BY 4.0 許可協議。轉載請註明來源 blairan !
评论
  目錄