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

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

3天内不再提示

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

茶话MCU 来源:ST MCU 信息交流 作者:ST MCU 信息交流 2021-01-02 18:17 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

我们知道,利用单片机定时器捕获功能测量脉冲信号宽度及占空比是种很常见的做法。这里以STM32的定时器为例来介绍基于其捕获功能实现对脉宽的测量的思路及过程。

一般来讲,使用STM32定时器的捕获功能来实现脉宽测量,我们可以选用一个通道、也可以使用两个通道。使用1个通道时,只需使用定时器基本的输入捕获功能结合中断或DMA即可实现;若使用两个通道时可以将捕获功能与定时器的从模式来相结合完成。这里就两种方案的实现示例都做个简单介绍。

不妨先介绍基于单个通道的输入捕获功能来实现对1路信号脉冲宽度及占空比的测量,并在测量过程中统计用于测量的定时器自身的溢出事件,以保障即使被测信号脉宽长于测量定时器自身的溢出周期时也能有效测量。

这里选用STM32F411 Nucleo 开发板 ,集成开发环境选用了ARM MDK IDE。

一、实现思路及步骤

1.1、使用STM32F411Nucleo板的板载芯片内的TIM3的通道1产生一个周期为5s,占空比为40%的PWM输出信号,然后将该信号连线到TIM4的定时器输入通道2,通过它对来自于TIM3的PWM输出信号进行脉宽及占空比的测量。

测量过程中,TIM4的通道2对外来信号的捕捉过程是这样的,TIM4的通道2对外来信号的一个完整周期实现 3次捕捉。每次捕捉事件时计数器的值会被装入CCR寄存器

d8930054-445e-11eb-8b86-12bb97331649.png

在初始状态0基于上升沿发起第一次捕捉,记录下第1次的捕捉值【Capture_1st】,并对TIM4定时器溢出事件计数器清零,同时将捕获极性切换为下沿捕捉。之后进入状态1,等待后续的下沿捕获。当发生下沿捕获时,记下第2次的捕捉值【Capture_2nd】,并将前面这段时间的定时器溢出次数也记录下来【Front_Num_OvEvent】,再次将极性切换为上沿捕捉,进入状态2,等待第3次捕获。在状态2的情况下,当发生上沿捕获时,记录下第3次的捕捉值【Capture_3rd】,并将整个测试周期内发生的定时器溢出次数记录下来【Total_Num_OvEvent】,然后进入状态3进行占空比【Signal_Duty】和脉宽【Signal_Cycle】的计算。完毕后回到初始状态,准备下次的测量。

另外,在TIM4的更新中断里对非初始状态的溢出事件累加统计,放在变量【Num_OvEvent】里。

示例代码里用到变量Measure_State来记录和表示当前测试状态。

d8f03f94-445e-11eb-8b86-12bb97331649.png

1.2 、测量用到的算式

根据上面的介绍,一次完整的测量下来,测得的周期和占空比可以用下面算式求得。

【下面算式貌似复杂,只需把上面测试原理和那几个数据理清自然就会计算】

d92e33da-445e-11eb-8b86-12bb97331649.png

1.3 、基本配置准备

1.3.1、 实现TIM3 通道1【PA6】PWM输出,计数周期5s,占空比40%,用做被测信号。

A、选择定时器内部时钟作为时钟源,STM32F411芯片定时器内部时钟为100Mhz;

B、设置分频比,选择计数模式、设置计数脉冲个数;

对时钟源20000分频,PSC=20000-1;选择向上计数模式up counting;

计数器基于分频后的脉冲每计数设置为25000个后,发生溢出并产生更新事件及中断。则:ARR=25000-1

按照上面参数来设计,定时器的定时周期或者说溢出周期就是5s.

C、它需做PWM输出,这里选择PWM 模式1,占空比为40%,

则CCR=(ARR+1)*0.40 =10,000

使用STM32CubeMx图形化工具进行配置:

d9508fac-445e-11eb-8b86-12bb97331649.png

d9850bd8-445e-11eb-8b86-12bb97331649.png

1.3.2、实现TIM4通道2的输入捕获,假定TIM4的溢出周期为20ms.

A、选择定时器内部时钟为时钟源,32F411定时器内部时钟为100Mhz;

B、设置分频比,选择计数模式、设置计数脉冲个数;

先对时钟源100分频、即PSC=100-1;选择向上计数模式up counting;

计数器基于分频后的脉冲每计数20000个,发生溢出并产生更新事件及中断。

则:ARR=20000-1

按照上面参数来设计,定时计数周期或者说溢出周期就是20ms.

另外,通道2配置为输入捕捉,初始捕捉极性位选择上升沿。

d9d265ea-445e-11eb-8b86-12bb97331649.png

da1102f0-445e-11eb-8b86-12bb97331649.png

