原创 STM32 TIM输入捕获模式记录

2008-10-14 21:15 12272 6 9 分类: MCU/ 嵌入式
调试的过程中,总能遇到一些问题,很庆幸能遇到那么多的问题,也许这就是最好的学习过程:

继续我的笔记:
    在main函数中,文件名:main.c
    对TIM2的CH1,CH2配置如下:

      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_2;                     //选择通道2
  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);


  TIM1->PSC = 10;  //由于要测量的信号频率为200-1000HZ 采取10倍的预分频
  TIM2->PSC = 10;  //如果不分频最小的频率为1100hz,分频后可以测量的频率为110HZ,为了达到最佳捕捉效果,且满足要求建议分频系数设为6;

   /* Select the TIM2 Input Trigger: TI2FP2 【输入触发源选择】*/
  TIM_SelectInputTrigger(TIM2,TIM_TS_TI1FP1);                      //参考TIM结构图选择滤波后的TI2输入    寄存器SMCR
       
  /* 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的CH1跟CH2上面去,然后通过TI1FP1跟TI2FP2轮流触发 ,TIM2->CCR1与TIM2->CCR2记录下来的数据就是信号的周期,接着根据具体的情况计算出信号的频率。那么,究竟是怎么实现TI1FP1跟TI2FP2轮流触发呢?这就是DMA的问题了,当信号的周期被TIM2->CRRx收到,DMA就会将这个数据送到一个存储器区。DMA传输完数据后就会发生中断,我在DMA传输中断函数中修改触发信号源。
比如说DMA-CH5传输到是TIM2->CRR1
他的中断函数如下:
void DMAChannel5_IRQHandler(void)
{
    if (DMA_GetITStatus(DMA_IT_TC5) != RESET)
    {
        DMA_ClearITPendingBit(DMA_IT_TC5);
        /* Select the TIM2 Input Trigger: TI2FP2 【输入触发源选择】*/
        TIM_SelectInputTrigger(TIM2,TIM_TS_TI2FP2); 
        上句就是修改触发源轮流触发
    }
}

但是实验的过程中发现 两个通道所测量得到信号的周期  怎么着都只有一组是正确
例如:
56b16f58-f48d-47ee-a6dd-ccd07a5251c9.jpg
最后通过高人的指点才发现:
原来这个定时器只有一个COUNT(计数器)
当我选择执行 TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset);这个函数,问题就来了,当一路有信号触发,count复位,那么另一路永远也得不到正确的值。。所以测量信号频率还有待改良。。。。


2008年10.14 晚九点
实验室看门的又来催了 ,记录到此 



文章评论3条评论)

登录后参与讨论

用户165162 2008-12-26 16:41

我们做的时候也不是就采样一路,同时有4路在工作呢

用户165162 2008-12-26 16:40

三路操作 如果是硬件去实现不大好整,你仔细看一下那个TIM的组成框图吧,把每一个通道得到的值,一前一后相减即可

用户151974 2008-12-15 14:30

帮博主顶一下!!我现在想用三路输入捕获,三路我无法实现,看了帖子一路是没问题了.博主能实现三路的时间不要忘了共享一下哈!
相关推荐阅读
用户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...
我要评论
3
6
关闭 站长推荐上一条 /2 下一条