[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ả:

Có rất nhiều bạn inbox trực tiếp cho mình để hỏi các vấn đề giống nhau, các bạn vui lòng để lại thắc mắc dưới phần bình luận, mình sẽ phản hồi trong vòng 24h. Điều này sẽ giúp những người cùng thắc mắc có thể tự đọc, tìm hiểu mà không cần mất công hỏi lại mình. Like và comment cũng là một cách rất tốt để Google đánh giá cao bài viết và cho hiển thị lên thanh tìm kiếm, điều này sẽ giúp các bài viết tiếp cận được những người cần đến nó !

Nếu thấy các bài viết thật sự có ích đối với bạn, các bạn có thể donate cho mình tại tài khoản:

Giới thiệu Đào Nguyện 28 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

Hãy bình luận đầu tiên

Để lại comment nếu có thắc mắc, mình sẽ phản hồi trong 24h