Mạch Cầu H Điều Khiển 2 Động Cơ MKS H2407ND / XY-160D 7A 160W | Hướng Dẫn

Mạch Cầu H Điều Khiển 2 Động Cơ MKS H2407ND / XY-160D

Giới thiệu

Mạch cầu H XY-160D  Mạch Cầu H MKS H2407ND là trình điều khiển động cơ DC kép cấu hình thấp siêu nhỏ dành cho các dự án hạn chế về không gian, có khả năng cung cấp công suất cao lên đến 7A trên mỗi kênh đầu ra. Nó sử dụng logic tương tự như trình điều khiển động cơ L298, nơi bạn điều khiển trình điều khiển bằng 3 chân tín hiệu (IN1, IN2, ENABLE). Trình điều khiển động cơ này được điều khiển bởi MOSFET công suất cao, với bộ ghép quang tín hiệu điều khiển được cách ly để bảo vệ mọi sự cố về mạch điện và vòng tiếp đất. Bạn có thể điều khiển trình điều khiển này bằng cả logic 3,3V và 5V.

Thông số kỹ thuật

  • Điện áp nguồn: 7 ~ 24 VDC. (Giới hạn: 6.5~27VDC).
  • Mức tín hiệu điều khiển (Tương thích 3.3V/5V)
  • Logic Cao (H): DC 3.0 ~ 6.5V
  • Logic Thấp (L): DC0 ~ 0.8V
  • Kênh đầu ra: 2.
  • Dòng tín hiệu điều khiển: 3 ~ 11 mA
  • Dòng hoạt động liên tục tối đa: 7A
  • Dòng điện cực đại: 50A.
  • Kiểm soát tốc độ PWM: 0 ~ 10KHz
  • Độ rộng xung hợp lệ tối thiểu: 5us
  • Nhiệt độ làm việc: -25 ~ 85 °C
  • Lỗ gắn: M3.
  • Kích thước (Dài x Rộng x Cao): 55 x 55 x 13(mm)

Sơ đồ chân

Nhãn Chức năng Mô tả
1 9~24VDC Nguồn dương cấp cho tải
2 PGND Nguồn âm cấp cho tải
3 OUT1 Đầu ra Motor 1 +
4 OUT2 Đầu ra Motor 1 -
5 OUT3 Đầu ra Motor 2 +
6 OUT4 Đầu ra Motor 2 -
7 ENA Kích hoạt Motor 1/Ngõ vào điều khiển PWM
8 IN1 Ngõ vào điều khiển Motor 1
9 IN2 Ngõ vào điều khiển Motor 1
10 ENB Kích hoạt Motor 2/Ngõ vào điều khiển PWM
11 IN3 Ngõ vào điều khiển Motor 2
12 IN4 Ngõ vào điều khiển Motor 2
13 +5V Nguồn cấp 5V cho mạch điều khiển logic
  GND Nguồn cấp âm cho mạch điều khiển logic

Sơ đồ kết nối

Lưu ý: Cần gắn thêm cầu chì bảo vệ quá tải đầu vào và đầu ra như hình để tránh trường hợp động cơ bị chạm chập, quá tải dẫn đến quá công suất và làm cháy mạch.

Chức năng điều khiển logic

Bảng logic điều khiển động cơ 1

IN1 IN2 ENA1 OUT1-OUT2 (Motor-1)
0 0 X Phanh động cơ
1 1 X Floating
1 0 PWM Tiến + Điều khiển tốc độ
0 1 PWM Lùi + Điều khiển tốc độ
1 0 1 Tiến tốc độ tối đa
0 1 1 Lùi tốc độ tối đa

Bảng logic điều khiển động cơ 2

IN3 IN4 ENA2 OUT3-OUT4 (Motor-2)
0 0 X Phanh động cơ
1 1 X Floating
1 0 PWM Tiến + Điều khiển tốc độ
0 1 PWM Lùi + Điều khiển tốc độ
1 0 1 Tiến tốc độ tối đa
0 1 1 Lùi tốc độ tối đa

Ví dụ ứng dụng với Arduino

Mạch cầu H MKS H2407ND / XY-160D Arduino
IN1 D5
IN2 D4
ENA D6
IN3 D8
IN4 D7
ENB D9

Code