1.4 、工程代码的生成、添加和整理

通过STM32CUBEMX依据上述参数完成配置,并开启TIM4的中断使能,然后生成工程。再在工程里添加应用户代码。

......

Measure_State= 0x00; //测试初始态

Num_OvEvent= 0x00;//TIM4溢出次数初始值

da6b6646-445e-11eb-8b86-12bb97331649.png

部分处理代码的简要说明:

在TIM4通道2的捕获中断里做3次捕捉值的获取以及计算,在TIM4更新中断里对溢出事件进行统计。

daa65cec-445e-11eb-8b86-12bb97331649.png

daea4614-445e-11eb-8b86-12bb97331649.png

db34f9de-445e-11eb-8b86-12bb97331649.png

db7ecc12-445e-11eb-8b86-12bb97331649.png

二、本次示例的结果验证

实验中tim4的时基参数保持不变,可通过调整TIM3的PWM输出的脉宽和占空比,来看看实验结果。下面有一个视频剪辑,就是上面工程验证结果的部分内容,有兴趣可以观看。

上面简单介绍了基于单通道的定时器捕获实现对脉宽及占空比测量的过程,现在继续介绍使用双通道,基于定时器PWM输入模式测量脉宽及占空比。同样,在测量过程中也统计用于测量的定时器自身的溢出事件。所用开发板和开发环境跟上面一致。

dba5b6c4-445e-11eb-8b86-12bb97331649.png

三、实现原理、思路及步骤

3.1、同样,利用板载芯片内的TIM3的通道1产生一个周期为5s,占空比为40%的PWM输出信号,然后将该信号连线到TIM4的定时器通道2【TI2】,作为其直接输入。基于PWM输入模式对来自于TIM3的PWM输出信号进行脉宽及占空比的测量。

这里先简单介绍下PWM输入模式工作原理

*它是基于输入捕获与定时器从模式相结合的一个具体应用。

*同一外部输入引脚【仅限于定时器的TI1/TI2】的输入滤波信号【TIxFPx】映射到内部2个捕捉通道【仅限于IC1/IC2】,且配置为相反的捕捉极性,即一个通道捕捉上沿,另一通道捕捉下沿。

*用于测量的定时器配置在复位从模式,外部输入信号的滤波信号TIxFPx作为定时器的触发信号,令定时器复位。

*经过两次连续的捕捉结合定时器的溢出事件统计可方便地测得信号的周期及占空比。

dbd637a4-445e-11eb-8b86-12bb97331649.png

具体到这里,触发信号来自待测信号,即TIM3的PWM输出,与TIM4的TI2相连,经过边沿检测和滤波后的TI2FP2做为IC2的输入信号的同时担当TIM4的触发输入信号,其触发极性可以软件配置,此处配置为上沿触发。当TIM4收到触发信号时,定时器的计数器会被复位更新。当计数器配置为UP计数模式时,计数器会被清零并重新开始计数。

3.2、大致测量过程是这样的:TIM4配置在复位从模式。待测信号从TI2输入。

dc02f3ac-445e-11eb-8b86-12bb97331649.png

当从通道2出现信号的上升沿时,TIM4计数器被复位清零,同时产生更新事件和触发事件,相关标志位会被硬件置1.

dc623132-445e-11eb-8b86-12bb97331649.png

在初始状态下,将定时器从模式触发沿配置为上沿触发,捕捉通道1配置下沿捕捉,捕捉通道2配置为上沿捕捉。初始状态下,待测信号的上升沿使得TIM4的计数器被复位清零,并进入测量状态1,并开启定时器的溢出事件实时统计,代码里用到的变量是Num_OvEvent。当发生通道1的下沿捕捉时,记录下第1次的捕捉值【Vaule_1stCap】,并记录下自复位以来到下沿捕捉这段事件的溢出次数,放在变量Front_Num_OvEvent里。然后进入状态2。在状态2的情况下当发生通道2的上沿捕获时,记录下第2次的捕捉值【Vaule_2ndCap】,并将整个测试周期内定时器溢出次数记录在【Total_Num_OvEvent】,然后进入状态3进行占空比【Signal_Duty】和脉宽【Signal_Cycle】的计算。完毕后回到初始状态,准备下次的测量。

另外,在TIM4的更新中断里对非初始状态的溢出事件累加统计,放在变量【Num_OvEvent】里。

示例代码里用到一个变量Measure_State来记录和表示当前测试状态,大致流程如下。

dd1e0c86-445e-11eb-8b86-12bb97331649.png

整个测量过程中,我们使用触发脉冲产生的触发事件作为每次开启测量的起始。

3.3、 测量用到的算式

根据上面的介绍,1次完整的测量下来,测得的周期和占空比可以用下面算式求得:

dd6159f0-445e-11eb-8b86-12bb97331649.png

dbd637a4-445e-11eb-8b86-12bb97331649.png

3.4、基本配置准备

3.4.1 、实现TIM3 通道1的PWM输出,计数周期5s,占空比40%,用做被测信号。

A、选择定时器内部时钟作为时钟源,STM32F411芯片定时器内部时钟为100Mhz;

B、设置分频比,选择计数模式、设置计数脉冲个数;

对时钟源20000分频,PSC=20000-1;选择向上计数模式up counting;

计数器基于分频后的脉冲每计数25000个后,发生溢出并产生更新事件及中断。则:ARR=25000-1

按照上面参数来设计,定时器的定时周期或者说溢出周期就是5s.

C、它需做PWM输出,这里选择PWM 模式1,占空比为40%,

则CCR=(ARR+1)*0.40 =10,000

CubeMx图形化配置界面:

d9508fac-445e-11eb-8b86-12bb97331649.png

d9850bd8-445e-11eb-8b86-12bb97331649.png

3.4.2、 实现TIM4通道2做PWM模式输入测量,假定tim4计数器溢出周期为20ms。

先做时基参数的配置:

1、选择定时器内部时钟为时钟源,32F411定时器内部时钟为100Mhz;

2、设置分频比,选择计数模式、设置计数脉冲个数;

先对时钟源100分频、即PSC=100-1; 选择向上计数模式up counting;

计数器基于分频后的脉冲每计数20000个,发生溢出并产生更新事件及中断。则:ARR=20000-1。注意:TIM4工作在复位从模式。

按照上面参数来设计,定时计数周期或者说溢出周期就是20ms.

de371342-445e-11eb-8b86-12bb97331649.png

再看看定时器TIM4的捕获配置:

TIM4输入捕捉通道2配置为直接输入捕捉,捕捉极性选择上升沿。

TIM4输入捕捉通道1配置为间接输入捕捉,捕捉极性选择为下降沿。

de5f87aa-445e-11eb-8b86-12bb97331649.png

de99ba7e-445e-11eb-8b86-12bb97331649.png

3.5、工程代码的生成、添加和整理

通过STM32CUBEMX依据上述参数完成配置,并开启TIM4的中断使能,然后生成工程。再在工程里添加应用户代码。【只列出部分直接有关的】

dec7adda-445e-11eb-8b86-12bb97331649.png

部分处理代码简要说明:

发生触发事件时,进入测量状态:

deefa81c-445e-11eb-8b86-12bb97331649.png

在TIM4通道1发生下沿捕捉事件时,将前面时间段的溢出次数记录下来并切换测量状态。

df19f9d2-445e-11eb-8b86-12bb97331649.png

在TIM4通道2发生上沿捕捉事件时,将整个测量周期发生的溢出次数记录下来,并转入计算处理状态。

df662910-445e-11eb-8b86-12bb97331649.png

另外,在测量状态下,基于TIM4的更新中断对溢出次数进行统计。

df8d99a0-445e-11eb-8b86-12bb97331649.png

四、实验结果验证

同样,我们保持实验中tim4的时基参数保持不变,通过调整TIM3的PWM输出波形的脉宽和占空比,来看看实验结果。

五、小结

上面介绍了两种测量信号脉宽及占空比的方案,都用了捕获中断和更新中断。其中,在第2种方案中用触发事件作为每次测量的起始,这算是个关键点。顺便说下,我们在利用定时器测量脉宽涉及到更新事件次数统计时,比较容易出现多统计一次的问题。因为定时器初始化完成后会软件产生一次更新事件,所以建议在启动定时器更新中断前对该标志位做个清零操作。不过,在我上面两个方案的示例代码的初始化阶段,这个操作倒是可有可无,因为我的代码里对更新事件计数还要结合状态机,并非一有更新中断就累加。

上面提到的实现思路及代码仅供参考,旨在抛砖引玉。当你对原理把握得越清晰时,应用就越灵活。最后,就上面提到的两种测量方案基于个人的理解做个简单比较。

dfb7b3ac-445e-11eb-8b86-12bb97331649.png

【注:2个通道并不意味着需要2个物理管脚,其实1个脚就够了。另外基于定时器捕获功能配合DMA,解码方面也能有很好的发挥。】

原文标题:基于定时器捕获测量脉宽的应用示例

文章出处:【微信公众号:ST MCU 信息交流】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6074

    文章

    45334

    浏览量

    663302
  • STM32
    +关注

    关注

    2305

    文章

    11120

    浏览量

    371052
  • 定时器
    +关注

    关注

    23

    文章

    3360

    浏览量

    121705

原文标题:基于定时器捕获测量脉宽的应用示例

