原创 STM32的定时器--输入捕捉模式

2008-10-14 15:32 14912 6 10 分类: MCU/ 嵌入式
   调试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的结构框图的一部分
16ba7c1c-0b01-4ce9-a1fb-16daf6b746ac.jpg
红色箭头所指,这才找到原因,触发的信号源只有这四种,而通道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的值即为信号的周期

笔记记得不是太好,还希望对调试这部分的朋友有所帮助!





文章评论4条评论)

登录后参与讨论

用户209205 2011-7-8 21:01

最近在使用STM32的定时器输入捕获功能,一直存在问题,麻烦帮忙看一下,哪里有问题。谢谢了。 http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4862265&bbs_page_no=1&bbs_id=3020

用户559531 2009-6-2 18:09

很有实际意义! 博主有没试过:tim2 的通道1配置为输入捕获模式, tim2 的通道2配置为输出比较模式,也就是说,用通道2来发脉冲,而用通道1来计脉冲个数。

用户165162 2008-10-14 18:45

是的 他们是有所不同PWM输入模式不光能测量频率而且可以测量信号的占空比,但是要占用2个通道,而输入捕捉模式只需要占用一个通道就可以,感谢您的支持

用户1090342 2008-10-14 15:57

哈哈,帮博主顶一下。 输入捕捉模式与PWM输入模式有所不同,都可以测量输入信号的频率。
相关推荐阅读
用户165162 2010-10-15 23:43
CANopen简介
CANopen简介    CANopen协议集定义了基于CAN的分布式工业自动化系统的应用标准以及CAN应用层通信标准。CANopen是CAN-in-Automation(CiA)定义的标准之一,并且...
用户165162 2009-03-04 22:34
TServerSocket和TClientSocket地运用(转载)
在网络编程中,WinSocket API编程是最基本,也是最麻烦的地方(说句不怕影响形象的话,我对此就是一知半解)。但是,如果你是使用C++Builder作为编程平台,你就偷着乐吧,有了BCB,菜鸟变...
用户165162 2008-11-09 11:40
奥巴马就职演讲
Hello, Chicago!   芝加哥,你好!If there is anyone out there who still doubts that America is a place where...
用户165162 2008-11-02 12:43
STM32 RTC 对晶振的要求实在不地道
zhwxc 发表于 2008-8-19 18:00 ST MCU ←返回版面 楼主: STM32 RTC 对晶振的要求实在不地道今天到电子市场找了一下,几乎都是12.5p负载电容的32768晶...
用户165162 2008-11-01 14:50
模糊K均值算法的C++实现
//****************************************************************************////文件名:kaverage.cpp  ...
用户165162 2008-10-20 17:50
10种软件滤波方法的示例程序[转帖]
1、限副滤波 /* A值可根据实际情况调整 value为有效值,new_value为当前采样值 滤波程序返回有效的实际值 */ #define A 10 char value; char filter...
我要评论
4
6
关闭 站长推荐上一条 /2 下一条