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, đa kênh và 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 trung bình tại đầu ra.

Các bạn cứ tưởng tượng mình bật tắt công tắc đèn thật nhanh: trong mỗi chu kì chỉ bật 1/4 thời gian, tắt 3/4 thời gian. Nếu bật tắt đủ nhanh, mắt sẽ không thấy đèn nháy mà chỉ thấy đèn sáng yếu đi, khoảng 25% độ sáng. Đó chính là PWM với duty cycle 25%.

H1 4

PWM được ứng dụng nhiều trong việc điều khiển động cơ, các bộ nguồn xung boost, buck, nghịch lưu 1 pha, 3 pha…

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 Cycle đượ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 TIM2 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-reload preload: Enable

Mode: PWM mode 1

Pulse: 24 => duty cycle 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 Keil C 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ộ Logic Analyzer vào CH1 của Timer 2 (chân PA0) 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 Cycle chúng ta gọi hàm __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 50);

Với 50 là giá trị duty cần nạp vào. Sau đó nạp lại chương trình.

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) qua điện trở hạn dòng 220Ω như sơ đồ sau, các bạn sẽ thấy led thay đổi độ sáng theo duty đó.

Sơ đồ đấu nối STM32 PWM: chân PA0 (TIM2_CH1) nối điện trở 220Ω tới anode LED, cathode LED nối GND trên Blue Pill

Lưu ý: Với chu kì 100ms (10Hz), mắt vẫn thấy led nhấp nháy chứ không thấy sáng mờ dần. Muốn led sáng mờ mượt mà, các bạn giảm Prescaler xuống 80-1 để tần số PWM lên 1kHz, Counter Period vẫn giữ 99 nên giá trị duty vẫn dùng được từ 0 đến 99.

Lưu ý: Các kênh PWM của cùng 1 Timer dùng chung thanh ghi ARR và PSC, vì vậy chu kì PWM của các kênh sẽ giống nhau. Chúng ta chỉ đặt được duty khác nhau cho từng kênh 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. Hẹn gặp lại các bạn trong bài tiếp theo nhé!

5/5 - (2 bình chọn)

3 những suy nghĩ trên “Bài 7: STM32 Timer chế độ PWM”

Để lại một bình luận

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 *