1. 程式人生 > >STM32F429--STM32的PWM佔空比產生與測量

STM32F429--STM32的PWM佔空比產生與測量

一、PWM波形的產生;

使用定時器2 (TIM2)PA5埠輸出。

通過配置

TIM_TimeBaseStructure.TIM_Period= 1000 - 1;

TIM_TimeBaseStructure.TIM_Prescaler= 9000 - 1;

TIM_OCInitStructure.TIM_Pulse= 300 ;

三個引數,TIM_Prescaler控制計數頻率,此處9000即計數頻率為90M/9000 = 10Khz,即計數一次的時間為0.1ms,TIM_Period控制PWM波週期時間,此處1000即PWM波的週期為1000*0.1ms = 100ms;TIM_Pulse控制有效電平時間,此處300即有效電平時間為300*0.1ms=30ms;呼叫初始化程式,上點即產生PWM波訊號。

二、PWM波佔空比的測量:

捕獲輸入通過定時器5(TIM5)通道二PA1埠;

初始化函式同課堂使用的函式,此處略寫。

下面詳寫捕獲中斷服務函式。

定義五個變數

TIM5CH1_CAPTURE_STA 存放輸入捕獲狀態     

TIM5CH1_CAPTURE_VAL存放輸入捕獲值(TIM2/TIM5是32位)

CATCH2 存放第一次觸發中斷到第二次觸發中斷的時間;

CATCH3 存放第二次觸發中斷到第三次觸發中斷的時間;

okflag 捕獲結束標誌位;

捕獲原理:通過獲取第一次觸發中斷到第二次觸發中斷的時間,和第二次到第三次觸發的時間,兩次時間求和即為總時間,即週期,然後用     (前文產生PWM波使用的是高電平有效);

一個成功的捕獲週期順序如上圖示識1-2-3所示:

過程1:原本初始化之後,該中斷為下降沿觸發,所以當檢測到有下降沿時進入到該中斷服務函式,此時

if(TIM5CH1_CAPTURE_STA & 0x80)

if(TIM5CH1_CAPTURE_STA&0X40)

以上兩個if均不成立,所以程式直接進入最後一個else中,先進行清空操作,然後把STA標誌位次高位置1,表示捕獲到了第一次,捕獲了一個下降沿,初始化定時器5(TIM5),然後開啟定時器,將中斷捕獲觸發訊號改為上升沿觸發,下一次為上升沿觸發;

過程2:第二次進入該中斷服務函式時

if(TIM5CH1_CAPTURE_STA&0X40)

成立,進入第二個階段,將標誌位STA最高位置1,表示捕獲完第二次,將當前時間存入全域性變數:CATCH2中,初始化定時器5(TIM5),然後開啟定時器,將中斷捕獲觸發訊號改為下降沿觸發,下一次為下降沿觸發。

過程3:第三次進入該中斷服務函式時:

if(TIM5CH1_CAPTURE_STA & 0x80)

成立,進入第三階段,獲取當前定時器時間,放入全域性變數CATCH3,即第二次捕獲到第三次捕獲時間間隔,即高電平時間,將全域性標誌位okflag置1,通知main函式接下來可以列印到串列埠了。

main 函式中新建變數Comp存放佔空比,total存放CATCH2+CATCH3即總時間,週期。用高電平時間CATCH3/total即佔空比。

三、執行結果

測出佔空比為29%,與實際值在誤差允許範圍內近似相等,程式正確。