Bài 7: STM32 Timer chế độ PWM

STM32 Timer PWM

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.

H1 4

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

H2 5

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%

H3 4

Đặt tên Project chọn toolchain là MDK-ARM V5 sau đó Gen code

H4 3

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:

H5 4

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%

H6 4

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

H7 5

Đo lại kết quả sẽ được như sau:

H8 4

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

H9 5

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

5/5 - (2 bình chọn)
0 0 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
guest

3 Góp ý
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất
Phản hồi nội tuyến
Xem tất cả bình luận
minh anh
minh anh
3 năm trước

Khuê ơi up lại bài 8 lập trình adc nhiều kênh được k ạ?

trung
trung
2 năm trước

anh có thể làm về điều khiển servo bằng timer pwm được không ạ