文章出处:【微信号:stmcu832,微信公众号:茶话MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    CW32A030微控制定时器

    16bit 自动重装载计数 并由一个可编程预分频驱动。GTIM 支持定时器模式、计数模式、触发启动模式和门控模式4 种基本 工作模式,每组带4 路独立的
    发表于 12-04 06:47

    CW32L010+定时器介绍

    。PWM信号广泛应用于电机控制、LED调光等领域。 频率测量定时器还可以用于频率测量,将未知频率的信号作为输入,通过测量计数器的计数次数来计算输入信号的频率。
    发表于 12-01 07:53

    CW32定时器及中断介绍

    装载计数并由一个可编程预分频驱动。GTIM 支持定时器模式、计数模式、触发启动模式和门控模式 4 种基本工作模式,每组带4 路独立的捕获
    发表于 12-01 07:08

    cs32a010定时器的问题

    按照例程写了定时器的初始化,还是无法进入中断 比较奇怪我使用定时器为什么要用输入捕获? 还有周期是否该设为x-1?
    发表于 11-06 10:49

    SysTick系统滴答定时器简介

    SysTick—系统定时器是属于CM33内核中的一个外设,内嵌在NVIC中。系统定时器是一个24bit的向下递减的计数,计数每计数一次的时间为 1/SYSCLK,一般我们设置系统时
    的头像 发表于 09-23 09:50 1316次阅读
    SysTick系统滴答<b class='flag-5'>定时器</b>简介

    定时器输入捕获模式

    AT32F4xx定时器输入捕获模式 支持型号: AT32F 系列 主要使用外设: TIMER、 USART 获取示例 1 快速使用方法 1.1 硬件资源 AT-START-F403A V1.0
    发表于 09-22 09:58

    基于 AS32X601 微控制定时器模块(TIM)技术研究与应用实践

    阐述了高级定时器和通用定时器的计数精度、预分频可编程性,以及输入捕获、输出比较、PWM生成等关键功能,并结合数据手册补充了大量技术细节,
    的头像 发表于 08-19 16:44 593次阅读

    见微知著:ZUS系列示波器如何智能捕获特殊值?

    本文导读ZUS系列示波器凭借智能搜索功能和大数据分析能力,成功解决振荡型脉冲簇信号中特殊值的精准捕获难题。本文详解ZUS5054Pro在光电应用中的技术实现方案,展示如何在5ms内快速定位100
    的头像 发表于 07-07 11:36 508次阅读
    见微知著:ZUS系列示波器如何智能<b class='flag-5'>捕获</b>特殊<b class='flag-5'>脉</b><b class='flag-5'>宽</b>值?

    使用STM32捕获PWM时同时捕获2个通道时会出现捕获的频率值不准确,是什么原因导致的?

    在使用STM32F103芯片的2个定时器捕获2路PWM波时,当2路信号同时输入时,会出现捕获的频率不准确,但是分开一路一路的输入捕获时,
    发表于 05-14 06:24

    MCU定时器/计数

    架构与功能特性‌ 定时器类型与配置‌ 高级控制定时器‌:支持互补PWM输出与刹车功能,适用于电机驱动等高精度控制场景。通用定时器‌:集成输入捕获、输出比较、单脉冲模式等基础功能‌。 系
    的头像 发表于 04-27 13:54 585次阅读

    使用STM32捕获PWM时同时捕获2个通道时会出现捕获的频率值不准确是什么原因导致的?

    在使用STM32F103芯片的2个定时器捕获2路PWM波时,当2路信号同时输入时,会出现捕获的频率不准确,但是分开一路一路的输入捕获时,
    发表于 04-27 08:39

    使用STM32捕获PWM时同时捕获2个通道时会出现捕获的频率值不准确的问题,是什么原因导致的?

    在使用STM32F103芯片的2个定时器捕获2路PWM波时,当2路信号同时输入时,会出现捕获的频率不准确,但是分开一路一路的输入捕获时,
    发表于 04-25 08:29

    使用STM32捕获PWM时同时捕获2个通道时会出现捕获的频率值不准,为什么?

    在使用STM32F103芯片的2个定时器捕获2路PWM波时,当2路信号同时输入时,会出现捕获的频率不准确,但是分开一路一路的输入捕获时,
    发表于 04-22 10:43

    STM32H723使用DMA方式实现定时器输入捕获只能执行一次吗?

    目的:我们希望在 STM32H723 平台上以 DMA 模式实现定时器输入捕获,而不中断当前问题:使用 Cube MX 配置相关参数,只使用 TIM4 的 CH2 作为输入采集直接模式,Slave
    发表于 03-12 08:21

    定时器是不是有编码输入功能?

    你好,我想请教一下定时器是不是有编码输入功能,是高级定时器和通用定时器都有吗,还是不一定,具体要看手册,能帮我看一下STM32G473有几
    发表于 03-11 07:07