使用定时器外设的输入捕捉功能及测量脉冲宽度

这篇具有很好参考价值的文章主要介绍了使用定时器外设的输入捕捉功能及测量脉冲宽度。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用定时器外设的输入捕捉功能及测量脉冲宽度

Introduction

在汽车电子系统中,经常需要通过编码器反馈机械结构的位置信息,微控制器芯片解析编码器的信号时,会使用到定时器的输入捕获功能测量编码器输出的脉冲宽度。绝大多数带有多通道输入输出的定时器,都设计了输入捕获功能。基本的硬件输入捕获功能只是对外部的触发事件(通道引脚上的上升沿、下降沿)进行响应,将定时器当前的计数值快照到通道的输入数据寄存器中,还需要配合少量软件和硬件中断服务进行计算,才能得到表示脉冲宽度的量化值。

本文以国产云途半导体的YTM32B1ME05微控制器为例,介绍使用硬件定时器eTMR外设的输入捕获功能,实现测量脉冲宽度的方法。特别地,eTMR外设在硬件上还设计了专门测量脉冲宽度的功能,以简化软件处理的过程。

硬件定时器外设输入捕获功能的机制

在《YTM32的增强型定时器eTMR外设模块详解》一文中曾介绍过,硬件定时器功能的核心,是一个在选定时钟源驱动下的计数器。其中,若配置某个定时器的通道为输入捕获模式,软件可预设检测通道引脚上的信号变化边沿触发事件(上升沿、下降沿),当定时器硬件捕获到对应的触发信号时,会自动将定时器计数器当前的计数值写入到该通道对应的输入捕获数据寄存器中,记录该值作为预设触发信号的时间戳。

YTM32B1ME05微控制器芯片中集成的eTMR模块,最多支持8个通道,并且每个通道可以配置成输入捕获模式(设置寄存器eTMR_CHn_CTRL[CHMODE]),并且可以检测通道引脚上的单独的上升沿、单独的下降沿或是任一边沿(设置寄存器eTMR_CHn_CTRL[CAPEDGE]),每个通道设计有专门的eTMR_CHn_CVAL寄存器,专用于存放最近一次捕获到的触发事件的时间戳。

图x中描述的信号时序,解释了eTMR通道的输入捕获模式的工作机制。其中:

  • clock是驱动计数器的时钟源信号,counter对每个时钟源的脉冲进行计数。
  • valid input是通道引脚上的电平信号。
  • positive edge flagnegative edge flag分别为eTMR检测到valid input信号上的上升沿和下降沿的事件标志。注意,这两个标志存在于芯片电路系统的内部,使用脉冲的方式传递信号。

使用定时器外设的输入捕捉功能及测量脉冲宽度,YTM32,单片机,嵌入式硬件,汽车电子,YTM32

图x 输入捕获的时序图
  • 若使用单独检测上升沿,产生positive edge flag信号时(上升沿),当前counter的值CNT0被载入到CHXCVAL寄存器中,保持,直到下一个上升沿到来。在下降沿时不做更新。
  • 若使用单独检测下降沿,产生negative edge flag信号时(下降沿),当前counter的值CNT1被载入到CHXCVAL寄存器中,保持,直到下一个下降沿到来。在上升沿时不做更新。
  • 若使用检测双边沿,产生positive edge flagnegative edge flag任一信号时,当前counter的值都会被载入到CHXCVAL寄存器中。

使用两个通道(引脚)的单边沿触发输入捕获

测量脉冲的宽度,具体就是分别捕获脉冲方波的上升沿和下降沿的时刻(若是测量负脉冲则先捕获下降沿再捕获上升沿),然后使用后一个时刻减去前一个时刻,即可得到脉冲的时间长度。这里面还有个情况需要考虑,输入捕获记录的一个周而复始的计数器,在未能限定输入脉冲宽度的最大范围的场景下,第二次捕获的时刻可能会出现在后续的计数“轮回”中,因此还需计入脉冲宽度中计数器绕圈的次数。

这里有计算公式如下:

脉冲宽度 = 计数器周期的时间长度 * 计数器周期的次数(从捕获第一边沿开始至捕获第二边沿结束中间)
        + 捕获第二边沿的时刻 - 捕获第一边沿的时刻

