Điều khiển động cơ DC với Driver DRV8833 và Arduino

Điều khiển động cơ DC với Driver DRV8833 và Arduino

Điều khiển động cơ DC là một ứng dụng được sử dụng rất nhiều trong các dự án như xe điều khiển, robot tránh vật cản. Driver DRV8833 là một mạch điều khiển động cơ DC nhỏ gọn, giá thành rẻ và dễ dàng giao tiếp với các động cơ thông qua Arduino.

Trong bài viết này, chúng ta sẽ khám phá cách sử dụng Driver DRV8833 kết hợp với Arduino để điều khiển động cơ DC. Qua đó sẽ tìm hiểu về cách kết nối, sơ đồ chân, và nguyên lý hoạt động của DRV8833.

Để tạo động lực cho Team Arduino KIT ra nhiều bài viết chất lượng hơn, các bạn có thể ủng hộ mình bằng cách Donate qua MoMo, Ngân hàng, Paypal…Nhấn vào link bên dưới nhé.

Linh kiện cần thiết cho dự án

TÊN LINH KIỆN SỐ LƯỢNG NƠI BÁN
Arduino Uno R3 1 Shopee | Cytron
Mạch điều khiển động cơ DC DRV8833 1 Shopee | Cytron
Động cơ vàng 2 Shopee | Cytron
Dây cắm 10-20 Shopee | Cytron
Breadboard 1 Shopee | Cytron

Mạch điều khiển động cơ DC DRV8833

DRV8833 là một chip điều khiển động cơ DC. Nó cung cấp một cách dễ dàng và hiệu quả để điều khiển tốc độ và hướng di chuyển của động cơ DC.

DRV8833 được tích hợp mạch điều khiển động cơ H-bridge kép, có nghĩa là nó có thể điều khiển hai động cơ DC riêng biệt. Mỗi mạch H-bridge bao gồm hai transistor có thể bật và tắt dòng điện của động cơ, cho phép di chuyển tiến và di chuyển lùi.

Chip này có thể điều khiển động cơ với dải điện áp từ 2.7V đến 10.8V và dòng liên tục tối đa 1.2A cho mỗi mạch H-bridge. Nó cũng hỗ trợ điều khiển PWM (Pulse Width Modulation) để điều chỉnh tốc độ.

DRV8833 Arduino có thể được điều khiển bằng tín hiệu logic từ Arduino. Nó sử dụng hai chân đầu vào cho mỗi động cơ, một chân để điều khiển hướng (IN1 và IN2) và một chân khác để điều khiển kích hoạt động cơ (EN1 và EN2). Bằng cách chuyển đổi các tín hiệu đầu vào này, bạn có thể điều khiển hướng và tốc độ của động cơ.

Chip cũng bao gồm một số tính năng bảo vệ, như bảo vệ quá dòng và quá nhiệt, để ngăn hư hỏng động cơ và bảo vệ chính mạch điều khiển.

Xem thêm: Điều khiển động cơ bước với Driver A4988 và Arduino

Thông số kỹ thuật

Motor Voltage 2.7V – 10.8V
Logic Voltage 3V- and 5V-compatible
Continuous Output Current 1.2A (Per Channel)
Peak Output Current 2A (Per Channel)
Motor Channels 2
Protection Features under-voltage lockout, over-current, and over-temperature

Sơ đồ chân của mạch điều khiển động cơ DC DRV8833

Mạch điều khiển động cơ DC DRV8833 có tổng cộng 12 chân, các bạn có thể tham khảo theo sơ đồ chân bên dưới:

Chân nguồn

VCCGND là hai chân dùng để cấp nguồn điện để điều khiển động cơ, có thể nằm trong khoảng từ 2,7V đến 10,8V.

Chân đầu ra

Các chân đầu ra của mạch điều khiển động cơ DRV8833, cụ thể là OUT1, OUT2, OUT3 và OUT4 được đặt ở một bên thuận tiện và dễ dàng hơn trong quá trình giao tiếp.

Động cơ A nên được nối với OUT1 và OUT2, và Động cơ B nối với OUT3 và OUT4. Bạn có thể đấu nối với bất kỳ động cơ DC có chổi than nào có dải điện áp từ 2,7 V đến 10,8 V.

Driver DRV8833 có thể cung cấp liên tục 1,2 A trên mỗi kênh (đỉnh 2 A) cho một cặp động cơ DC.

Chân điều khiển đầu vào

