0987 731 193

Hiệu ứng led sao băng

*

xung PWM

Chúng ta đã quen với việc điều khiển led bằng các tín hiệu bật tắt, còn để điểu khiển độ sáng của LED thì sao ? Muốn LED thay đổi độ sáng thì phải thay đổi điện áp cấp cho LED, nhưng vi điều khiển thì chỉ có thể cấp ra tín hiệu 1 và 0 tương ứng 5V hoặc 0V. Có 1 kĩ thuật để thay đổi điện áp cấp ra cho LED đó là sử dụng PWMBản chất, PWM là liên tục đưa ra các mức logic 1 và 0 ở 1 tốc độ rất cao. Khoảng thời gian chênh lệch giữa thời gian tồn tại mức 1 và 0 quyết định điện áp cấp, cái này chính là điều chế độ rộng xung PWM.Ví dụ, 1 chương trình đơn giản để tạo xung PWM ra 1 chân của vi điều khiển như sau, mình dẽ demo với 1 con LED đơn thôi đã nhé !

Bạn đang xem:

Chương trình trên liên tục bật tắt chân P0_0 với thời gian tồn tại mức 1 là 1ms, thời gian tồn tại mức 0 là 9ms. Do vậy xung này có chu kì 10ms 100Hz. Mức cao chiếm 10% của chu kì nên LED sẽ chỉ sáng với 10% độ sáng tối đa của nó ! Để thay đổi độ sáng, ta chỉ cần điều chế lại độ rộng này, nói đơn giản là thay đổi thời gian delay(1). Tuy nhiên cái delay bên trên tăng thêm bao nhiều thì cái delay phía dưới giảm đi bây nhiêu để đảm bảo tổng 2 cái delay là 10ms nhé. Điều này sẽ đảm bảo tần số PWM của ta luôn ổn định.

Ví dụ chương trình làm đèn sáng lên dần rồi tối đi dần

int i,y;while(1){ //làm led sáng dần lên for(i=0;i=0;i–) //vòng lặp for này sẽ làm thay đổi độ rộng xung { for(y=0;y

Xem thêm:

for(y=0;y100;y++) //vòng lặp for này tạo ra 1 độ trễ nhất định, chính là tốc độ mà đèn sáng dần lên đó

Kĩ thuật trên gọi là PWM mềm. Thực chất hầu hết các bộ vi điều khiển đều trang bị các bộ PWM cứng, nó là 1 phần cứng độc lập với MCU, chúng ta chỉ cần cấu hình các thông số tần số và độ rộng cho nó là co ngay xung PWM, tuy nhiện nó chỉ gjới hạn 1 vài kênh PWM thôi. Nói chung, PWM cứng thường dùng với các mục đích như điều khiển động cơ. Còn điều khiển LED thì số lượng led của chúng ta rất nhiều, không 1 vi điều khiển nào có nhiều bộ PWM cứng như thế cả. Do vậy, để điều khiển LED bằng PWM, chúng ta sẽ sử dụng PWM mềm nhé !

PWM cần tuân thủ chính xác về tần số và độ rộng, nếu lập trình như code bên trên, chúng ta sẽ chỉ điều khiển được 1 kênh LED và không thể làm được công việc khác. Do vậy mình sẽ sử dụng ngắt timer cho bộ PWM mềm

PWM mềm bằng phương pháp ngắt timer

Đến lúc này, 1 thông số chúng ta cần đặc biệt quan tâm tới PWM là độ phân giải của xung. Trở lại code PWM mềm mình đã chia sẻ bên trên, các bạn có thể thấy độ sáng của LED được điều khiển với vòng lặp for chạy từ 0 tới 10. Có tổng cộng 11 giá trị sáng trong dải số này. Do vậy số mức sáng khác nhau mà con LED chúng ta vừa điều khiển là 11. Độ phân giải là 1 thông số rất quan trọng khi điều khiển LED. Độ phân giải càng cao đương nhiên càng tốt nhưng sẽ càng hao phí tài nguyên của vi điều khiển, hãy thử code để kiểm nghiệm nhé !

Mình sẽ sử dụng bộ timer 1 của vi điều khiển 89s52 để demo 1 chương trình tạo PWM trên chân P0_0 với mức sáng là 11 mức

Xem thêm:

int mucsangmax = 10; //mức sáng tối đa mà ta muốnint dem; // 1 biến con chạyint dosangLED = 5; // LED sẽ sáng ở mức số 5 ( khoảng 50%)void T1_ISR() interrupt 3 // Dung timer 1 để tạo PWM ( 1ms tự gọi 1 lần){ TH1=0xFC; // Nap gia tri cho TH1 TL1=0x17; // Nap gia tri cho TL1 (đếm 1000 xung sẽ tràn, thạch anh 12Mhz) if(dosangLED > dem) P0_0 = 1; //xuất mức 1 nếu con chạy vẫn nhỏ hơn mức sáng cài đặt else P0_0 = 0; dem++;if(dem>mucsangmax)dem=0;}

Chuyên mục:

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *