#4.2_PWM Input | Đọc xung PWM
Đọc xung PWM ở đây là đọc giá trị của 1 xung PWM đưa vào vi điều khiển. Xác định được tần số và độ rộng xung của nó. Ví dụ STM32 cơ bản lần này sẽ tạo ra 1 xung PWM sau đó đọc giá trị của xung PWM vừa tạo.
———————————
Cùng xem bài viết bên dưới.
Nội dung thực hành | Đọc xung PWM
- Trong ví dụ STM32 cơ bản này, kit STM32F411 sẽ được sử dụng. Dùng 2 TIMER là TIM1 và TIM2, TIM1 phát ra xung PWM có tần số 10kHz, độ rộng xung 40%. TIM2 sẽ dùng chức năng Input Capture để đọc giá trị PWM của TIM1.
- Một số kiến thức đã dùng trong bài trước về CCR và ARR, bạn có thể xem lại #4.1_Băm xung PWM | STM32 cơ bản
1 số đặc điểm về PWM Input trong datasheet về PWM input mode timing nói về cách đo độ rộng và chu kỳ xung PWM. Ngoài ra còn có các thiết lập khi cấu hình Input Capture như trong hình ảnh bên dưới, để tìm hiểu sâu và chi tiết ta tìm và đọc datasheet STM32f4xx.
Đầu tiên là PWM input mode timing, đây là lý thuyết của việc đọc xung PWM trong STM32, có 2 kênh CH1 và CH2. 2 kênh sẽ được thiết lập bắt sườn lên và sườn xuống khác nhau. Mục đích khi dùng sườn lên là để bắt được chu kỳ PWM. Sườn xuống thì dùng vào việc bắt độ rộng của xung PWM. Phần cấu hình chi tiết như Capture filter và Capture Prescaler không dùng trong ví dụ cơ bản này. Chúng dùng giúp chức năng Input Capture phù hợp trong từng dự án.
Thực hành HAL_TIM_IC_START
Cấu hình chân
Đầu tiên là dao động và mạch nạp, tiếp theo sẽ là TIM1 để băm xung PWM như ví dụ trước, hệ số PRE_S và PRE_A sẽ vẫn là 100 – 1, do đó xung PWM từ TIM1 có tần số 10kHz.
Tiếp theo là TIM2, chế độ sử dụng là PWM input on CH1. Lúc này kênh CH1 sẽ bắt sườn lên (Rising Edge), cụ thể là đọc chu kỳ xung PWM, còn CH2 sẽ bắt sườn xuống (Falling Edge) để đọc độ rộng xung. Hệ số PRE_S của TIM2 là 0 để khả năng bắt xung nhanh nhất (tần số 100MHz từ APB1).
- Chú ý sườn lên, xuống của CH1 và CH2 để sang phần 2, lập trình.
- Nhớ chọn ngắt cho TIM2.
- Hệ số PRE_S ở TIM1 và TIM2 dễ nhầm lẫn.
Khởi tạo code và thư viện stm32f4xx_HAL_TIM.c
Sau khi cấu hình chân xong ta tiến hành khởi tạo code. Sau đó vào stm32f4xx_HAL_TIM.c
Khi vào ngắt, nếu đúng kênh CH1 đã chọn thì bắt đầu các hoạt động. Đầu tiên dùng CH1 đọc giá trị chu kỳ PWM. Khi đọc xong (giá trị này ≠ 0) sẽ bắt đầu đọc giá trị từ CH2 ~ độ rộng xung. Tần số được tính theo công thức trong phần A. Hệ số Prescaler ở đây là của TIM2, tránh nhầm lẫn sang của TIM1 dẫn đến kết quả không chính xác.
Phần cứng và code trong bài viết
Phần cứng tiếp tục sử dụng STM32F411, phần mềm sử dụng là stm32cubeIDE. File code ví dụ các bạn tải về bên dưới.
Trong bài viết tiếp theo ta sẽ dùng HAL_ADC để đọc giá trị biến trở. Sử dụng bộ chuyển đổi từ tương tự sang số 12bit của STM32.
Các bài viết khác cùng chuyên mục trong “STM32 cơ bản“.
Các chuyên mục khác:
Bạn có thắc mắc gì trong bài viết không?
Đánh giá và để lại bình luận bên dưới nhá.
Cho em hỏi Capture ạ.Như em đang hiểu trong STM là sử dụng mặc định chế độ sau 3 chu kỳ PWM nó mới nhảy vào ngắt(do em ko thấy phần cấu hình cho phần chọn khoảng thời gian ngắt này ạ)
Theo như mình nghĩ thì cái cấu hình đó là ở bit 3:2 trong ảnh “Cấu hình PWM input”. Cách thay đổi số chu kỳ đó thì mình chưa thử, toàn dùng mặc định cho nhanh :))