Mỗi động cơ sẽ có hai chân điều khiển hướng; IN1 và IN2 là hai chân dùng để điều khiển cho Động cơ A, hai chân còn lại IN3, IN4 điều khiển cho Động cơ B. Các chân điều khiển đầu vào này cho phép điều khiển tốc độ và hướng quay của động cơ.

Điều khiển hướng

Có thể điều khiển hướng quay của động cơ bằng cách áp dụng mức logic CAO (5V) hoặc mức logic THẤP (GND) cho các đầu vào. Dưới đây là bảng mô tả cách lựa chọn chế độ các bạn có thể tham khảo.

IN1/IN3 IN2/IN4 Spinning Direction
Low(0) Low(0) Motor OFF
High(1) Low(0) Forward
Low(0) High(1) Reverse
High(1) High(1) Motor OFF

Điều khiển tốc độ

Nếu bạn muốn điều chỉnh tốc độ của động cơ DC, thì có thể sử dụng chế độ PWM. Nếu không, chỉ cần đặt DRV8833 ở mức HIGH hoặc LOW.

Chân chế độ ngủ (Sleep Mode)

Chế độ Sleep Mode của Mạch điều khiển động cơ DC DRV8833 là chế độ tiết kiệm năng lượng. Khi chân Sleep (SLEEP) được đặt ở mức thấp, DRV8833 sẽ chuyển sang chế độ này.

Trong chế độ Sleep Mode, các H-bridge (bộ cầu H) trong DRV8833 Arduino sẽ bị vô hiệu hóa, “gate drive charge pump” sẽ dừng hoạt động, mạch logic nội bộ sẽ được đặt lại, tất cả các tín hiệu đầu vào sẽ bị bỏ qua và tất cả các xung clock nội bộ sẽ bị dừng lại.

Chế độ Sleep Mode giúp tiết kiệm năng lượng khi không sử dụng động cơ. Tuy nhiên, khi thoát khỏi chế độ ngủ, việc điều khiển động cơ cần một khoảng thời gian nhất định (lên đến 1 mili giây) để trở lại hoạt động bình thường.

Mặc định, chân Sleep (SLEEP) trên bo mạch DRV8833 được kéo lên mức cao, do đó chế độ Sleep Mode không được kích hoạt. Nếu không dùng chế độ tiết kiệm năng lượng, bạn không cần đấu nối chân này.

Ở mặt sau của Module DRV8833, có một jumper hàn J1. Mặc định, J1 được đóng, kết nối một pull-up trên bo mạch đến chân Sleep, giữ cho DRV8833 hoạt động. Tuy nhiên, nếu bạn mở J1, pull-up trên bo mạch sẽ bị ngắt kết nối với chân Sleep. Điều này sẽ kích hoạt chế độ pulldown trên chip, khiến DRV8833 mặc định bị vô hiệu hóa.

Chân phát hiện lỗi

Chân FAULT là một đầu ra open-drain, có nghĩa là khi xảy ra tình trạng quá dòng, quá nhiệt hoặc dưới điện áp, chip sẽ kéo chân này xuống mức thấp.

Mặc định, chân này không được kết nối. Vì vậy, nếu bạn muốn xác định lỗi trên mạch điều khiển động cơ, bạn cần kết nối một điện trở pull-up bên ngoài (hoặc sử dụng chân INPUT của vi điều khiển được tích hợp pull-up).

Sơ đồ đấu nối Mạch điều khiển động cơ DC DRV8833 với Arduino

Module Driver DRV8833 Arduino
GND GND
IN1 10
IN2 9
IN3 6
IN4 5

Code DRV8833

// Define the control inputs
#define MOT_A1_PIN 10
#define MOT_A2_PIN 9
#define MOT_B1_PIN 6
#define MOT_B2_PIN 5

void setup(void)
{
  // Set all the motor control inputs to OUTPUT
  pinMode(MOT_A1_PIN, OUTPUT);
  pinMode(MOT_A2_PIN, OUTPUT);
  pinMode(MOT_B1_PIN, OUTPUT);
  pinMode(MOT_B2_PIN, OUTPUT);

  // Turn off motors - Initial state
  digitalWrite(MOT_A1_PIN, LOW);
  digitalWrite(MOT_A2_PIN, LOW);
  digitalWrite(MOT_B1_PIN, LOW);
  digitalWrite(MOT_B2_PIN, LOW);

  // Initialize the serial UART at 9600 baud
  Serial.begin(9600);
}

