I. Mục đích, yêu cầu
Giúp người học:
II. Nội dung
2.1. Cơ sở lý thuyết
2.1.1. Tìm hiểu về điều chế độ rộng xung là gì? Ứng dụng trong thực tế
Điều chế độ rộng xung (PWM) là phương pháp điều chế độ rộng của xung vuông có chu kỳ không đổi. Hiểu đơn giản là sự thay đổi của 2 trạng thái, thời gian ở mức cao và mức thấp khác nhau.
Một tín hiệu PWM cơ bản hiển thị trong hình dưới đây:
Từ hình trên, rõ ràng là khi tăng chu kỳ làm việc, điện áp ngõ ra (hoặc công suất được cung cấp) cũng tăng lên. Đối với chu kỳ làm việc 100% thì điện áp tương ứng là 5V và đối với chu kỳ làm việc 50% thì điện áp là 2,5V…
Ứng dụng trong thực tế
PWM được ứng dụng nhiều trong điều khiển độ sáng của đèn LED, điều khiển tốc độ của động cơ, điều khiển động cơ servo… Trong mạch C88 được tích hợp sẵn 2 bộ điều chế độ rộng xung PWM và led hiển thị.
2.1.2. Địa chỉ phần cứng đầu ra PWM trên mạch C88
Lưu ý thêm:
2.1.3. Một số câu lệnh sử dụng trong bài
/* Lưu ý cho người mới tiếp cận với lập trình: ngôn ngữ lập trình cho mạch C88 là C/C++ nên chúng ta cần lưu ý phân biệt chữ hoa chữ thường và các dấu chấm, dấu phẩy, dấu chấm phẩy... */
a. Hàm define
Cấu trúc: #define [đặt tên hằng số] [giá trị của hằng số]
Ý nghĩa: Cho phép bạn đặt tên cho một hằng số nguyên hoặc hằng số thực.
Ứng dụng: Gán tên cho chân mong muốn.
Ví dụ: Khai báo tên P0 địa chỉ chân số 5
b. Hàm analogWrite()
Cấu trúc: analogWrite (chân , giá trị PWM);
Trong đó:
+) chân: là chân đầu ra PWM hoặc tên gán cho chân đó
+) giá trị PWM: là giá trị trong khoảng từ 0 đến 255, ứng với mức điều chế từ 0% đến 100%.
Ý nghĩa: là lệnh xuất ra chân một mức tín hiệu analog (phát xung PWM).
Ví dụ: Điều chế đầu ra tạo xung PWM khối P0 mức 100%
c. Hàm delay()
Cấu trúc: delay(ms);
Trong đó: ms là thời gian (Sử dụng ở đây là mili giây).
Ý nghĩa: Dừng chương trình trong 1 khoảng thời gian (1000 mili giây = 1 giây).
Ứng dụng: Tạo trễ.
Ví dụ: Tạo trễ 5 giây
d. Hàm delayMicroseconds(x)
Cấu trúc: delayMicrosecond (x);
Trong đó: x là thời gian (Sử dụng ở đây là micro giây).
Ý nghĩa: Dừng chương trình trong 1 khoảng thời gian (1000000 micro giây = 1 giây).
Ứng dụng: Tạo trễ.
Ví dụ: Tạo trễ 50 micro giây
2.2. Thực hiện
Bài 1.
Thiết kế, viết chương trình điều khiển ánh sáng led được tích hợp trên đầu ra tạo xung P0 (D5).
a. Mã lệnh
#define P0 5 // định nghĩa địa chỉ chân 5 tên là P0
void setup() {
pinMode(P0, OUTPUT); // thiết lập P0 có chiều ra
}
void loop() {
analogWrite(P0, 0); // xuất ra P0 mức xung 0
delay(50); // trễ 50 mili giây
analogWrite(P0, 80); // xuất ra P0 mức xung 80
delay(50);
analogWrite(P0, 160);// xuất ra P0 mức xung 160
delay(50);
analogWrite(P0, 250);// xuất ra P0 mức xung 240
delay(50);
}
b. Giải thích chương trình (Ý nghĩa đoạn lệnh)
+) Xuất ra chân P0 các mức xung lần lượt 0, 80, 160, 240 qua lệnh:
analogWrite(P0, mức xung);
+) Cách quãng 50 mili giây, từ đó điện áp rơi trên bóng led tăng dần.
c. Kết quả (Mạch hoạt động thế nào)
Đèn led được kết nối tới chân P0 sáng dần rồi tắt.
Bài 2.
Thiết kế, viết chương trình điều khiển tốc độ động cơ DC 12V trên đầu ra tạo xung P0 (D5) sao cho tốc độ tăng dần.
a. Sơ đồ lắp ráp
b. Mã lệnh
#define P0 5 // định nghĩa địa chỉ chân 5 tên là P0
void setup() {
pinMode(P0,OUTPUT); // định nghĩa P0 là đầu ra
}
void loop() {
for(int a=0; a<=255; a++) // tạo vòng lặp, cho “a” tăng dần
{
analogWrite(P0,a); // xuất ra P0 mức xung tăng dần từ 0 đến 255
delay(50); // trễ 50 mili giây
}
}
c. Giải thích chương trình (Ý nghĩa đoạn lệnh)
Ý nghĩa đoạn lệnh: xuất ra P0 mức xung tăng dần từ 0 đến 255 cách quãng 50 mili giây theo vòng lặp for.
d. Kết quả (Mạch hoạt động thế nào)
Link video: https://youtu.be/nlYisrKFWhs