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