通常,定时器输入捕获通道都只设计了一个输入捕获数据寄存器,但软件可以配置在捕获上升沿或者下降沿的时刻。此时,若要测量脉冲宽度,可以在芯片外面(PCB板电路)将两个输入捕获的通道连在一起接入即将捕获的信号,然后分别配置两个输入捕获的通道事件,一个是上升沿,一个是下降沿。因为两个引脚的信号方向都是输入,不会相互影响。还要记得启用计数器溢出中断,并在中断程序中设计一个软件计数器,记录测量脉冲宽度中可能包含的溢出周期的个数pulse_width_period_count。若正脉冲到来:

  • 预先配置捕获上升沿信号的通道硬件将自动先记录第一个边沿的时刻,存入通道输入捕获数据寄存器eTMR_CH0_CVAL,同时触发本通道的中断,在服务程序中,将pulse_width_period_count计数器清零。
  • 如果脉冲宽度很长,计数器的溢出中断会持续到来,在对应的中断服务程序中,pulse_width_period_count计数器将被累加。这里还可以加入超时判断,即软件设计判定,若pulse_width_period_count计数器的值被递增至某个预设值时,即可为判定脉宽过长,然后向应用逻辑反馈。
  • 预先配置捕获下降沿信号的通道硬件再记录第二个边沿的时刻,存入通道输入捕获数据寄存器eTMR_CH1_CVAL,同时触发本通道的中断,在服务程序中,将使用上述计算公式计算测量的脉冲宽度,然后向应用逻辑反馈。

分析测量脉冲宽度的实现过程可知,程序运行过程对中断服务有比较多的依赖,测量一路脉冲宽度信号,需要配合三个中断服务程序。下文中可以看到,eTMR外设模块针对这种应用场景,专门设计了测量脉宽的功能,可以使用硬件自动记录有效的pulse_width_period_count计数器,并自行完成计算脉冲宽度的过程。

细心的读者可能会顾虑,若测量一路脉冲宽度时,使用了公共的定时器溢出中断的资源,是不是别的测量通路就不能它来参与额外的脉宽测量了呢?实际上,这里可以通过软件实现多路共用同一个时基,即为多个测量脉冲宽度的通道各自设计一个pulse_width_period_count计数器,在计数器溢出中断服务程序中将这些脉宽可能包含的溢出周期数都递增。

void eTMR0_IRQHandler(void)
{
    ...
    for (uint32_t i = 0u; i < PULSE_WIDTH_NUM; i++)
    {
        pulse_width_period_count[i]++;
        if (pulse_width_period_count > PULSE_WIDTH_TIMEOUT_PERIOD_COUNT)
        {
            pulse_width_period_timeout_flag = true; /* timeout event. */
        }
    }
}

void eTMR_CH0_IRQHandler(void)
{
    ...
    pulse_width_period_count[0] = 0u; /* clear the period counter. */
}

void eTMR_CH1_IRQHandler(void)
{
    /* calc the pulse width between the ch0 and ch1. */
    pulse_width[0] = eTMR0->MOD * pulse_width_period_count[0] + eTMR0->CH[1].CVAL - eTMR0->CH[0].VAL;
}

使用单通道(引脚)的双边沿触发输入捕获

定时器通道的输入捕获事件,可以是仅上升沿、仅下降沿,或者是上升沿或下降沿的任一事件。既然是捕获一对边沿事件,一些开发者就想把这个上升沿或下降沿的任一事件利用起来,这样还能减少在芯片外面将两个引脚连在一起的奇怪设计。。。中间的计算过程同上文相同,这里就不再赘述了。但要特别提示的是,如果使用这个二者均可的触发模式,就需要硬件额外提供判定当前捕获的边沿是上升沿还是下降沿的机制,几种可能的实现方式,这里做一些推演。

利用通道的IO电平判定跳变沿方向

当跳变沿到来(此时软件还不知道上升沿还是下降沿)时,在中断服务程序中,软件通过硬件提供的可用机制读输入通道的电平信号,若为高电平,则判定为上升沿,若为低电平,则判定为下降沿。例如,eTMR外设使用eTMR_STS寄存器中的对应字段记录跳变沿事件到来时,同时还会在eTMR_IOSTS寄存器中记录对应通道的电平状态,因此可用来判定边沿的方向。

