电子产业
数字化服务平台

扫码下载
手机洽洽

  • 微信小程序

    让找料更便捷

  • 扫码下载手机洽洽

    随时找料

    即刻洽谈

    点击下载PC版
  • 华强电子网公众号

    电子元器件

    采购信息平台

  • 华强电子网移动端

    生意随身带

    随时随地找货

  • 华强商城公众号

    一站式电子元器件

    采购平台

  • 芯八哥公众号

    半导体行业观察第一站

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

来源:华强电子网 作者:华仔 浏览:2283

标签:

摘要: 调试STM32的定时器好几天了,也算是对STM32的定时器有了点清楚的认识了。我需要测量4路信号的频率然后通过DMA将信号的频率传输到存储器区域,手册说的很明白每个定时器有4个独立通道。然后我就想能不能将这4路信号都连接到一个定时器的4个通道上去。理论上应该是行的通的。刚开始俺使用的是TIM2的1 2 3通道,TIM4的2通道来进行频率的测量。由于没有频率发生器,所以我用tim

调试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的值即为信号的周期



技术资讯 技术方案 技术应用 技术新品 技术前沿 行业资讯 行业方案 行业应用 行业新品 行业前沿
型号 厂商 价格
EPCOS 爱普科斯 /
STM32F103RCT6 ST ¥461.23
STM32F103C8T6 ST ¥84
STM32F103VET6 ST ¥426.57
STM32F103RET6 ST ¥780.82
STM8S003F3P6 ST ¥10.62
STM32F103VCT6 ST ¥275.84
STM32F103CBT6 ST ¥130.66
STM32F030C8T6 ST ¥18.11
N76E003AT20 NUVOTON ¥9.67