void loop(void)
{
  // Generate a fixed motion sequence to demonstrate the motor modes.

  // Ramp speed up.
  for (int i = 0; i < 11; i++) {
    spin_and_wait(25*i, 25*i, 500);
  }
  // Full speed forward.
  spin_and_wait(255,255,2000);

  // Ramp speed into full reverse.
  for (int i = 0; i < 21 ; i++) {
    spin_and_wait(255 - 25*i, 255 - 25*i, 500);
  }

  // Full speed reverse.
  spin_and_wait(-255,-255,2000);

  // Stop.
  spin_and_wait(0,0,2000);

  // Full speed, forward, turn, reverse, and turn for a two-wheeled base.
  spin_and_wait(255, 255, 2000);
  spin_and_wait(0, 0, 1000);
  spin_and_wait(-255, 255, 2000);
  spin_and_wait(0, 0, 1000);
  spin_and_wait(-255, -255, 2000);
  spin_and_wait(0, 0, 1000);
  spin_and_wait(255, -255, 2000);
  spin_and_wait(0, 0, 1000);
}

/// Set the current on a motor channel using PWM and directional logic.
///
/// \param pwm    PWM duty cycle ranging from -255 full reverse to 255 full forward
/// \param IN1_PIN  pin number xIN1 for the given channel
/// \param IN2_PIN  pin number xIN2 for the given channel
void set_motor_pwm(int pwm, int IN1_PIN, int IN2_PIN)
{
  if (pwm < 0) {  // reverse speeds
    analogWrite(IN1_PIN, -pwm);
    digitalWrite(IN2_PIN, LOW);

  } else { // stop or forward
    digitalWrite(IN1_PIN, LOW);
    analogWrite(IN2_PIN, pwm);
  }
}

/// Set the current on both motors.
///
/// \param pwm_A  motor A PWM, -255 to 255
/// \param pwm_B  motor B PWM, -255 to 255
void set_motor_currents(int pwm_A, int pwm_B)
{
  set_motor_pwm(pwm_A, MOT_A1_PIN, MOT_A2_PIN);
  set_motor_pwm(pwm_B, MOT_B1_PIN, MOT_B2_PIN);

  // Print a status message to the console.
  Serial.print("Set motor A PWM = ");
  Serial.print(pwm_A);
  Serial.print(" motor B PWM = ");
  Serial.println(pwm_B);
}

/// Simple primitive for the motion sequence to set a speed and wait for an interval.
///
/// \param pwm_A  motor A PWM, -255 to 255
/// \param pwm_B  motor B PWM, -255 to 255
/// \param duration delay in milliseconds
void spin_and_wait(int pwm_A, int pwm_B, int duration)
{
  set_motor_currents(pwm_A, pwm_B);
  delay(duration);
}

Giải thích Code

// Define the control inputs
#define MOT_A1_PIN 10
#define MOT_A2_PIN 9
#define MOT_B1_PIN 6
#define MOT_B2_PIN 5

Khai báo các chân điều khiển đầu vào cho mạch điều khiển động cơ DC DRV8833.

void setup(void)
{
  // Set all the motor control inputs to OUTPUT
  pinMode(MOT_A1_PIN, OUTPUT);
  pinMode(MOT_A2_PIN, OUTPUT);
  pinMode(MOT_B1_PIN, OUTPUT);
  pinMode(MOT_B2_PIN, OUTPUT);

  // Turn off motors - Initial state
  digitalWrite(MOT_A1_PIN, LOW);
  digitalWrite(MOT_A2_PIN, LOW);
  digitalWrite(MOT_B1_PIN, LOW);
  digitalWrite(MOT_B2_PIN, LOW);

  // Initialize the serial UART at 9600 baud
  Serial.begin(9600);
}

Hàm setup(void) được gọi khi chương trình Arduino được khởi động.

Các chân điều khiển đầu vào của động cơ được thiết lập là OUTPUT bằng cách sử dụng hàm pinMode().

Tất cả các chân đầu vào điều khiển của động cơ được đặt ở trạng thái LOW, đảm bảo rằng các động cơ được tắt khi bắt đầu.

Giao tiếp serial UART được khởi tạo với tốc độ baud là 9600 bps bằng cách sử dụng hàm Serial.begin(), cho gửi và nhận dữ liệu thông qua cổng nối tiếp.