void eTMR_CH0_IRQHandler(void)
{
    ...
    if (eTMR0->STS & eTMR_STS_CH0F_MASK)
    {
        if (0u == (eTMR0->IOSTS | eTMR_IOSTS_CH0IO_MASK) )
        {
            /* falling edge. */
        }
        else
        {
            /* rising edge. */
        }
    }
    ...
}

如果定时器外设模块没有这种硬件机制,就得靠软件临时切换引脚的复用功能成GPIO的输入功能,利用GPIO外设模块读电平。记得读完电平后,还得将引脚的复用功能切换回定时器功能,否则就抓不到下个跳变沿了。

如果担心中间软件执行指令比较慢,那就外接一个专门的引脚配置成GPIO输入功能,不用动态切换引脚复用功能,专门用于测量脉冲信号的瞬时电平。但这就又变成两个引脚的方案的,只是不要求另一个引脚具有输入捕获的功能,可以使用宝贵的带输入捕获功能的引脚测量更多路脉冲信号。

动态按需切换捕获不同的边沿实现状态机

如果定时器硬件能接受运行时改工作模式(重新写入寄存器),也可以有针对性地在特定时间段捕获特定边沿,相当于基于软件实现了一个检测信号模式的状态机,那么这个状态机中的各个状态将由软件接管,不再依赖于硬件已有的实现。例如,若要测量正脉冲,则先配置捕获通道的事件为仅上升沿,当上升沿信号到来之时,软件在通道的中断服务中,使用软件变量暂存当前捕获时刻的计数值后,再重新配置本通道捕获的通道事件为仅下降沿。之后,下降沿到来时,就可以使用之前缓存的前一个捕获的计数值配合当前的捕获值计算脉宽。

eTMR外设为计数器数据相关的寄存器设计了“影子寄存器”,需要特定的同步机制才能更改,但通道的配置寄存器eTMR_CHn_CTRL不在其中,可以支持这种用法。

etmr_ch_input_edge_dir_t etmr_ch0_dir = eTRM_CH_INPUT_EDGE_FALLING_EDGE;
void eTMR0_CH0_IRQHandler(void)
{
    ...
    eTMR0->CH[0].CTRL &= ~eTMR_CH_CTRL_CAPEDGE_MASK;
    switch (etmr_ch0_dir)
    {
        case eTRM_CH_INPUT_EDGE_FALLING_EDGE:
            /* falling edge event. */
            eTMR0->CH[0].CTRL |= eTMR_CH_CTRL_CAPEDGE(1); /* next is rising edge. */
            break;
        case eTRM_CH_INPUT_EDGE_RISING_EDGE:
            /* rising edge event. */
            eTMR0->CH[0].CTRL |= eTMR_CH_CTRL_CAPEDGE(2); /* next is falling edge. */
            break;
        default:
            break;
    }
}

使用硬件专门设计的测量脉宽功能

针对汽车电子系统中,MCU在一些关键阶段对计算实时性要求比较高,多个中断的协同配合对CPU的相应时序要求比较高。为了降低多线程相互配合完成计算的风险,YTM32集成在车规MCU的eTMR定时器模块,专门在芯片硬件上完全实现了测量脉冲的全部操作过程,不全程不需要软件介入,只需要在对应的通道中断服务程序中从硬件寄存器中读取自动计算的结果即可。

RM手册中提供给开发者的说明并不多,只是简单介绍了寄存器接口。本节可以作为手册的补充,扩展说明芯片内部的工作过程,便于读者理解芯片手册,使用合适的方式集成到自己的软件中。

RM手册中的eTMR外设寄存器清单中,列出了每个通道为测量脉冲宽度设计的4个寄存器,CH_PPCNTNCH_PPCNTVCH_NPCNTNCH_NPCNTV,如图x所示。

使用定时器外设的输入捕捉功能及测量脉冲宽度,YTM32,单片机,嵌入式硬件,汽车电子,YTM32

图x eTMR硬件测量脉宽的寄存器

这里先声明,所谓的正脉冲(Positive Pulse),是指由上升沿开始、下降沿结束形成的方波信号,对应地,负脉冲(Negative Pulse),是指由下降沿开始、上升沿结束形成的方波信号。如图x所示。

使用定时器外设的输入捕捉功能及测量脉冲宽度,YTM32,单片机,嵌入式硬件,汽车电子,YTM32

图x 正脉冲和负脉冲

