STM32定時器是 ST MCU 内部最基礎且常用的外設,實際應用尤為普遍。去年,電堂推出了《STM32 TIMER基礎及常規應用介紹》,為大家梳理了 STM32 TIMER 的龐大内容,涵蓋 TIMER 的基本應用原理、常規應用等。現在将課程内容整理為文章,針對STM32定時器有基本了解的用戶,分享具體的應用實現環節及常見問題解決。
本文為【STM32定時器】系列第九篇分享文章,重點介紹通過定時器單個通道測量信号脈寬及占空比。
實驗内容
一般來講,通過STM32單片機對外來脈沖信号測量其脈沖寬度及占空比的方法較多,即使使用STM32定時器的捕獲功能,我們可以使用一個通道、也可以使用兩個通道;可以使用定時器基本的輸入捕獲功能實現、也可以利用PWM輸入模式結合定時器的從模式來完成。這裡使用支持輸入捕獲功能的定時器的單個通道,來實現對1路外來信号脈沖寬度及占空比的測量,并在測量過程中統計和計算用于測量的定時器自身的溢出事件。
這裡用到的開發闆:STM32F411 Nucleo 闆 【實驗對開發闆并無特别要求】,集成開發環境不限。 這裡用的是ARM MDK IDE。
在初始狀态【沒進入測量的狀态】下基于上升沿發起第一次捕捉,記錄下第1次的捕捉值【Capture_1st】,并開啟TIM4定時器溢出事件的統計,同時将捕獲極性切換為下沿捕捉。之後進入狀态1,等待後續的下沿捕獲。
當發生下沿捕獲時,記錄下第2次的捕捉值【Capture_2nd】,并将前面這段時間的定時器溢出次數也記錄下來【Front_Num_OvEvent】,再次将極性切換為上沿捕捉,進入狀态2,等待第3次捕獲。在狀态2的情況下,當發生上沿捕獲時,記錄下第3次的捕捉值【Capture_3rd】,并将整個測試周期内發生的定時器溢出次數記錄下來【Total_NuOvEvent】,然後進入狀态3進行占空比【Signal_Duty】和脈寬【Signal_Cycle】的計算。完畢後回到初始狀态,準備下次的測量。另外,在TIM4的更新中斷裡對非初始狀态的溢出事件累加統計,放在變量【Num_OvEvent】裡。實驗代碼裡用到一個變量Measure_State來記錄和表示當前測試狀态。
3.2 測量用到的算式
根據上面的介紹,那1次完整的測量下來,測得的周期和占空比可以用下面算式求得:
Signal_Duty=(Capture_2nd (Front_Num_OvEvent*(TIM4_PERIOD 1))-Capture_1st)/(Capture_3rd (Total_Num_OvEvent*(TIM4_PERIOD 1))-Capture_1st)
Signal_Freq=Clk_Internal/((Capture_3rd (Total_Num_OvEvent*(TIM4_PERIOD 1))-Capture_1st)*(TIM4_PSC 1 ));
因為:計數器時鐘= Clk_Internal /(TIM4_PSC 1)
或者說:
Signal_Freq計數器時鐘/(Capture_3rd (Total_Num_OvEvent*(TIM4_PERIOD 1))-Capture_1st);
3.3 基本配置準備
3.3.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.3.2 實現TIM4通道2的輸入捕獲,假定計數器溢出周期為20ms.
1、選擇定時器内部時鐘為時鐘源,32F411定時器内部時鐘為100Mhz;
2、設置分頻比,選擇計數模式、設置計數脈沖個數;
先對時鐘源100分頻、即PSC=100-1; 選擇向上計數模式up counting;計數器基于 分頻後的脈沖每計數20000個,發生溢出并産生更新事件及中斷。則:
ARR=20000-1
按照上面參數來設計,定時計數周期或者說溢出周期就是20ms.
另外,通道2配置為輸入捕捉,初始捕捉極性位選擇上升沿。
3.4 工程代碼的生成、添加和整理
通過STM32CUBEMX依據上述參數完成配置,并開啟TIM4的中斷使能,然後生成工程。
再在工程裡添加應用戶代碼。
TIM4中斷處理代碼說明:
在TIM4通道2的比較中斷裡做3次捕捉值的獲取以及計算,在TIM4更新中斷裡對溢出事件進行統計。
實驗結果驗證
實驗中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
//500ms ==>50,000,000 //80ms ==>8,000,000
//20ms ==>2,000,000 /////Same with measuring TIM4 cycle
//1ms ==>100,000 //100us ==>10,000
//10us ==>1000 //5us ==>500
…… 4 us?
小結
上面實驗的實現思路及提到的代碼,僅供參考,旨在抛磚引玉。
其它地方也有相關的例程,不過往往有個前提,待測信号的周期不能長于用來測量的定時器的溢出周期。如果按照上面的代碼設計,就沒有這個限制了。基于現有軟硬件環境,我們可以對一定寬度以上的外來脈沖準确測量其脈沖寬度及占空比,當然這個一定寬度跟我們的軟硬件境有關,比方時鐘頻率、計數脈沖精度、代碼效率等。基于剛才的實驗來看,5us以上時都能準确測得結果。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!