Nội dung bài viết
Vũ Quang Huy Kỹ thuật điều chế độ rộng xung (Pulse-Width Modulation - PWM) là một kỹ thuật sử dụng sự hỗ trợ của phần cứng thiết bị để xuất ra xung điện với một biên độ xác định. Kỹ thuật này rất hay được dùng để điều khiển các thiết bị cơ khí như động cơ, servo ... Ngoài ra, nó còn được sử dụng để tăng áp hay điều áp.

Giới thiệu

Trong điện tử, kỹ thuật điều chế độ rộng xung (Pulse-Width Modulation - PWM) là một kỹ thuật sử dụng sự hỗ trợ của phần cứng thiết bị để thông qua đó xuất ra xung điện với một biên độ xác định. Kỹ thuật này thường được dùng để điều khiển các thành phần cơ khí như động cơ, servo ... Ví dụ như khi ta muốn động cơ chạy nhanh, ta sẽ băm xung với biên độ nhỏ, ngược lại, để động cơ chạy chậm, ta có thể băm xung với biên độ cao. Bài viết này sẽ hướng dẫn bạn đọc sử dụng Arduino Uno R3 để thực hiện kỹ thuật này.

Tiền đề bài viết

Bài viết nằm trong chương trình Tự Học Arduino. Bạn đọc có thể tham khảo các bài viết khác tại chuyên mục STDIO :: Arduino.

Đối tượng hướng đến

Đối tượng hướng đến của bài viết này là các bạn ĐANG LÀM QUEN với việc lập trình Arduino và có trong tay bộ STDIO Starter Kit v2 hoặc tương đương.

Điều chế độ rộng xung

Cơ sở lý thuyết

Đặt trường hợp ta muốn đèn LED sáng với nhiều mức độ khác nhau, giải pháp đầu tiên có thể kể đến là thay vì sử dụng tín hiệu số (digital) để điều khiển LED, ta có thể chuyển sang tín hiệu tương tự (analog). Khi đó, hiệu điện thế sẽ được tinh chỉnh theo thời gian, và đèn LED của chúng ta sẽ sáng theo yêu cầu. Bạn đọc có thể tìm hiểu về tín hiệu số / tương tự tại STDIO :: Tín Hiệu Số Và Tương Tự - Analog/Digital.

Tuy nhiên, với Arduino việc tăng / hạ áp tại một pin bất kì không phải là một việc đơn giản. Đơn cử như muốn đưa điện áp từ một hiệu điện thế bất kì về 5V, ta phải sử dụng IC giảm áp, ví dụ như LM25695. Vì vậy, kĩ thuật điều chế độ rộng xung ra đời để hỗ trợ chúng ta khắc phục vấn đề này. Với kĩ thuật này, nhờ vào tần số dao động của tín hiệu điện trong mạch mà ta có được kết quả của việc sử dụng tín hiệu tương tự bằng tín hiệu số.

Tín hiệu số sẽ tạo ra các xung vuông, một dạng tín hiệu bật / tắt, tín hiệu bật / tắt này tương ứng với mức 5V và 0V. Bằng việc thay đổi khoảng thời gian bật và tắt này trong một chu kì rất ngắn, ta có thể tạo ra được "ảo giác" đèn LED sáng mờ. Khoảng thời gian bật / tắt trong một chu kì được gọi là biên độ xung - pulse width.

Xét hình bên dưới, vạch màu xanh đại diện cho một chu kì tín hiệu. Ví dụ tần số PWM của Arduino tại thời điểm đang xét là 500Hz thì mỗi chu kì chỉ khoảng 2 mili-giây. Việc điều chế xung được Arduino hỗ trợ thông qua các pin có kí hiệu ~ ở trước. Với Arduino Uno R3 thì các pin đó là: 3, 5, 6, 9, 10, 11. Bạn đọc tham khảo chi tiết thông số Arduino Uno R3 ở STDIO :: Arduino Uno R3 - Thông Số Kĩ Thuật Arduino Uno R3 - Các Biến Thể Và Lưu Ý. Để điều chế xung PWM, ta sử dụng hàm:

analogWrite(pin, value)

Với 2 tham số là số pin và mức độ (0 - 255). Vậy với lời gọi hàm analogWrite(0) tương ứng với ta điều xung mức 0% của chu kì - luôn tắt, tương đương với  digitalWrite(LOW), hay analogWrite(127) - 50% chu kì hay analogWrite(255) - 100% chu kì tương ứng với việc luôn bật, digitalWrite(HIGH).

ss_1

Lưu ý: tần số PWM có thể được điều chỉnh qua các ngắt của vi điều khiển ATmega. Thông số mặc định ở các pin 5, 6 là 1000 Hz và pin 9, 10, 11 là 500Hz.

Ví dụ minh họa

Trong ví dụ này, ta sẽ cho đèn LED sáng dần lên và tối dần đi bằng việc điều chế biên độ xung. Bạn đọc cần chuẩn bị các thiết bị / dụng cụ sau:

  • 1 x Arduino Uno R3 hoặc tương đương
  • 1 x Breadboard
  • 1 x LED màu bất kì
  • 1 x điện trở 560 Ohm
  • Dây cắm

Do Arduino Uno R3 chỉ hỗ trợ PWM ở các pin 3, 5, 6, 9, 10, 11. Vì vậy ta sẽ mắc mạch của theo sơ đồ sau:

ss_2

Kết nối Arduino với máy tính và nạp đoạn code

#define LED_PIN 9

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

void loop() {
  // Make LED brighter time-to-time
  for (int i = 0; i < 256; i++)
  {
    analogWrite(LED_PIN, i);
    delay(10);
  }

  // Stop for a while
  delay(1000);

  // Make LED dimmer time-to-time
  for (int i = 255; i >= 0; i--)
  {
    analogWrite(LED_PIN, i);
    delay(10);
  }

  // Stop for a while
  delay(1000);
}

Kết quả thu được là đèn LED của ta sáng / tối dần theo thời gian

 

 

THẢO LUẬN
ĐÓNG