STM32定时器(三)输入捕获

发布时间:2024-08-05  

一、STM32定时器捕获功能

STM32的定时器是支持信号输入捕获的,何为输入捕获?主要做什么应用?


输入捕获:通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变的时候,将当前的定时器的值(TIMx_CNT)存放到对应的捕获比较寄存器里面,完成一次捕获。输入捕获主要应用于测量信号的脉宽或频率。

下图是定时器原理图的输入捕获框图部分

图片

第一部分是设置滤波器,用来对信号进行滤波,信号从TI1输入,通过滤波器,输出TIF信号,正常情况下信号没有抖动,TI1F信号等于TI1的输入信号。

ICF[3:0]用来设置输入采样频率的数字滤波器的长度,如ICF=0011,会在捕获上升沿时,以fCK_INT的频率连续采样八次通道1的信号电平,若都为高电平,则说明这是一个有效的触发,就会触发捕获中断,这样就可以滤除那些高电平低于八个采样周期的脉冲信号,达到滤波的效果,如果不做滤波处理,设置为ICF=0000,只要检测到跳边沿,就会触发捕获。

在TIMx捕获/比较模式寄存器(TIMx_CCMR1)的位7:4

图片

fDTS频率根据TIMx_CR1的CKD[1:0]设置

位9:8 CKD:时钟分频,此位域指示定时器时钟(CK_INT)频率与数字滤波器所使用的采样时钟(ETR、TIx)之间的分频比。

图片

第二部分:设置输入捕获极性:配置边沿检测器检测上升沿还是下降沿。在TIMx捕获/比较使能寄存器(TIMx_CCER)的

图片

第三部分:设置输入捕获映射通道:通道一信号也可以映射到通道二上,同理通道二信号也可以映射到通道一上。在TIMx捕获/比较模式寄存器(TIMx_CCMR1)的

图片

第四部分:设置输入输出捕获分频器,就是设置检测到几次跳变后触发捕获。在TIMx捕获/比较模式寄存器(TIMx_CCMR1)的

图片

同时要开启输入捕获1使能,在TIMx捕获/比较使能寄存器(TIMx_CCER)的

图片

第五部分:捕获到有效信号开启中断。在DMA/中断使能寄存器(TIMx_DIER)

图片

二、输入捕获配置步骤

输入捕获配置的一般步骤

① 初始化定时器和通道对应IO的时钟。

② 初始化IO口,模式为复用:

③设置引脚复用映射:

④初始化定时器ARR,PSC

⑤初始化输入捕获通道

⑥如果要开启捕获中断,

⑦使能定时器:

⑧编写中断服务函数:

三、输入捕获编程


以TIM5_CH1为例,


//定时器5通道1输入捕获配置

//arr:自动重装值(TIM5是32位)

//psc:时钟预分频数

void TIM5_CH1_Cap_Init(u32 arr,u16 psc)

{     

  RCC- >APB1ENR|=1< < 3;     //TIM5 时钟使能 

  RCC- >AHB1ENR|=1< < 0;     //使能PORTA时钟  

  GPIO_Set(GPIOA,PIN0,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PD);//复用功能,下拉

  GPIO_AF_Set(GPIOA,0,2);  //PA0,AF2

  TIM5- >ARR=arr;      //设定计数器自动重装值   

  TIM5- >PSC=psc;      //预分频器 

  TIM5- >CCMR1|=1< < 0;    //CC1S=01   选择输入端 IC1映射到TI1上

  TIM5- >CCMR1|=0< < 4;     //IC1F=0000 配置输入滤波器 不滤波

  TIM5- >CCMR1|=0< < 10;   //IC1PS=00   配置输入分频,不分频 

  TIM5- >CCMR1|=1< < 0;    //CC1S=01   选择输入端 IC1映射到TI1上

  TIM5- >CCER|=0< < 1;     //CC1P=0  上升沿捕获

  TIM5- >CCER|=1< < 0;     //CC1E=1   允许捕获计数器的值到捕获寄存器中

  TIM5- >EGR=1< < 0;      //软件控制产生更新事件,使写入PSC的值立即生效,否则将会要等到定时器溢出才会生效!

  TIM5- >DIER|=1< < 1;     //允许捕获1中断        

  TIM5- >DIER|=1< < 0;     //允许更新中断  

  TIM5- >CR1|=0x01;      //使能定时器2

  MY_NVIC_Init(2,0,TIM5_IRQn,2);//抢占2,子优先级0,组2

中断服务函数:


//中断服务函数

//捕获状态,定义一个u8变量TIM5CH1_CAPTURE_STA,表示输入捕获状态

//[7]:0,没有成功的捕获;1,成功捕获到一次.

//[6]:0,还没捕获到低电平(下降沿);1,已经捕获到低电平(下降沿)了.

//[5:0]:捕获高电平后溢出的次数(对于32位定时器来说,1us计数器加1,溢出时间:4294秒)

u8  TIM5CH1_CAPTURE_STA=0;                  //输入捕获状态                

u32  TIM5CH1_CAPTURE_VAL;                   //输入捕获值(TIM5是32位)

//定时器5中断服务程序   

void TIM5_IRQHandler(void)

{         

  u16 tsr;

  tsr=TIM5- >SR;

   if((TIM5CH1_CAPTURE_STA&0X80)==0)        //还未成功捕获  

  {

    if(tsr&0X01)                            //溢出

    {       

      if(TIM5CH1_CAPTURE_STA&0X40)          //定时器溢出,说明已经捕获到上升沿,本次捕获的是下降沿

      {

        if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了

        {

          TIM5CH1_CAPTURE_STA|=0X80;        //标记成功捕获了一次

          TIM5CH1_CAPTURE_VAL=0XFFFFFFFF;

        }else TIM5CH1_CAPTURE_STA++;

      }   

    }

    if(tsr&0x02)                      //CH1发生捕获事件,已经捕获到上升沿,TIMx_CCR1中已捕获到计数器值(IC1上已检测到与所选极性匹配的边沿)

    {  

      if(TIM5CH1_CAPTURE_STA&0X40)    //CC1IF为1,说明已经捕获到了上升沿(第一次捕获上升沿参考else),本次捕获到的是下降沿     

      {          

        TIM5CH1_CAPTURE_STA|=0X80;    //标记成功捕获到一次高电平脉宽

          TIM5CH1_CAPTURE_VAL=TIM5- >CCR1;  //获取当前的捕获值.CCR1为上一个输入捕获1事件(IC1)发生时的计数器的值

         TIM5- >CCER&=~(1< < 1);         //CC1P=0 设置为上升沿捕获,为下一次捕获做准备

      }else                           //还未开始,第一次捕获上升沿

      {

        TIM5CH1_CAPTURE_STA=0;        //清空

        TIM5CH1_CAPTURE_VAL=0;        //捕获值清零

        TIM5CH1_CAPTURE_STA|=0X40;    //标记捕获到了上升沿

        TIM5- >CR1&=~(1< < 0)    ;       //使能定时器2

         TIM5- >CNT=0;                 //计数器清空

         TIM5- >CCER|=1< < 1;            //CC1P=1 设置为下降沿捕获

        TIM5- >CR1|=0x01;              //使能定时器2

      }        

    }                              

   }

  TIM5- >SR=0;//清除中断标志位   

}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    出信号连接到TIM3,并触发TIM3的定时器启动。同样,TIM3的定时器使能信号又作为TIM4的触发信号,连接到TIM4的内部触发输入端触发启动TIM4. 在所有定时器......
    体一点说,就是其它定时器的触发输出信号连接到本定时器的内部触发输入端ITRx,x可能是0~3,也就是说常规定时器内部最多可以4路内部输入选择端。 结合前面的介绍,不论来自本定时器外部的哪一类触发输入......
    制链接到浏览器打开) 2 资料的主要内容 • STM32定时器概述 • 定时器时基单元 • 定时器输入捕捉功能 • 定时器比较输出功能 • 定时器触发同步与级联 • 定时器DMA批量传送 • 定时器产生的触发输......
    数据的一半传输完成时置位; 传输完成:当块传输完成时置位; 传输错误:当数据传输出错时置位; 全局中断:每当半传输、传输完成或传输出错时置位; DMAMUX中断 中断事件: 请求发生器触发溢出:当下一个触发输入......
    ,通过设置触发条件也可以生成DMA触发请求。这样就比较灵活了,不支持DMA的外设也可以通过Trigger inputs接口触发DMA传输,比如我们可以将RAM中的数据通过定时器触发直接输出到GPIO,这样......
    由各自的影子寄存器和预装载寄存器组成 如果使能了预装载机制,那么只有更新事件时,数据才进行装载动作 定时器四大事件 更新事件:比如影子寄存器更新往往需借助该事件 触发事件:定时器收到各类触发输入信号时激发该事件 捕获......
    部事件可以选择,这些触发源大致可以分为以下四类,具体可以参考 RM 中关于adc_ext_trgx 和 adc_jext_trgx 的描述。 • 定时器的比较/捕获事件 • 定时器的触发输出 TRGO......
    stm32定时器外部时钟3使用外部时钟源模式2进行定时的步骤;stm32中的通用定时器的计数时钟有三种,内部时钟、外部时钟源、内部触发输入这三种,其中内部时钟是大家都比较常用的,也是......
    ,主要用于 DAC 触发。每当 DAC 接口在所选的定时器触发输出 (TIMx_TRGO) 上检测到上升沿时,DAC_DHRx 寄存器中存储的最后一个数据即会转移到 DAC_DORx 寄存器中。 4......
    化或者由内部/外部触发计数)   C.输入捕获   D.输出比较   E.支持针对定位的增量(正交)编码器和霍尔传感器电路   F.触发输入作为外部时钟或者按周期的电流管理   2、stm32通用定时器......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>