const int IN1=5;
const int IN2=4;
const int ENA=6;
const int IN3=8;
const int IN4=7;
const int ENB=9;
void setup() {
 pinMode(IN1, OUTPUT);
 pinMode(IN2, OUTPUT);
 pinMode(ENA, OUTPUT);

 pinMode(IN4, OUTPUT);
 pinMode(IN3, OUTPUT);
 pinMode(ENB, OUTPUT);
}
void loop() {
Motor1_Brake();
Motor2_Brake();
delay(100);
Motor1_Forward(200);
Motor2_Forward(200);
delay(1000);
Motor1_Brake();
Motor2_Brake();
delay(100);
Motor1_Backward(200);
Motor2_Backward(200);
delay(1000);
}
void Motor1_Forward(int Speed)
{
 digitalWrite(IN1,HIGH);
 digitalWrite(IN2,LOW);
 analogWrite(ENA,Speed);
}

void Motor1_Backward(int Speed)
{
 digitalWrite(IN1,LOW);
 digitalWrite(IN2,HIGH);
 analogWrite(ENA,Speed);
}
void Motor1_Brake()
{
 digitalWrite(IN1,LOW);
 digitalWrite(IN2,LOW);
}
void Motor2_Forward(int Speed)
{
 digitalWrite(IN3,HIGH);
 digitalWrite(IN4,LOW);
 analogWrite(ENB,Speed);
}

void Motor2_Backward(int Speed)
{
 digitalWrite(IN3,LOW);
 digitalWrite(IN4,HIGH);
 analogWrite(ENB,Speed);
}
void Motor2_Brake()
{
 digitalWrite(IN3,LOW);
 digitalWrite(IN4,LOW);
}

 Bạn nên chú ý hai động cơ DC quay tiến và lùi với hành động phanh.

Giải thích Code

Phần khai báo các chân kết nối

const int IN1 = 5;
const int IN2 = 4;
const int ENA = 6;
const int IN3 = 8;
const int IN4 = 7;
const int ENB = 9;
  • IN1, IN2: Chân điều khiển hướng quay của động cơ 1.
  • ENA: Chân điều khiển tốc độ (PWM) của động cơ 1.
  • IN3, IN4: Chân điều khiển hướng quay của động cơ 2.
  • ENB: Chân điều khiển tốc độ (PWM) của động cơ 2.

Hàm setup()

void setup() {
 pinMode(IN1, OUTPUT);
 pinMode(IN2, OUTPUT);
 pinMode(ENA, OUTPUT);
 pinMode(IN4, OUTPUT);
 pinMode(IN3, OUTPUT);
 pinMode(ENB, OUTPUT);
}

Hàm này được gọi một lần khi Arduino khởi động. Mục đích:

  • Cấu hình các chân điều khiển (IN1, IN2, ENA, IN3, IN4, ENB) làm ngõ ra (OUTPUT).

Hàm loop()

void loop() {
 Motor1_Brake();
 Motor2_Brake();
 delay(100);

 Motor1_Forward(200);
 Motor2_Forward(200);
 delay(1000);

 Motor1_Brake();
 Motor2_Brake();
 delay(100);

 Motor1_Backward(200);
 Motor2_Backward(200);
 delay(1000);
}
  • Vòng lặp vô hạn:
    • Phanh cả hai động cơ (Motor1_Brake()Motor2_Brake()).
    • Chạy cả hai động cơ tiến (Motor1_Forward()Motor2_Forward()) với tốc độ 200 trong 1 giây.
    • Phanh cả hai động cơ trong 100ms.
    • Chạy cả hai động cơ lùi (Motor1_Backward()Motor2_Backward()) với tốc độ 200 trong 1 giây.

Hàm điều khiển động cơ 1, 2 ( Động cơ 2 tương tự)

1. Motor1_Forward(int Speed)

void Motor1_Forward(int Speed) {
 digitalWrite(IN1, HIGH);
 digitalWrite(IN2, LOW);
 analogWrite(ENA, Speed);
}
  • Mục đích: Làm động cơ 1 quay tiến.
  • digitalWrite(IN1, HIGH)digitalWrite(IN2, LOW): Thiết lập hướng quay của động cơ.
  • analogWrite(ENA, Speed): Điều chỉnh tốc độ động cơ với giá trị PWM từ 0 đến 255.

2. Motor1_Backward(int Speed)

void Motor1_Backward(int Speed) {
 digitalWrite(IN1, LOW);
 digitalWrite(IN2, HIGH);
 analogWrite(ENA, Speed);
}
  • Mục đích: Làm động cơ 1 quay lùi.
  • digitalWrite(IN1, LOW)digitalWrite(IN2, HIGH): Thiết lập hướng quay ngược.
  • analogWrite(ENA, Speed): Điều chỉnh tốc độ quay lùi.

