Điều khiển động cơ

PWM là gì trong điều khiển động cơ?

7 phút đọc08/05/2024Trần Bảo Nam
PWM là gì trong điều khiển động cơ?

Hiểu rõ nguyên lý của PWM và cách điều chỉnh tốc độ động cơ DC hiệu quả. Trong bài viết này, chúng ta sẽ cùng tìm hiểu chi tiết và ứng dụng thực tế trong robot.

PWM là gì trong điều khiển động cơ?

PWM — Pulse Width Modulation

PWM (Điều chế độ rộng xung) là kỹ thuật tạo tín hiệu analog từ digital bằng cách thay đổi tỉ lệ thời gian HIGH/LOW của xung.

Duty Cycle = (Thời gian HIGH / Chu kỳ) × 100%

code
Duty 25%: |██░░░░░░|██░░░░░░|  → tốc độ thấp
Duty 50%: |████░░░░|████░░░░|  → tốc độ trung bình
Duty 75%: |██████░░|██████░░|  → tốc độ cao
Duty 100%:|████████|████████|  → tốc độ tối đa

Tần số PWM

Arduino Uno PWM mặc định:

  • Pin 5, 6: 980 Hz
  • Pin 3, 9, 10, 11: 490 Hz

Motor DC hoạt động tốt ở 1–20 kHz. 490Hz đủ dùng cho robot cơ bản.

Code điều chỉnh tốc độ motor với PWM

cpp
const int ENA = 9;   // Enable A — kết nối L298N ENA
const int IN1 = 7;   // Direction 1
const int IN2 = 8;   // Direction 2

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

void setMotorSpeed(int speed) {
  // speed: -255 (lùi tối đa) đến +255 (tiến tối đa), 0 = dừng
  if (speed > 0) {
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    analogWrite(ENA, speed);
  } else if (speed < 0) {
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    analogWrite(ENA, -speed);
  } else {
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    analogWrite(ENA, 0);
  }
}

void loop() {
  // Tăng tốc từ 0 đến tối đa
  for (int s = 0; s <= 255; s += 5) {
    setMotorSpeed(s);
    delay(50);
  }
  delay(1000);

  // Giảm tốc
  for (int s = 255; s >= 0; s -= 5) {
    setMotorSpeed(s);
    delay(50);
  }
  delay(500);

  // Chạy ngược
  for (int s = 0; s >= -255; s -= 5) {
    setMotorSpeed(s);
    delay(50);
  }
  delay(1000);
}

LED Dimming với PWM

cpp
const int LED = 9;

void setup() { pinMode(LED, OUTPUT); }

void loop() {
  // Fade in
  for (int b = 0; b <= 255; b++) {
    analogWrite(LED, b);
    delay(5);
  }
  // Fade out
  for (int b = 255; b >= 0; b--) {
    analogWrite(LED, b);
    delay(5);
  }
}

Tại sao không dùng điện trở để giảm tốc motor?

Điện trở tiêu hao điện năng dưới dạng nhiệt. PWM chuyển mạch nhanh giữa ON/OFF — motor nhận đúng điện áp lúc ON, không tốn điện lúc OFF. Hiệu suất PWM: 85–95%, điện trở: 30–50%.

Gợi ý dùng bài viết trong lớp học

Câu hỏi khởi động

  • Linh kiện/kỹ thuật trong bài giải quyết vấn đề gì trong robot thật?
  • Nếu nối sai nguồn hoặc đọc sai tín hiệu, robot sẽ biểu hiện như thế nào?
  • Có cách nào đo hoặc quan sát hiện tượng thay vì đoán lỗi không?

Hoạt động thực hành nhanh

  1. Giáo viên cho học viên xem linh kiện hoặc sơ đồ liên quan đến chủ đề PWM là gì trong điều khiển động cơ?.
  2. Học viên dự đoán chân nguồn, chân tín hiệu và dữ liệu đầu ra.
  3. Chạy code mẫu ở cấu hình an toàn, sau đó thay đổi một tham số.
  4. Mỗi nhóm ghi nhận lỗi gặp phải và cách kiểm tra theo thứ tự nguồn, GND, tín hiệu, code.

Checklist kỹ thuật

  • Luôn kiểm tra điện áp hoạt động trước khi nối với board điều khiển.
  • In dữ liệu ra Serial Monitor khi làm việc với cảm biến hoặc thuật toán.
  • Với motor/servo, cấp nguồn tải riêng và nối chung GND với board.
  • Ghi lại thông số đã calibration để lần sau không phải chỉnh lại từ đầu.

Câu hỏi ôn tập

  • Thông số nào quan trọng nhất khi chọn linh kiện này cho robot?
  • Lỗi nào dễ xảy ra nhất trong lớp học và cách phát hiện nhanh nhất là gì?
  • Có thể mở rộng kiến thức này thành dự án robot nào?

Tài nguyên tải về

Tải bản PDF của bài viết để in giáo án hoặc gửi trước cho học viên.

Tải PDF
Chia sẻ bài viết

Mục lục bài viết

Tác giả

T

Trần Bảo Nam

Kỹ sư điện tử & Lập trình viên

Thực hành với bộ kit robot

Tự tay lắp ráp và lập trình robot với bộ kit từ Học Lập Trình Robot!

Xem bộ kit