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
Bài 7: STM32 Timer chế độ PWM 11

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
Bài 7: STM32 Timer chế độ PWM 12

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
Bài 7: STM32 Timer chế độ PWM 13

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

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

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
Bài 7: STM32 Timer chế độ PWM 15

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
Bài 7: STM32 Timer chế độ PWM 16

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
Bài 7: STM32 Timer chế độ PWM 17

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

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

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
Bài 7: STM32 Timer chế độ PWM 19

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

One thought on “Bài 7: STM32 Timer chế độ PWM

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 *