BÀI 07: PWM TRONG STM32F103.
- Sơ lược về lý thuyết.
- Duty cycle : tỷ lệ phần trăm xung ở mức cao.
- Period : là chu kì xung(bao gồm tổng thời gian mức cao + mức thấp).
- Pulse width là giá trị của mức cao so với period.
- PTO là xung vuông có 50% thời gian cao, 50% thời gian thấp.
- Biên độ xung: là giá trị điện áp của xung khi ở mức cao.
- Các khái niệm về tần số, chu kì.
- Cấu hình với thư viện chuẩn của ST.
- B1- Cấp lock và khai báo các định nghĩa quan trọng.
- B2- cấu hình chân output của timer - Khởi tạo timer base.
- B3- cấu hình chức năng output compare sử dụng cho PWM, Enable timer, pwm.
- Sử dụng hàm điều chỉnh duty cycle.
- z/TIM_Period*100% với TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
- (1 - z/TIM_Period )*100% với TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
- Một số thanh ghi quan trọng.
- TIMx_CCER – TIMx capture/compare enable register.
- TIMx_CCMRx- TIMx capture/compare mode register x.
- OcxM: lựa chọn mode Output cho chân PWM. Giá trị tương ứng từ 000 ->111 với các mode như PWM1, PWM2, Frozen, Toggle...
- OCxPE: bit này cho phép bộ đếm tự động lặp lại sau khi thực hiện xong đếm lần 1.
- OcxFE: bit này sử dụng cho mode Input capture: đo tín hiệu xung đầu vào với các xung có tần số cao.
- CCxS: bit này cho phép lựa chọn là ngõ vào hay ngõ(Capture/Compare) ra tương ứng với các mode.
- TIMx_CCRx – TIMx Capture/Compare register.
- Bài tập.
- Cấu hình PWM với dyty cycle 20%, tần số 1Hz trên chanel1,2,3,4 của TIM2.
- Cấu hình PWM với dyty cycle 20%, tần số 1Hz trên chanel 1(20%) và chanel 1N(80%) của TIM1.
PWM(pulse- with modulation) hay còn gọi nôm na là “băm xung” hay “điều khiển độ rộng xung” là ứng dụng phổ biến và thường dùng trong lĩnh vực điều khiển động cơ. Một ví dụ đơn giản để hiểu về độ rộng xung là mức độ sáng tắt của LED, ở tần số mà mắt người có thể nhìn thấy thì nó là độ chênh lệch giữa mức sáng và tắt của 1 đèn khoảng thời gian lặp đi lặp lại(vd đèn sáng 5s, tắt 3s lặp đi lặp lại thì chu kì sẽ là 8 giây); với tần số cao mắt người không thể nhìn thấy thì ta sẽ thấy LED sáng mờ hay sáng rõ đó là do tổng thời gian sáng/ tổng thời gian tắt trong khoảng thời gian lớn hay nhỏ mà mắt người nhìn thấy(tính bằng đơn vị nhỏ như ms).
Khi tìm hiểu về PWM chúng ta cần tìm hiểu kĩ một số khái niệm cơ bản như:
Giới thiệu về PWM của STM32f103: ở VĐK này có 4 kênh timer là TIM1,TIM2,TIM3,TIM4 để phát PWM, mỗi kênh đó có 4 channel nhỏ nữa, riêng TIM1 có thêm 4 channel đảo nữa. Tùy từng ứng dụng mà có thể sử dụng phối hợp nhiều kênh cũng như nhiều channel nhỏ khác nhau. TIM1 là timer đặc biệt tạo ra riêng để ưu tiên cho việc phát xung với nhiều mode bảo vệ cũng như điều khiển riêng. Nó có các kênh PWM đảo vd( CH1 – CH1N) giúp tránh tình trạng trùng dẫn với nửa cầu H trên và nửa cầu H dưới của mạch driver điều khiển động cơ. Nó có chế độ one-pulse để xuất ra 1 xung hay nhiều xung với số xung đếm được, ngắt input để bảo vệ động cơ, có mode hỗ trợ encoder và cảm biến Hall.
Sử dụng PWM chủ yếu là để điều khiển động cơ, khi điều khiển cần chú ý là mỗi loại động cơ đều có cơ cấu điều khiển khác nhau, tần số điều khiển cũng khác nhau. Cần chú ý về mục đích điều khiển là tốc độ, vị trí, moment… để xuất xung với tần số và chu kì thích hợp.
Trên STM32f103 thì cần chú ý là sử dụng PWM của timer nào thì cần tra datasheet để biết ngõ ra của timer đó là chân nào, có Remap hay trùng với các chân đặc biệt không.
Hàm TIM_SetComparex(TIMy,z); được dùng để điều chỉnh độ rộng xung của kênh PWM đang cấu hình SetComparex tương ứng với channel x của TIMy với giá trị z. Độ rộng xung được tính dựa trên:
Chúng ta có thể điều khiển độ rộng xung với tần số cao hơn, tuy nhiêu ở tần số cao thì phải có Oscilloscope để quan sát dạng sóng ra. Nếu phát xung với tần số thấp thì có thể quan sát bằng mắt thường với độ chính xác tương đối. Chúng ta có thể thay đổi các tham số truyền vào để quan sát và hiểu các dạng PWM xuất ra.
Ở đây Vd là sử dụng TIM4 nên mình sẽ sử dụng thanh ghi của TIM4. TIM2,3,4 giống nhau và khác đôi chút với TIM1.
4 cặp bit tương ứng với 4 channel của 1 Timer. CCxE : cho phép output xung ra bên ngoài hay không. CCxP cho phép xuất mức PWM ở mức cao hay thấp vd CC4P = 0 thì khi Duty cycle =100% thì điện áp output = 3V3, CC4P = 1 thì khi Duty cycle =100% thì điện áp output = 0V.
Nếu là mode output thì nó sẽ so sánh với thanh ghi CNT và xuất ra giá trị PWM, giá trị được làm mới khi có update xảy ra. Nếu là mode input: nó sẽ chứa giá trị đọc về của giá trị đọc cuối cùng.
Thanks so much!
ReplyDeletecho mình xin link tài liệu có các thanh ghi được không ạ?
ReplyDeletetài liệu này phụ thuộc từng dòng MCU nha bạn. Ở đây thì bạn tìm kiếm là user manual + tên dòng chip. Đa phần các tài liệu là tiếng Anh nha bạn.Ở đây mình có đính kèm link user manual của STM32f103C8 : https://drive.google.com/file/d/1TPOgl28HGvVt5atB8pxeiyCl7JAGlrOX/view?usp=sharing
DeleteAnh ơi, cho em hỏi là cái giá trị TIM_Pulse = 5000 ở Bước 3 có nghĩa là gì ạ
ReplyDeletecái này là giá duty cycles ban đầu khi chạy xong chương trình con TIM4_Configuraion(). 5000/(9999 + 1) = 0.5 = 50% nha bạn. Nếu trong main bạn không gọi hàm TIM_SetCompare4() hoặc không tác động đến thanh ghi thì duty cycles mặc định là 50%. Nếu có gọi hàm TIM_SetCompare4() thì giá trị TIM_Pulse = 5000 là vô nghĩa.
ReplyDeletecam on a!
Deleteanh ơi, làm sao để biết output PWM của timx_channely ứng với chân nào trên VĐK ạ, em không biết tra datasheet đoạn này ở chỗ nào. Em cảm ơn ạ.
ReplyDeleteChào bạn. Bạn tìm kiếm file description của loại VDK mà bạn dùng, tìm đến mục "Pinouts and pin description", sẽ có bảng chức năng của các chân, lúc này chỉ cần tra cột "Alternate functions" là sẽ tìm được chức năng timer.
Deletesao em thu ko dc nhi
ReplyDeletebạn đã nạp thử code và không chạy????
Delete