3. Motor1_Brake()

void Motor1_Brake() {
 digitalWrite(IN1, LOW);
 digitalWrite(IN2, LOW);
}
  • Mục đích: Phanh động cơ 1.
  • Đưa cả IN1IN2 về LOW, ngắt dòng điện qua động cơ, dừng quay.

Cách sử dụng

  1. Kết nối phần cứng:
    • Động cơ 1 kết nối với cầu H thông qua IN1, IN2, ENA.
    • Động cơ 2 kết nối với cầu H thông qua IN3, IN4, ENB.
  2. Tải mã lên Arduino.
  3. Động cơ sẽ thực hiện tuần tự:
    • Phanh.
    • Chạy tiến với tốc độ 200.
    • Phanh.
    • Chạy lùi với tốc độ 200.

Bạn có thể điều chỉnh tốc độ động cơ bằng cách thay đổi tham số Speed trong các hàm MotorX_ForwardMotorX_Backward.

Điều khiển động cơ DC bằng Arduino với hai nút nhấn và biến trở

Chức năng chính:

  1. Nút nhấn BT1: Chuyển đổi chế độ hoạt động.

  2. Nút nhấn BT2: Bật/tắt động cơ.

  • Mode 1: Cả hai động cơ quay thuận.
  • Mode 2: Cả hai động cơ quay nghịch.
  • Mode 3: Động cơ luân phiên quay thuận và nghịch sau mỗt khoảng thời gian.

Điều chỉnh tốc độ và thời gian:

  • VR1 (biến trở): Thay đổi tốc độ quay (0-255).
  • VR2 (biến trở): Thay đổi thời gian đổi chiều trong chế độ luân phiên (200ms - 10s).

Hiển thị qua Serial Monitor:

  • Trạng thái động cơ (đang bật hay tắt).
  • Chế độ hoạt động.
  • Tốc độ quay và thời gian đổi chiều.

Thành phần cần thiết

STT XY-160D Số lượng
1 Arduino UNO 1
2 Mạch Cầu H XY-160D 1
3 WH148-3P-103 Biến Trở 10 KOhm 2
4 Nút nhấn 2 chân 2

Sơ đồ kết nối

XY-160D ARDUINO
5V 5V
GND GND
IN1 D5
IN2 D4
ENA D6
IN3 D8
IN4 D7
ENB D9
BUTTON ARDUINO
1 GND
BT1 (2) D2
BT2 (2) D3
VR 10Kohm ARDUINO
1 GND
3 5V
VR1 (2) A0
VR2 (2) A1
const int BT1 = 3;  // Nút chọn chế độ
const int BT2 = 2;  // Nút bật/tắt động cơ

const int IN1 = 5;
const int IN2 = 4;
const int ENA = 6;
const int IN3 = 8;
const int IN4 = 7;
const int ENB = 9;

int previousValue_VR1 = -1;        // Giá trị trước đó của VR1
int previousValue_VR2 = -1;        // Giá trị trước đó của VR2
unsigned long previousMillis = 0;  // Biến lưu thời gian trước đó
unsigned long interval = 0;        // Khoảng thời gian
bool isMotorOn = false;            // Trạng thái bật/tắt động cơ
bool lastButtonState_BT1 = HIGH;   // Trạng thái trước đó của BT1
bool lastButtonState_BT2 = HIGH;   // Trạng thái trước đó của BT2
int mode = 1;                      // Chế độ hoạt động: 1, 2 hoặc 3

void setup() {
  Serial.begin(9600);  // Khởi động giao tiếp Serial

  pinMode(BT1, INPUT_PULLUP);
  pinMode(BT2, INPUT_PULLUP);

  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(ENA, OUTPUT);

  pinMode(IN4, OUTPUT);
  pinMode(ENB, OUTPUT);
  pinMode(IN3, OUTPUT);
}

