c++ 定时器_【话说定时器系列】之十:PWM输入模式测量脉宽及占空比实验
STM32定時器是 ST MCU 內部最基礎且常用的外設,實際應用尤為普遍。去年,電堂推出了《STM32 TIMER基礎及常規應用介紹》,為大家梳理了 STM32 TIMER 的龐大內容,涵蓋 TIMER 的基本應用原理、常規應用等。現在將課程內容整理為文章,針對STM32定時器有基本了解的用戶,分享具體的應用實現環節及常見問題解決。
1. 實驗內容
使用STM32定時器PWM輸入模式測量脈寬及占空比。
上一節介紹了利用定時器輸入捕獲功能,通過定時器的單個通道來實現對1路外來信號脈沖寬度及占空比進行測量,并在測量過程中統計和計算用于測量的定時器自身的溢出事件。這里將介紹另外一種測量脈寬及占空比的方式。利用定時器PWM輸入模式結合定時器的從模式來實現對外來信號脈沖寬度及占空比的測量,同時,也在測量過程中統計和計算用于測量的定時器自身的溢出事件。這里用到的開發板:STM32F411 Nucleo 板 【實驗對開發板并無特別要求】,集成開發環境不限。這里用的是ARM MDK IDE。
2. 實驗目的
1、熟悉定時器時基單元的基本寄存器及相關數據的擬定。
2、了解通過STM32定時器實現PWM波形輸出的配置與使用。【因為這里要使用一個定時器TIM3的pwm輸出產生一個待測脈沖信號】
3、熟悉定時器PWM輸入模式測量脈沖寬度的基本原理與實現。
4、通過實驗熟悉有關定時器復位從模式的原理與特征,并熟悉相關事件或中斷。
3. 實驗原理及步驟
3.1、實驗步驟
這里使用32F411Nucleo板的板載芯片內的TIM3的通道1產生一個周期為5s,占空比為40%的PWM輸出信號,然后用連線將該信號連接到TIM4的定時器通道2【TI2】,作為其直接輸入,通過它對來自于TIM3的PWM輸出信號進行脈寬及占空比的測量。
? 先說說PWM輸入模式工作原理
? 它是基于輸入捕獲與定時器從模式相結合的一個具體應用
? 同一個外部輸入引腳【僅限于定時器TI1/TI2的】的輸入濾波信號【TIxFPx】映射到2個捕捉通道【僅限于IC1/IC2】,且配置為相反的捕捉極性,即一個通道捕捉上沿,另一個通道捕捉下沿。
? 用于測量的定時器配置在復位從模式,外部輸入信號的濾波信號TIxFPx作為定時器的觸發信號。
? 經過兩次連續的捕捉以及定時器的溢出事件統計可方便地測得信號的周期及占空比。【提醒:本實驗待測信號周期完全可以長于定時器計數周期,因為測試過程中我們會統計定時器的溢出事件】
3.2、測量過程
具體到這里,當TIM4收到觸發信號時,定時器的計數器會被復位更新。當計數器配置為UP計數模式時,計數器會被清零并重新開始計數。另外,這里的觸發信號來自待測信號,其觸發極性可以軟件配置。
大致測量過程是這樣的:TIM4配置在復位從模式。待測信號從TI2輸入。【本實驗中的待測信號來自TIM3的PWM輸出】
當從通道2出現信號的上升沿時,TIM4計數器被復位清零,同時產生更新事件和觸發事件,相關標志位會被置1.
在初始狀態【沒進入測量的狀態】下,將定時器從模式觸發沿配置為上沿觸發,捕捉通道1配置下沿捕捉,捕捉通道2配置為上沿捕捉。初始狀態下,待測信號的上升沿使得TIM4的計數器被復位清零,并進入測量狀態1,并開啟定時器的溢出事件實時統計,代碼里用到的變量是Num_OvEvent。當發生通道1的下沿捕捉時,記錄下第1次的捕捉值【Vaule_1stCap】,并記錄下自復位以來到下沿捕捉這段事件的溢出次數,放在變量Front_Num_OvEvent里。然后進入狀態2。在狀態2的情況下當發生通道2的上沿捕獲時,記錄下第2次的捕捉值【Vaule_2ndCap】,并將整個測試周期內定時器溢出次數記錄在【Total_Num_OvEvent】,然后進入狀態3進行占空比【Signal_Duty】和脈寬【Signal_Cycle】的計算。完畢后回到初始狀態,準備下次的測量。
另外,在TIM4的更新中斷里對非初始狀態的溢出事件累加統計,放在變量【Num_OvEvent】里。
實驗代碼里用到一個變量Measure_State來記錄和表示當前測試狀態,大致流程如下。
不難看出,在整個測量過程中,我使用觸發脈沖產生的觸發事件作為每次開啟測量的起始標志。
3.3、 測量用到的算式
根據上面的介紹,1次完整的測量下來,測得的周期和占空比可以用下面算式求得:Signal_Duty =(Vaule_1stCap+(Front_Num_OvEvent*(TIM4_PERIOD+1)))/ (Vaule_2ndCap+(Total_Num_OvEvent*(TIM4_PERIOD+1)));
Signal_Freq=(Clk_Internal/(TIM4_PSC+1))/(Vaule_2ndCap+(Total_Num_OvEvent* (TIM4_PERIOD+1)));因為:計數器時鐘= Clk_Internal /(TIM4_PSC+1)或者說:
Signal_Freq =計數器時鐘/(Vaule_2ndCap+(Total_Num_OvEvent*(TIM4_PERIOD+1)));
3.4、 基本配置準備
3.4.1 、實現TIM3 通道1的PWM輸出,計數周期5s,占空比40%,用來做被測量信號。
A、選擇定時器內部時鐘作為時鐘源,STM32F411芯片定時器內部時鐘為100Mhz;
B、設置分頻比,選擇計數模式、設置計數脈沖個數;
對時鐘源20000分頻,PSC=20000-1;選擇向上計數模式up counting;
計數器基于分頻后的脈沖每計數25000個后,發生溢出并產生更新事件及中斷。則:ARR=25000-1
按照上面參數來設計,定時器的定時周期或者說溢出周期就是5s.
C、它需做PWM輸出,這里選擇PWM 模式1,占空比為40%,則CCR=(ARR+1)*0.40 =10,000
CubeMx圖形化配置界面:
3.4.2 、實現TIM4通道2做PWM模式輸入測量,假定tim4計數器溢出周期為20ms.
先做時基參數的配置:
1、選擇定時器內部時鐘為時鐘源,32F411定時器內部時鐘為100Mhz;
2、設置分頻比,選擇計數模式、設置計數脈沖個數;
先對時鐘源100分頻、即PSC=100-1; 選擇向上計數模式up counting;
計數器基于分頻后的脈沖每計數20000個,發生溢出并產生更新事件及中斷。則:ARR=20000-1
按照上面參數來設計,定時計數周期或者說溢出周期就是20ms.
再看看定時器TIM4主從模式配置和捕獲配置:TIM4輸入捕捉通道2配置為直接輸入捕捉,捕捉極性選擇上升沿。TIM4輸入捕捉通道1配置為間接輸入捕捉,捕捉極性選擇為下降沿。
3.5 、工程代碼的生成、添加和整理
通過STM32CUBEMX依據上述參數完成配置,并開啟TIM4的中斷使能,然后生成工程。再在工程里添加應用戶代碼。
//__HAL_TIM_CLEAR_IT(&htim4, TIM_IT_UPDATE);
//__HAL_TIM_ENABLE_IT(&htim4, TIM_IT_UPDATE);
HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_2);HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_1); MeasMure_State = 0x00; Num_OvEvent = 0x00; __HAL_TIM_CLEAR_IT(&htim4, TIM_IT_TRIGGER);
TIM4中斷處理代碼說明:
發生觸發事件時,進入測量狀態:
在TIM4通道1發生下沿捕捉事件時:
在TIM4通道2發生上沿捕捉事件時:
另外,在測試狀態下,TIM4的更新中斷對溢出事件進行統計。
4. 實驗結果驗證
實驗中tim4的時基參數保持不變,主要調整TIM3的PWM輸出波形的脈寬和占空比,來看看實驗結果。尤其看看當待測脈寬遠長于TIM4定時器的溢出周期時的情況。
為了便于參數的修改和測試,這里針對TIM3和TIM4的時基參數定義了幾個宏:
我們選取幾組數據,直接聯機觀察運行結果。// pulse cycle = ((TIM3_PSC+1) * (TIM3_PERIOD+1))/100,000,000 【s】// 5s ==>500,000,000 // 9s ==>900,000,000 //80ms ==>8,000,000 //20ms ==>2,000,000 //100us ==>10,000 //10us ==>1000 //5us ==>500
小結
上面實驗的實現思路及提到的代碼,僅供參考,旨在拋磚引玉。
其它地方也有相關的例程,不過往往有個前提,待測信號的周期不能長于用來測量的定時器的溢出周期。如果按照上面的代碼設計,就擺脫了這個限制。基于現有軟硬件環境,我們可以對一定寬度以上的外來脈沖準確測量其脈沖寬度及占空比,當然這個一定寬度跟我們的軟硬件環境有關,比方時鐘頻率、計數脈沖精度、代碼效率等。
上一期我們做了基于定時器單個捕獲通道測量脈沖寬度與占空比,今天做了基于定時器pwm輸入模式測量脈沖寬度與占空比,不妨簡單比較下:
點擊鏈接觀看更多相關課程
電堂科技?c.51diantang.com總結
以上是生活随笔為你收集整理的c++ 定时器_【话说定时器系列】之十:PWM输入模式测量脉宽及占空比实验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 瞬时极性法对正负反馈的判断方法_直流电焊
- 下一篇: matlab相关系数影像匹配_双目立体匹