小熊STM32学习总结:STM32的定时器--输入捕捉模式

时间:2022-04-19 23:31:56

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的结构框图的一部分


小熊STM32学习总结:STM32的定时器--输入捕捉模式


  红色箭头所指,这才找到原因,触发的信号源只有这四种,而通道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/