tft每日頭條

 > 圖文

 > 定時器怎麼連續使用單脈沖模式

定時器怎麼連續使用單脈沖模式

圖文 更新时间:2024-11-24 16:47:17

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來記錄和表示當前測試狀态。

定時器怎麼連續使用單脈沖模式(話說定時器系列)1

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圖形化配置界面:

定時器怎麼連續使用單脈沖模式(話說定時器系列)2

定時器怎麼連續使用單脈沖模式(話說定時器系列)3

3.3.2 實現TIM4通道2的輸入捕獲,假定計數器溢出周期為20ms.

1、選擇定時器内部時鐘為時鐘源,32F411定時器内部時鐘為100Mhz;

2、設置分頻比,選擇計數模式、設置計數脈沖個數;

先對時鐘源100分頻、即PSC=100-1; 選擇向上計數模式up counting;計數器基于 分頻後的脈沖每計數20000個,發生溢出并産生更新事件及中斷。則:

ARR=20000-1

按照上面參數來設計,定時計數周期或者說溢出周期就是20ms.

另外,通道2配置為輸入捕捉,初始捕捉極性位選擇上升沿

定時器怎麼連續使用單脈沖模式(話說定時器系列)4

定時器怎麼連續使用單脈沖模式(話說定時器系列)5

3.4 工程代碼的生成、添加和整理

通過STM32CUBEMX依據上述參數完成配置,并開啟TIM4的中斷使能,然後生成工程。

再在工程裡添加應用戶代碼。

定時器怎麼連續使用單脈沖模式(話說定時器系列)6

TIM4中斷處理代碼說明:

在TIM4通道2的比較中斷裡做3次捕捉值的獲取以及計算,在TIM4更新中斷裡對溢出事件進行統計。

定時器怎麼連續使用單脈沖模式(話說定時器系列)7

定時器怎麼連續使用單脈沖模式(話說定時器系列)8

定時器怎麼連續使用單脈沖模式(話說定時器系列)9

定時器怎麼連續使用單脈沖模式(話說定時器系列)10

實驗結果驗證

實驗中tim4的時基參數保持不變,主要調整TIM3的PWM輸出波形的脈寬和占空比,來看看實驗結果。尤其看看當待測脈寬遠長于TIM4定時器的溢出周期時的情況。

為了便于參數的修改和測試,這裡針對TIM3和TIM4的時基參數定義了幾個宏:

定時器怎麼連續使用單脈沖模式(話說定時器系列)11

定時器怎麼連續使用單脈沖模式(話說定時器系列)12

定時器怎麼連續使用單脈沖模式(話說定時器系列)13

。。。。。。

我們選取幾組數據,直接聯機觀察運行結果。

// 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每日頭條,我们将持续为您更新最新资讯!

查看全部

相关圖文资讯推荐

热门圖文资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved