[Matrix LED] Bài 10: Kĩ thuật PWM – Điều chế động rộng bằng phương pháp B.A.M

PWM LED Matrix

Trong phần trước mình đã demo giới thiệu của phương pháp PWM mềm, thuật toán ở bài trước đó khá ổn nếu điều khiển PWM ra 1 số lượng GPIO hữu hạn ! Mình sẽ thử lấy 1 ví dụ với PWM ra LED 256 mức sáng bằng vi điều khiển ATmega8, chương trình tạo PWM thông thường sẽ như sau:

Dạng sóng của phương pháp PWM thông thường

Phương pháp PWM mềm thông thường này sẽ rất hao tổn tài nguyên của MCU nếu bạn điều khiển quá nhiều GPIO và số lượng bit PWM lớn do mỗi mức PWM là 1 lần ngắt, nói cách khác, muốn tạo ra 256 mức phải ngắt 256 lần. Có 1 thủ thuật khác hay hơn để tạo ra 256 mức PWM (8bit PWM) chỉ với 8 lần ngắt nhờ lợi dụng đặc điểm của số nhị phân.

Ví dụ, mình cần tạo ra 1 PWM có max 256 mức, độ rộng xung ở mức cao là 167, cách tạo ra PWM bằng phương pháp B.A.M sẽ như sau:

167(thập phân)=10100111(nhị phân)
Trọng số của các bit nhị phân được đánh từ trái sang phải bắt đầu từ 0

Lần ngắt thứ 1: Bit trọng số 0 có giá trị là 1 => đưa chân GPIO lên logic 1 > delay 1 tick
Lần ngắt thứ 2: Bit trọng số 1 có giá trị là 1 => đưa chân GPIO lên logic 1 > delay 2 tick
Lần ngắt thứ 3: Bit trọng số 2 có giá trị là 1 => đưa chân GPIO lên logic 1 > delay 4 tick
Lần ngắt thứ 4: Bit trọng số 3 có giá trị là 0 => đưa chân GPIO lên logic 0 > delay 8 tick
Lần ngắt thứ 5: Bit trọng số 4 có giá trị là 0 => đưa chân GPIO lên logic 0 > delay 16 tick
Lần ngắt thứ 6: Bit trọng số 5 có giá trị là 1 => đưa chân GPIO lên logic 1 > delay 32 tick
Lần ngắt thứ 7: Bit trọng số 6 có giá trị là 0 => đưa chân GPIO lên logic 0 > delay 64 tick
Lần ngắt thứ 8: Bit trọng số 7 có giá trị là 1 => đưa chân GPIO lên logic 1 > delay 128 tick

Như vậy là kết thúc 1 chu kì PWM chỉ với 8 lần ngắt. Mình sẽ demo chỉnh sửa code trên sang thuật toán B.A.M

Ở chương trình trên, 1 biến vitri_bit được tạo để giám sát xem chúng ta đang cần làm việc với bit nào, mỗi lần ngắt mình sẽ nạp lại giá trị cho timer để thay đổi thời gian nhảy vào lần ngắt tiếp theo (tạo delay)

Dạng sóng của phương pháp B.A.M sẽ như sau:

Tổng thời gian ở mức cao sẽ tương đường với phương pháp PWM thông thường

Dowload source code demo trên atmega8 (code vision AVR, proteus 8.4) tại đây

 

Từ tác giả:

Nếu có bất kì thắc mắc nào trong bài viết, vui lòng để lại comment dưới mỗi bài ! Mình sẽ không trả lời thắc mắc của các bạn ở facebook hay email !

Nếu trong phần code bạn nhìn thấy nhưng thứ kiểu như &amp; thì đó là lỗi hiển thị, cụ thể 3 kí tự < > & bị biến đổi thành như thế
&amp; là &
&lt;  là <
&gt; là >

Giới thiệu Đào Nguyện 80 bài viết
DIY,chế cháo, viết blog chia sẽ kiến thức về lập trình,điện tử - IoT. Rất mong được giao lưu, kết bạn với các bạn cùng đam mê. Địa chỉ Facebook: https://www.facebook.com/nguyendao207