Arduino không thể xuất ra điện thế dạng analog, mà chỉ có thể xuất ra 3.3V (đối với Blocky Node, hoặc 5V với một số board khác) hoặc 0V. Để xuất ra một giá trị trong khoảng đó ta phải dùng một kỹ thuật gọi là PWM (Pulse-Width Modulation). PWM có rất nhiều ứng dụng trong thực tế như là để điều chỉnh sáng tối cho đèn led hay điều chỉnh động cơ chạy nhanh hay chậm.
Để sử dụng PWM trong Arduino, ta dùng hàm analogWrite(). Bạn không cần gọi hàm pinMode() để đặt chế độ OUTPUT cho chân sẽ dùng để phát xung PWM trên mạch Arduino.
analogWrite([chân phát xung PWM], [giá trị xung PWM]);
Giá trị mức xung PWM nằm trong khoảng từ 0 đến 255, tương ứng với mức duty cycle từ 0% đến 100%.
Bạn cần chuẩn bị các thiết bị sau:
1 x Node Wifi.
1 x Module led.
Bạn cắm module led vào cổng digital 0 trên Blocky Node và upload đoạn code dưới đây.
int led = 14; // digital 0 on Blocky Node Wifi void setup() { } void loop() { for (int i = 0; i <= 255; i++) { analogWrite(led, i); delay(50); } }
Đoạn code trên có chức năng làm sáng dần đèn LED và lặp lại liên tục điều đó.
Để hiểu rõ các hoạt động của PWM, mình có thể tham khảo cách giải thích khá chi tiết của một bài viết trên trang arduino.vn như sau:
Xung 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).
Tần số là gì?
Tần số là số lần lặp lại trong 1 đơn vị thời gian. Đơn vị tần số là Hz, tức là số lần lặp lại dao động trong 1 giây.
Lấy ví dụ, 1Hz = 1 dao động trong 1 giây. 2Hz = 2 dao động trong 1 giây. 16MHz = 16 triệu dao động trong 1 giây.
Như vậy theo quy tắc tam suất: 16 triệu dao động – 1 giây –> 1 dao động tốn 1/16.000.000 (giây) = 0,0625 (micro giây)
Cách xác định 1 dao động như thế nào? Đa phần các bạn mới nghiên cứu điện tử thường mắc sai lầm ở việc xác định 1 dao động. Dao động được xác định từ trạng thái bắt đầu và kết thúc ngay trước khi trạng thái bắt đầu được lặp lại.
Cách xác định 1 dao động
Như vậy thông thường, 1 dao động sẽ bao gồm 2 trạng thái điện: mức cao (x giây) và mức thấp (y giây). Tỉ lệ phần trăm thời gian giữa 2 trạng thái điện này chính là chu kì xung.
Với x/y = 0% ta có xung chứa toàn bộ điện áp thấp (khái niệm xung nên hiểu mở rộng)
Với x/y = 50% thì 50% thời gian đầu, xung có điện áp cao, 50% sau xung có điện áp thấp.
Với x/y=100% ta có xung chứa toàn bộ điện áp cao.
Tóm lại, với 1 xung ta có:
Với kiến thức cơ bản về xung, các bạn sẽ hiểu rõ hơn về xung trong thực tế như thế nào.
Xung khi sử dụng với hàm analogWrite trong Arduino
analogWrite | tỉ lệ | chu kì xung |
analogWrite(0) | 0/255 | 0% |
analogWrite(64) | 64/255 | 25% |
analogWrite(127) | 127/255 | 50% |
analogWrite(191) | 191/255 | 75% |
analogWrite(255) | 255/255 | 100% |
Hàm analogWrite() trong Arduino giúp việc tạo 1 xung dễ dàng hơn. Hàm này truyền vào tham số cho phép thay đổi chu kì xung, bạn có thể tính toán ra được chu kì xung như ở bảng trên. Tần số xung được Arduino thiết lập mặc định.