void loop() {
  int currentValue_VR1 = analogRead(A0);  // Đọc giá trị từ chân A0
  int mappedValue_VR1;
  int thresholdSpeed = 4;      // Ngưỡng thay đổi để xác định khi nào in giá trị
  int thresholdInterval = 10;  // Ngưỡng thay đổi để xác định khi nào in giá trị
  // Cập nhật khoảng thời gian (interval) từ VR2
  if (abs(currentValue_VR1 - previousValue_VR1) > thresholdSpeed) {  // Chỉ in khi thay đổi lớn hơn ngưỡng
    previousValue_VR1 = currentValue_VR1;                            // Cập nhật giá trị trước đó
    mappedValue_VR1 = map(currentValue_VR1, 0, 1023, 0, 255);        // Chuyển đổi giá trị VR1
    Serial.print("Speed: ");
    Serial.println(mappedValue_VR1);  // In giá trị interval ra Serial
  }
  int currentValue_VR2 = analogRead(A1);  // Đọc giá trị từ chân A1
  int mappedValue_VR2;

  // Kiểm tra trạng thái nút bật/tắt động cơ
  bool buttonState_BT1 = digitalRead(BT1);
  if (buttonState_BT1 == LOW && lastButtonState_BT1 == HIGH) {  // Phát hiện nút nhấn BT1
    isMotorOn = !isMotorOn;                                     // Đổi trạng thái bật/tắt động cơ
    Serial.println(isMotorOn ? "Motor ON" : "Motor OFF");
    delay(50);  // Chống dội phím
  }
  lastButtonState_BT1 = buttonState_BT1;  // Cập nhật trạng thái BT1

  // Kiểm tra trạng thái nút chọn chế độ
  bool buttonState_BT2 = digitalRead(BT2);
  if (buttonState_BT2 == LOW && lastButtonState_BT2 == HIGH) {  // Phát hiện nút nhấn BT2
    mode = (mode % 3) + 1;                                      // Chuyển sang chế độ tiếp theo (1 -> 2 -> 3 -> 1)

    // Hiển thị chế độ hiện tại
    switch (mode) {
      case 1:
        Serial.println("Mode 1: Quay thuan");  // In chế độ quay thuận
        break;
      case 2:
        Serial.println("Mode 2: Quay nghich");  // In chế độ quay nghịch
        break;
      case 3:
        Serial.println("Mode 3: Quay thuan & nghich");  // In chế độ quay thuận và nghịch
        break;
      default:
        Serial.println("Unknown Mode");  // Dự phòng lỗi (không nên xảy ra)
        break;
    }

    delay(50);  // Chống dội phím
  }

  lastButtonState_BT2 = buttonState_BT2;  // Cập nhật trạng thái BT2

  // Nếu động cơ đang bật
  if (isMotorOn) {
    // Cập nhật khoảng thời gian (interval) từ VR2
    if (abs(currentValue_VR2 - previousValue_VR2) > thresholdInterval) {
      previousValue_VR2 = currentValue_VR2;                          // Cập nhật giá trị trước đó
      mappedValue_VR2 = map(currentValue_VR2, 0, 1023, 200, 10000);  // Chuyển đổi giá trị
      interval = mappedValue_VR2;
      Serial.print("Interval: ");
      Serial.println(mappedValue_VR2);  // In giá trị interval ra Serial
    }

    // Thực hiện hành động dựa trên chế độ
    if (mode == 1) {
      Motor1_Forward(mappedValue_VR1);  // Chỉ quay thuận
      Motor2_Forward(mappedValue_VR1);  // Chỉ quay thuận
    } else if (mode == 2) {
      Motor1_Backward(mappedValue_VR1);  // Chỉ quay nghịch
      Motor2_Backward(mappedValue_VR1);  // Chỉ quay nghịch
    } else if (mode == 3) {
      unsigned long currentMillis = millis();  // Đọc thời gian hiện tại
      if (currentMillis - previousMillis >= interval) {
        previousMillis = currentMillis;  // Cập nhật thời gian trước đó
        static bool isForward = true;    // Biến lưu trạng thái quay
        if (isForward) {
          Motor1_Forward(mappedValue_VR1);  // Quay thuận
          Motor2_Forward(mappedValue_VR1);  // Quay thuận
        } else {
          Motor1_Backward(mappedValue_VR1);  // Quay nghịch
          Motor2_Backward(mappedValue_VR1);  // Quay nghịch
        }
        isForward = !isForward;  // Đổi chiều quay
      }
    }
  } else {
    Motor1_Brake();
    Motor2_Brake();
  }
}

void Motor1_Forward(int Speed) {
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  analogWrite(ENA, Speed);
}

void Motor1_Backward(int Speed) {
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  analogWrite(ENA, Speed);
}
void Motor1_Brake() {
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
}
void Motor2_Forward(int Speed) {
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  analogWrite(ENB, Speed);
}

void Motor2_Backward(int Speed) {
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  analogWrite(ENB, Speed);
}
void Motor2_Brake() {
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
}

Video:

 

Nhận xét

Mới hơn Cũ hơn