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%,與實際值在誤差允許範圍內近似相等,程式正確。