eTMR硬件为每个通道可能出现的正脉冲和负脉冲都各自配备了一组内部的寄存器。以测量正脉冲为例,在上升沿捕获到的数值记录在专属的buf0寄存器中,下降沿捕获到的数值记录在buf1寄存器中,用eTMR_CH_PPCNTN寄存器对脉宽内部可能包含的定时器溢出周期进行计数。当下降沿(结束边沿)到来之时,硬件自动将buf1减去buf0的值,存入eTMR_CH_PPCNTV寄存器中。如果最初的结果是负数,则硬件也会自动从eTMR_CH_PPCNTN寄存器中借1位(数值也减1回存),确保存入eTMR_CH_PPCNTV寄存器中的有效值是正数。类似地,eTMR_CH_NPCNTNeTMR_CH_NPCNTV对应的是负脉冲测量数值。

eTMR_STS寄存器中,也专门为有效的脉冲捕获事件设计的标志位。如图x所示。

使用定时器外设的输入捕捉功能及测量脉冲宽度,YTM32,单片机,嵌入式硬件,汽车电子,YTM32

图x eTMR_STS寄存器中设计的脉冲事件标志位

当前版本的eTMR并没有对应地专门为脉宽检测设计专门的中断事件,但可以借用边沿事件的中断,例如,使用输入捕获下降沿的中断服务程序读eTMR_CH_PPCNTNeTMR_CH_PPCNTV寄存器并完成计算。

RM手册中提供了第一张关于输入捕获脉冲的时序图,如图x所示。这里也作一个补充说明,详细解释其中时序的含义。

使用定时器外设的输入捕捉功能及测量脉冲宽度,YTM32,单片机,嵌入式硬件,汽车电子,YTM32

图x eTMR的脉宽调试功能
  • clock是计数器计数的时基。
  • valid data是引脚上实际的电平信号。
  • counter是计数器当前的计数值。
  • CNT0时,valid data信号线上产生上升沿,对应positive edge flag产生一个触发信号。
  • CNT1时,valid data信号线上产生下降沿,对应nagative edge flag产生一个触发信号。同时,之前在CNT0产生的上升沿和当前产生的下降沿组合成一个正脉冲,对应positive pulse flag信号线上产生一个触发信号,PPCNTVPPCVTN寄存器也被硬件写入了经过基本处理的数值,可用于计算正脉冲的宽度。
  • CNT2时,valid data信号线上产生上升沿,对应positive edge flag产生一个触发信号。同时,之前在CNT1产生的下降沿和当前产生的上升沿组合成一个负脉冲,对应negative pulse flag信号线上产生一个触发信号,NPCNTVNPCNTN寄存器也被硬件写入了经过基本处理的数值,可用于计算负脉冲的宽度。

Conclusion

一些微控制器的多通道带有IO引脚的定时器具有输入捕获功能,可以通过记录通道引脚出现跳变沿的时刻,用以计算两个相反边沿组成的脉冲的宽度。除了需要配合定时器溢出中断对溢出周期计数之外,本文梳理了常用的实现测量包含两个边沿的脉冲的方法:

  • 使用两个输入捕获通道分别捕获两个边沿
  • 使用一个输入捕获通道配合一个IO信号/引脚
  • 使用一个输入捕获通道,配合软件控制电路实现的状态机

还特别介绍了YTM32的eTMR定时器中基于硬件实现的脉宽测量方法,实际上是将典型测量方法由硬件逻辑自动实现,开发者在使用这个功能时,需要了解其中的工作机制,以便于以合适的方式整合到具体的应用逻辑中。文章来源地址https://www.toymoban.com/news/detail-824961.html

