1. 程式人生 > >小熊STM32學習總結:STM32的定時器--輸入捕捉模式

小熊STM32學習總結:STM32的定時器--輸入捕捉模式


除錯STM32的定時器好幾天了,也算是對STM32的定時器有了點清楚的認識了。我需要測量4路訊號的頻率然後通過DMA將訊號的頻率傳輸到儲存器區域,手冊說的很明白每個定時器有4個獨立通道。然後我就想能不能將這4路訊號都連線到一個定時器的4個通道上去。理論上應該是行的通的。剛開始俺使用的是TIM2的1 2 3通道,TIM4的2通道來進行頻率的測量。由於沒有頻率發生器,所以我用tim3作為訊號源,用TIM2,TIM4來進行測量就ok了。


  請看一開始的程式,以TIM2的1,3通道為例子:


  TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP;                 //配置為輸入捕獲模式         


  TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;                     //選擇通道1


  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;       //輸入上升沿捕獲 


  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;   // 通道方向選擇  


  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;               //每次檢測到捕獲輸入就觸發一次捕獲


  TIM_ICInitStructure.TIM_ICFilter = 0x0;                            //


  TIM_ICInit(TIM2, &TIM_ICInitStructure);


  TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP;                 //配置為輸入捕獲模式         


  TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;                  //選擇通道3


  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;       //輸入上升沿捕獲 


  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;   //   


  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;               //每次檢測到捕獲輸入就觸發一次捕獲


  TIM_ICInitStructure.TIM_ICFilter = 0x0;                            //


  TIM_ICInit(TIM2, &TIM_ICInitStructure);


  這個是輸入捕獲配置


  還需要做的工作就是(參考stm32參考手冊的TIM的結構框圖):


   /* Select the TIM2 Input Trigger: TI2FP2 【輸入觸發源選擇】*/


    TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1);                      //參考TIM結構圖選擇濾波後的TI1輸入作為觸發源,觸發下面程式的復位


    /* Select the slave Mode: Reset Mode */


    TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);          //復位模式-選中的觸發輸入(TRGI)的上升沿初始化計數器,並且產生一個更新線號


    /* Enable the Master/Slave Mode */


    TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);       


  //主從模式選擇


  這樣我們就可以很輕鬆的就得到了 連線在TIM2的通道1上的訊號的頻率,但是3通道的頻率的值永遠都是跳動的不準,測試了半天也沒有找到根本原因,請看TIM的結構框圖的一部分


TIM的結構框圖的一部分


  紅色箭頭所指,這才找到原因,觸發的訊號源只有這四種,而通道3上的計數器的值不可能在接受到訊號的上升沿時候,有復位這個動作,找到原因了。這就是3通道上的資料不停跳動的原因,要想的到訊號的頻率也是有辦法的,可以取連續兩次捕捉的值之差,這個值就是訊號的週期,自己根據實際情況去算頻率吧。


  有以上可以得到:


  stm32的TIM的四個通道可以同時配置成輸入捕捉模式,但是計算CH3,CH4訊號的頻率步驟有點繁瑣(取前後捕捉的差值),但是他的CH1,和CH2可以輕鬆得到:


  通道1


    /* Select the TIM2 Input Trigger: TI2FP2 【輸入觸發源選擇】*/


    TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1);                      //參考TIM結構圖選擇濾波後的TI1輸入作為觸發源,觸發下面程式的復位


    /* Select the slave Mode: Reset Mode */


    TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);          //復位模式-選中的觸發輸入(TRGI)的上升沿初始化計數器,並且產生一個更新線號


  TIMx->CRR1的值即為訊號的週期


  通道2:


    TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);                      //參考TIM結構圖選擇濾波後的TI1輸入作為觸發源,觸發下面程式的復位


    /* Select the slave Mode: Reset Mode */


    TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);          //復位模式-選中的觸發輸入(TRGI)的上升沿初始化計數器,並且產生一個更新線號


  TIMx->CRR2的值即為訊號的週期


  筆記記得不是太好,還希望對除錯這部分的朋友有所幫助!

http://www.414320.com/news/1.html

http://blog.csdn.net/xiaoxiongli/article/details/49885509

http://blog.csdn.net/xiaoxiongli/