// Ramp speed up.
for (int i = 0; i < 11; i++) {
  spin_and_wait(25*i, 25*i, 500);
}
// Full speed forward.
spin_and_wait(255,255,2000);

// Ramp speed into full reverse.
for (int i = 0; i < 21 ; i++) {
  spin_and_wait(255 - 25*i, 255 - 25*i, 500);
}

// Full speed reverse.
spin_and_wait(-255,-255,2000);

// Stop.
spin_and_wait(0,0,2000);

// Ramp speed up: Vòng lặp này tăng dần tốc độ của động cơ từ 0 đến tối đa trong 11 bước. Mỗi bước, hàm spin_and_wait() được gọi để đặt tốc độ và thời gian chờ.

// Full speed forward: Sau khi tăng tốc độ, động cơ chạy với tốc độ tối đa (255) trong một khoảng thời gian 2000ms.

// Ramp speed into full reverse: Vòng lặp này giảm dần tốc độ của động cơ từ tối đa xuống 0 trong 21 bước. Mỗi bước, hàm spin_and_wait() được gọi để đặt tốc độ và thời gian chờ.

// Full speed reverse: Sau khi giảm tốc độ, đảo ngược động cơ chạy với tốc độ tối đa (-255) trong một khoảng thời gian 2000ms.

// Stop: Động cơ dừng lại trong một khoảng thời gian 2000ms.

// Full speed, forward, turn, reverse, and turn for a two-wheeled base.
spin_and_wait(255, 255, 2000);
spin_and_wait(0, 0, 1000);
spin_and_wait(-255, 255, 2000);
spin_and_wait(0, 0, 1000);
spin_and_wait(-255, -255, 2000);
spin_and_wait(0, 0, 1000);
spin_and_wait(255, -255, 2000);
spin_and_wait(0, 0, 1000);

Các lệnh này tạo ra một chuỗi chuyển động cho hai bánh, bao gồm chạy với tốc độ tối đa, quay, đảo chiều động cơ và quay. Khoảng thời gian dừng giữa các lệnh cho phép động cơ hoạt động trong một thời gian cụ thể trước khi chuyển sang lệnh tiếp theo.

void set_motor_pwm(int pwm, int IN1_PIN, int IN2_PIN)
{
  if (pwm < 0) {  // reverse speeds
    analogWrite(IN1_PIN, -pwm);
    digitalWrite(IN2_PIN, LOW);

  } else { // stop or forward
    digitalWrite(IN1_PIN, LOW);
    analogWrite(IN2_PIN, pwm);
  }
}

Nếu giá trị pwm nhỏ hơn 0, có nghĩa là tốc độ động cơ sẽ là tiến hành đảo chiều. Trong trường hợp này, hàm sẽ sử dụng analogWrite(IN1_PIN, -pwm) để đặt tín hiệu PWM trên chân IN1_PIN với giá trị tuyệt đối của pwm. Đồng thời, chân IN2_PIN sẽ được đặt ở mức thấp (LOW) để điều khiển hướng động cơ.

Trong trường hợp khác, tức là giá trị pwm không âm, động cơ sẽ dừng lại hoặc tiến về phía trước. Hàm sẽ đặt chân IN1_PIN ở mức thấp (LOW) và sử dụng analogWrite(IN2_PIN, pwm) để đặt tín hiệu PWM trên chân IN2_PIN với giá trị của pwm.

void set_motor_currents(int pwm_A, int pwm_B)
{
  set_motor_pwm(pwm_A, MOT_A1_PIN, MOT_A2_PIN);
  set_motor_pwm(pwm_B, MOT_B1_PIN, MOT_B2_PIN);

  // Print a status message to the console.
  Serial.print("Set motor A PWM = ");
  Serial.print(pwm_A);
  Serial.print(" motor B PWM = ");
  Serial.println(pwm_B);
}

Hàm này giúp điều khiển tốc độ của hai động cơ đồng thời bằng cách sử dụng hàm set_motor_pwm để đặt tín hiệu PWM cho từng động cơ, và sau đó in ra trạng thái tín hiệu PWM đã được đặt.

void spin_and_wait(int pwm_A, int pwm_B, int duration)
{
  set_motor_currents(pwm_A, pwm_B);
  delay(duration);
}

Hàm này giúp điều khiển động cơ với tín hiệu PWM trong một khoảng thời gian nhất định, sau đó đợi trước khi thực hiện các thao tác tiếp theo.

Bài viết liên quan

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments