0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32定时器(三)输入捕获

冬至子 来源:不懂幽默的秦二 作者:diandianmo 2023-07-21 14:58 次阅读

一、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;//清除中断标志位   
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 检测器
    +关注

    关注

    1

    文章

    860

    浏览量

    47651
  • 比较器
    +关注

    关注

    14

    文章

    1633

    浏览量

    107086
  • 数字滤波器
    +关注

    关注

    4

    文章

    268

    浏览量

    46978
  • 分频器
    +关注

    关注

    43

    文章

    447

    浏览量

    49801
  • stm32定时器
    +关注

    关注

    0

    文章

    13

    浏览量

    2289
收藏 人收藏

    评论

    相关推荐

    详解STM32定时器捕获功能

    STM32定时器是支持信号输入捕获的,何为输入捕获?主要做什么应用?
    的头像 发表于 01-12 17:24 8277次阅读
    详解<b class='flag-5'>STM32</b><b class='flag-5'>定时器</b><b class='flag-5'>捕获</b>功能

    STM32定时器输入捕获使用步骤

    (4)定时器PWM配置(5)串口配置(6)设置代码生成相关2.Keil配置前言本文主要内容是STM32定时器输入捕获,基于MDK_ARM,
    发表于 08-10 07:28

    stm32定时器输入捕获

    不同频率、不同占空比的方波信号、PWM信号,同时做为输入捕获功能时,可以测量脉冲宽度、实现电容按键检测等等。 一、输入捕获概念 输入
    发表于 10-13 09:13 2.4w次阅读
    <b class='flag-5'>stm32</b><b class='flag-5'>定时器</b><b class='flag-5'>输入</b><b class='flag-5'>捕获</b>

    基于STM32定时器输入捕获解析

    输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32定时器,除了TIM6和TIM7,其他定时器都有
    发表于 09-04 11:00 5974次阅读

    stm32 定时器 捕获

    输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32定时器,除了TIM6和TIM7,其他定时器都有
    发表于 09-08 17:07 2358次阅读

    基于STM32定时器捕获测量脉宽的应用示例

    我们知道,利用单片机定时器捕获功能测量脉冲信号宽度及占空比是种很常见的做法。这里以STM32定时器为例来介绍基于其捕获功能实现对脉宽的测量
    的头像 发表于 01-02 18:17 1.3w次阅读
    基于<b class='flag-5'>STM32</b><b class='flag-5'>定时器</b><b class='flag-5'>捕获</b>测量脉宽的应用示例

    华大HC32-(05)-定时器输入捕获

    华大HC32-(05)-定时器输入捕获
    发表于 11-23 18:06 28次下载
    华大HC32-(05)-<b class='flag-5'>定时器</b><b class='flag-5'>输入</b><b class='flag-5'>捕获</b>

    stm32定时器输入捕获配置步骤及实例笔记

    输入捕获的一般配置步骤:初始化定时器和通道对应IO的时钟。初始化IO口,模式为输入:GPIO_Init(); GPIO_InitStructure.GPIO_Mode = GPIO_M
    发表于 11-23 18:21 42次下载
    <b class='flag-5'>stm32</b><b class='flag-5'>定时器</b><b class='flag-5'>输入</b><b class='flag-5'>捕获</b>配置步骤及实例笔记

    STM32CubeMX——定时器输入捕获

    通用定时器在基本定时器的基础上增加了一个外部引脚,可以实现输入捕获与输出比较等功能。高级定时器TIM1与TIM8相比于通用
    发表于 12-02 14:06 9次下载
    <b class='flag-5'>STM32</b>CubeMX——<b class='flag-5'>定时器</b><b class='flag-5'>输入</b><b class='flag-5'>捕获</b>

    STM32定时器输入捕获实验

    概述输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32定时器,除了 TIM6 和 TIM7,其他定时器都有
    发表于 12-14 18:58 20次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>定时器</b><b class='flag-5'>输入</b><b class='flag-5'>捕获</b>实验

    STM32定时器TIM用作输入捕获

    定时器TIM2的通道3(PA2)为输入捕获。分频值根据自己需要设置,分频值越大采出的频率精度越低。周期最好拉满,这样采集时不会溢出。2.定时器TIM2的时钟源来自APB1,需要注意AP
    发表于 12-14 18:58 2次下载
    <b class='flag-5'>STM32</b>的<b class='flag-5'>定时器</b>TIM用作<b class='flag-5'>输入</b><b class='flag-5'>捕获</b>

    stm32捕获占空比_【话说定时器系列】之六:STM32定时器输入捕获话题

    TIMER 的基本应用原理、常规应用等。现在将课程内容整理为文章,针对STM32定时器有基本了解的用户,分享具体的应用实现环节及常见问题解决。STM32定时器除了基本计数
    发表于 12-27 19:02 2次下载
    <b class='flag-5'>stm32</b><b class='flag-5'>捕获</b>占空比_【话说<b class='flag-5'>定时器</b>系列】之六:<b class='flag-5'>STM32</b><b class='flag-5'>定时器</b><b class='flag-5'>输入</b><b class='flag-5'>捕获</b>话题

    stm32捕获占空比_「话说定时器系列」之六:STM32定时器输入捕获话题

    TIMER 的基本应用原理、常规应用等。现在将课程内容整理为文章,针对STM32定时器有基本了解的用户,分享具体的应用实现环节及常见问题解决。STM32定时器除了基本计数
    发表于 12-27 19:02 8次下载
    <b class='flag-5'>stm32</b><b class='flag-5'>捕获</b>占空比_「话说<b class='flag-5'>定时器</b>系列」之六:<b class='flag-5'>STM32</b><b class='flag-5'>定时器</b><b class='flag-5'>输入</b><b class='flag-5'>捕获</b>话题

    通用定时器输入捕获实验

    STM32输入捕获,简单的说就是通过检测TIMx_CHx(定时器X的通道X)上的边沿信号,在边沿信号发生跳变(上升沿/下降沿)的时候,将定时器
    发表于 01-12 19:53 9次下载
    通用<b class='flag-5'>定时器</b>的<b class='flag-5'>输入</b><b class='flag-5'>捕获</b>实验

    CW32定时器操作讲解——输入捕获

    CW32定时器操作讲解——输入捕获
    的头像 发表于 09-27 16:06 911次阅读
    CW32<b class='flag-5'>定时器</b>操作讲解——<b class='flag-5'>输入</b><b class='flag-5'>捕获</b>