Lập trình STM32 Timer chế độ PWM sẽ cho bạn cái nhìn tổng quan về PWM, cách sử dụng PWM một kênh và đa kênh. Lập trình PWM như thế nào
Bài 7 trong serie Học lập trình STM32 từ A tới Z
PWM là gì?
PWM hay Pulse Width Modulation là phương pháp điều chỉnh độ rộng của xung có chu kì cố định, nhằm tạo ra sự thay đổi điện áp tại đầu ra.
PWM ứng dụng nhiều trong việc điều khiển động cơ, các bộ nguồn xung boot, buck, nghịch lưu 1 pha, 3 pha…
Trong mỗi Timer có 4 kênh độc lập phát PWM
Chu kì xung của PWM được quản lý bằng thanh ghi PSC và thanh ghi ARR.
Duty Cycles được quản lý bằng thanh ghi CCR
Chi tiết tham khảo mục 15.3.9 trong Reference Manual
Cấu hình PWM trong STM32 Timer
Tạo project mới trên chip STM32F103C8, trong thẻ Sys chọn Debug là Serial Wire
Trong Tab Timer 2 cấu hình như sau:
Clock source: internal clock
Channel 1: PWM generation CH1
Trong mục configuration
Prescaler: 8000 => mỗi lần đếm là 1ms, nói chi tiết trong Bài 5
Counter Mode: Up
Counter Period: 99 => ở đây mình tạo chu kì xung là 100ms
Auto-preload: Enable
Mode: PWM mode 1
Pulse: 24 => duty cycles chọn là 25/100 = 25%
Đặt tên Project chọn toolchain là MDK-ARM V5 sau đó Gen code
Lập trình PWM
Trong KeilC bạn chỉ cần gọi hàm Start PWM là PWM sẽ chạy như sau:
Ta mắc kênh CH0 của bộ Analyzer vào CH1 của Timer 1 rồi đo xung nhé. Nếu bạn chưa biết sử dụng thì hãy đọc bài : Hướng dẫn sử dụng Logic Analyzer
Nhấn Start ta sẽ đo được sóng có chu kì 100ms và duty là 25%
Muốn thay đổi Duty Cycles chúng ta gọi hàm __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1, 50);
Với 50 là duty cần nạp vào. Sau dó nạp lại
Đo lại kết quả sẽ được như sau:
Trong thực tế chúng ta sẽ quản lý duty bằng 1 biến, sau đó thay đổi giá trị duty nạp vào như sau.
Khởi tạo một biến u8_Duty
Trong while(1) tăng giảm u8_Duty đó mỗi 1s một lần
Lắp thêm Led tại chân PA0( CH1 của Timer 2) và thấy rằng Led thay đổi độ sáng theo Duty đó.
Lưu ý: Các kênh PWM của cùng 1 Timer dùng chung thanh ghi ARR và PRS vì vậy chu kì PWM sẽ giống nhau. Chúng ta chỉ setup được Duty khác nhau mà thôi.
Kết
PWM là một chức năng rất quan trọng nhất là trong việc điều khiển thiết bị, hiểu được PWM là gì, cách lập trình PWM như thế nào sẽ giúp bạn rất nhiều trong lập trình nhúng
Khuê ơi up lại bài 8 lập trình adc nhiều kênh được k ạ?
anh có thể làm về điều khiển servo bằng timer pwm được không ạ
Phần này khá đơn giản mà e. E chỉ cần phát xung PWM đúng tần số, rồi chỉnh độ rộng là servo sẽ quay theo các góc khác nhau thôi