Friday, September 23, 2016

Điều chỉnh Xung PWM (Pulse-Width Modulation) trong Arduino

1. Khái niệm: Xung trong Arduino  là các trạng thái cao / thấp (HIGH/LOW) về mức điện áp được lặp đi lặp lại. Đại lượng đặc trưng cho 1 xung PWM (Pulse Width Modulation) bao gồm tần số (frequency) và chu kì xung (duty cycle)
- Chân PWM (~): 3, 5, 6, 9, 10, và 11: cho phép bạn xuất ra xung PWM với độ phân giải 8bit (giá trị từ 0 → 28-1 tương ứng với 0V → 5V) bằng hàm analogWrite(). Nói một cách đơn giản, bạn có thể điều chỉnh được điện áp ra ở chân này từ mức 0V đến 5V thay vì chỉ cố định ở mức 0V và 5V như những chân khác.
2. Ứng dụng thực 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).

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:
#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);
}

No comments:

Post a Comment