一,前言
正常情況是雙通道捕獲PWM波,這種方法簡單且準(zhǔn)確,但是它占用的資源太多了,因為它使用定時器的兩個通道,且這兩個通道映射在一個通道上,同時配置一路捕獲為觸發(fā)定時器復(fù)位,所以只能使用2個通道來捕獲。雖然也實現(xiàn)了捕獲 PWM 的功能,但是代價也太大了,且很難同時捕獲多個 PWM ,那有沒有更好的方法呢?本文介紹了另一種捕獲 PWM 的方法,只使用任何一路定時器的輸入捕獲,就可以測 PWM 的頻率和占空比。
二、捕獲PWM原理
雙通道就是上圖的原理,利用兩路輸入捕獲上升沿和下降沿,就能很簡單的測出 PWM 頻率和占空比。
分析上圖,最開始捕獲上升沿,在上升沿到來后開始捕獲,然后轉(zhuǎn)為捕獲下降沿,捕獲接下來的兩個下降沿,依據(jù)兩個下降沿之間計數(shù)的差值即可計算出PWM的總脈寬,從而計算出PWM頻率,然后由第一個下降沿的計數(shù)值可以計算得出PWM高電平的脈寬,即可計算出PWM的占空比。有的人可能會問,那我為什么不可以以上升沿開始捕獲,然后連續(xù)捕獲下降沿和下一個上升沿呢?理論上這樣是絕對沒問題的,但是你想過沒有,既然可以這樣,那么 《STM32參考手冊》上為什么要用兩路輸入捕獲來測PWM?問題就在于 PWM的占空比以及頻率。當(dāng)PWM頻率很快的時候,上升沿和下降沿切換的速度很快,而用一路輸入捕獲在很短的時間內(nèi)切換捕獲上升沿以及下降沿,很可能導(dǎo)致上升沿或者下降沿沒捕捉到的情況。就比如PWM高電平的時間很短,你剛捕獲到上升沿,然后切換捕捉下降沿,結(jié)果PWM的下降沿已經(jīng)過去了。使用我的方法測PWM波的時候,從圖中可以看到,至少兩個下降沿的捕獲是不會有問題的,也就是說,PWM頻率的測量是不會出錯的。而在從捕獲上升沿到切換捕獲下降沿的時候,上述捕獲不到的問題依然會發(fā)生,那為什么我的方法就可以而其他方法就不行呢。原因就在于,上面已經(jīng)提到過,我的方法PWM脈寬測量是沒問題的,那么我就可以比較第一個下降沿時的計數(shù)值CNT1和CNT2(PWM脈寬的計數(shù)值),如果CNT1大,那表示遺漏了一個下降沿,那么高電平的計數(shù)值為CNT1-CNT2,反之高電平的計數(shù)值為CNT1。
一路輸入捕獲的配置比兩路的配置簡單,就是普通的輸入捕獲。具體的代碼這里就不貼出來了,可以去參考我上一篇文章。這里把關(guān)鍵的捕獲中斷服務(wù)函數(shù)貼出來:代碼如下:
u8 TIM5CH1_CAPTURE_STA=0; //輸入捕獲狀態(tài)static u16 TIM5CH1_CNTTIME=0;u32 TIM5CH1_CAPTURE_VAL=0; //輸入捕獲值u32 TIM5CH1_CAPTURE_HIGHVAL=0; //定時器5中斷服務(wù)程序 void TIM5_IRQHandler(void){ if(!(TIM5CH1_CAPTURE_STA&0X80))//還未成功捕獲{if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET){if(TIM5CH1_CAPTURE_STA&0X40)//已經(jīng)捕獲到高電平了{TIM5CH1_CAPTURE_VAL+=65536;}TIM_ClearITPendingBit(TIM5, TIM_IT_Update); //清除中斷標(biāo)志位}if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕獲1發(fā)生捕獲事件{if(TIM5CH1_CAPTURE_STA&0x20) //捕獲到第二個下降沿{TIM5CH1_CAPTURE_STA|=0X80;TIM5CH1_CAPTURE_VAL+=TIM5->CCR1-TIM5CH1_CNTTIME-TIM5CH1_CAPTURE_HIGHVAL;if(TIM5CH1_CAPTURE_HIGHVAL>TIM5CH1_CAPTURE_VAL)TIM5CH1_CAPTURE_HIGHVAL-=TIM5CH1_CAPTURE_VAL;else if(TIM5CH1_CAPTURE_HIGHVAL==TIM5CH1_CAPTURE_VAL)TIM5CH1_CAPTURE_HIGHVAL=0;TIM5->CCER &= ~(1<<1); //CC1P=0 設(shè)置為上升沿捕獲}else if(TIM5CH1_CAPTURE_STA&0X40) //捕獲到第一個下降沿{TIM5CH1_CAPTURE_STA|=0X20; //標(biāo)記成功捕獲到一次下降沿TIM5CH1_CAPTURE_HIGHVAL=TIM5CH1_CAPTURE_VAL+TIM5->CCR1-TIM5CH1_CNTTIME;}else //還未開始,第一次捕獲上升沿{TIM5CH1_CNTTIME=TIM5->CCR1;TIM5CH1_CAPTURE_VAL=0;TIM5CH1_CAPTURE_STA|=0X40; //標(biāo)記捕獲到了上升沿TIM5->CCER |= (1<<1); //CC1P=1 設(shè)置為下降沿捕獲}TIM5->SR&=0xfffd;// TIM_ClearITPendingBit(TIM5, TIM_IT_CC1); //清除中斷標(biāo)志位} }elseTIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中斷標(biāo)志位}
-
PWM
+關(guān)注
關(guān)注
114文章
5180瀏覽量
213781 -
定時器
+關(guān)注
關(guān)注
23文章
3246瀏覽量
114713 -
雙通道
+關(guān)注
關(guān)注
5文章
954瀏覽量
33765
發(fā)布評論請先 登錄
相關(guān)推薦
評論