单片机
返回首页

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

2019-08-15 来源:eefocus

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


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



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


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 光控音效发生器电路

  • 非常简单的150W功放电路图

  • 基于IC555的可变PWM振荡器电路

  • 如何使用LED驱动器LM3915制作振动计

  • 一个简单的立体声平衡指示器电路

  • 使用NE555和磁簧开关的橱柜照明电路

    相关电子头条文章