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 và 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.
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);
}
Nhận xét