到了这里,关于使用定时器外设的输入捕捉功能及测量脉冲宽度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于HAL库的STM32的单定时器的多路输入捕获测量脉冲频率(外部时钟实现)

    目录 写在前面 一般的做法(定时器单通道输入捕获) 以外部时钟的方式(高低频都适用) 测试效果 STM32的定时器本身有输入捕获的功能。可选择双端捕获,上升沿捕获或者是下降沿捕获。对应捕获频率来说,连续捕获上升沿或下降沿的时间间隔就是其脉冲的周期. 定时器设置频率

    2024年02月08日
    浏览(49)
  • 利用MSP430F5529定时器捕获功能,实现信号周期或频率的测量

    // 这个程序利用TIMER A0生成1KHz的方波,从引脚P1.3输出,送到引脚P7.4,  // 再利用TIMER B0测量周期。为测试方便,引脚P1.0输出32KHz的ACLK, // 引脚P2.2输出12MHz的SMCLK. //  ACLK = LFXT1 = 32kHz; SMCLK = MCLK = 12MHz // //                 MSP430F5529 //             ------------------------- //      

    2024年02月16日
    浏览(42)
  • STM32学习笔记(六)丨TIM定时器及其应用(输入捕获丨测量PWM波形的频率和占空比)

    ​  本次课程采用单片机型号为STM32F103C8T6。 ​  课程链接:江科大自化协 STM32入门教程   往期笔记链接:   STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出   STM32学习笔记(二)丨STM32程序调试丨OLED的使用   STM32学习笔记(三)丨中断系统丨EXTI外部中断

    2023年04月19日
    浏览(56)
  • 基于HAL库的STM32单定时器多路输入捕获测量PWM的频率和占空比实现(状态机方式实现)

    目录  写在前面 先回顾下定时器的单路捕获PWM 多路捕获PWM的频率和占空比(状态机实现) 我的思路: 状态图 配置 给出示例代码 测试效果         先有了这篇文章实现了单定时器的多通道测量频率,以外部时钟的方式可测量任意频率的方波),奈何不能多路测试PWM波的频率,

    2024年02月12日
    浏览(51)
  • STM32 通过PWM输出一个方波并通过定时器输入捕获模式测量方波的周期(cubeMX+keil配置)

    前言:本文章用cubeMX和keil来进行代码编写,实现STM32的相应功能 本文章使用的STM32核心板是STM32H743VIT6,如果使用的是其他的核心板操作过程类似,可以尝试使用此教程。 (1)首先点击左侧的Timers  (2)选择一个定时器配置PWM 我选择的是TIM5,如上图 点击TIM5 Mode的配置如下

    2024年02月19日
    浏览(55)
  • 【STM32学习】——定时器输入捕获(IC)&PWMI模式&频率测量方法&主从触发模式&IC模式测频&/PWMI模式测频率及占空比

    声明:学习笔记根据b站江科大自化协stm32入门教程编辑,仅供学习交流使用! 注意:读完大约需要15分钟,但会收获满满!! 输入捕获部分一共两个实操案例程序: 输入捕获模式测频率、PWMI模式测频率和占空比。 测频法利用之前的外设就可实现,如对射式红外传

    2024年02月16日
    浏览(47)
  • 6.13 信号机制(信号概念、发送、定时器、信号捕捉、SIGCHLD)

    目录 信号机制 信号的产生 常用信号1 常用信号2 信号相关命令kill/killall 信号发送-kill/raise 信号相关函数- alarm/pause 信号函数alarm/pause-示例 设置信号响应方式-signal 信号函数signal-示例 子进程结束信号 笔记 信号机制 信号是在软件层次上对中断机制的一种模拟,是一种异步通信

    2024年02月09日
    浏览(41)
  • # HAL库STM32常用外设教程(四)—— 定时器 基本定时

    1、STM32F407ZGT6 2、STM32CubeMx软件 3、keil5 内容简述: 通篇文章将涉及以下内容,如有错误,欢迎指出 : 1、基础定时器特性 2、基础定时器的结构和功能 3、基础定时器HAL库驱动程序 (1)CubeMx配置 (2)TIM驱动程序   STM32F407有2个高级控制定时器(TIM1、TIM8)、8个通用定时器和

    2024年02月02日
    浏览(68)
  • stm32之16.外设定时器——TIM3

       ----------- 源码 其他外设定时器使用方法 打开对应时钟供电  

    2024年02月10日
    浏览(54)
  • # HAL库STM32常用外设教程(四)—— 基础定时器

    1、STM32F407ZGT6 2、STM32CubeMx软件 3、keil5 内容简述: 通篇文章将涉及以下内容,如有错误,欢迎指出 : 1、基础定时器特性 2、基础定时器的结构和功能 3、基础定时器HAL库驱动程序 (1)CubeMx配置 (2)TIM驱动程序   STM32F407有2个高级控制定时器(TIM1、TIM8)、8个通用定时器和

    2024年02月04日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包