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

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

    关注

    5992

    文章

    43911

    浏览量

    619664
  • STM32
    +关注

    关注

    2232

    文章

    10650

    浏览量

    347888
  • 定时器
    +关注

    关注

    23

    文章

    3128

    浏览量

    111904

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

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

收藏 人收藏

    评论

    相关推荐

    TCPWM输入捕获数据异常的原因?

    您好,最近尝试使用TCPWM实现捕获的时候遇到了奇怪的问题,我将通道配置成了捕获模式,并且配置CC0为上升沿捕获,CC1为下降沿
    发表于 01-18 07:42

    PWM和定时器测量精度

    您好!请问PWM和定时器测量精度是多少?
    发表于 11-02 22:51

    AT32F4xx定时器输入捕获模式

    AT32F4xx定时器输入捕获模式展示如何使用AT32F4xx系列的定时器输入捕获功能。
    发表于 10-27 08:25

    STM32速成笔记(6)—定时器

    关于什么是定时器,简单来讲,就是是用来定时的。STM32F103ZET6有两个基本定时器TIM6和TIM7,四个通用定时器TIM2~TIM5
    的头像 发表于 10-24 09:41 1408次阅读
    <b class='flag-5'>STM32</b>速成笔记(6)—<b class='flag-5'>定时器</b>

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

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

    STM32各类系列定时器概览

    本文档:概述了 STM32F1xx、STM32F2xx、STM32F4xx、STM32L1xx 和 STM32F30/31/37/38x微控
    发表于 08-31 10:49 0次下载

    STM32 TIM—基本定时器

    STM32F4xx系列控制器有共有14个TIM定时器。其中2个高级控制定时器TIM1和TIM8、10 个通用定时器TIM2TIM5和TIM9TIM14、 2个基本
    的头像 发表于 07-22 17:05 3087次阅读
    <b class='flag-5'>STM32</b> TIM—基本<b class='flag-5'>定时器</b>

    STM32定时器(三)输入捕获

    STM32定时器是支持信号输入捕获的,何为输入捕获?主要做什么应用?
    的头像 发表于 07-21 14:58 2563次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>定时器</b>(三)输入<b class='flag-5'>捕获</b>

    STM32定时器(一)PWM输出

    STM32定时器分类众多,按照内核、外核标准分为两部分:核内定时器+核外定时器
    的头像 发表于 07-21 14:51 2513次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>定时器</b>(一)PWM输出

    STM32CubeMx入门教程(3):定时器的使用

    导语“ 使用STM32CubeMx 生成初始化定时器代码,实现定时器特定定时
    发表于 07-11 15:22 2209次阅读
    <b class='flag-5'>STM32</b>CubeMx入门教程(3):<b class='flag-5'>定时器</b>的使用

    一个定时器输出4路不同频率波形的应用示例

    一般来讲,一个STM32定时器输出基于同一频率的各路信号比较方便。但经常也会有人问使用STM32一个定时器是否可以实现多路不同频率的输出。
    的头像 发表于 07-06 15:57 1123次阅读
    一个<b class='flag-5'>定时器</b>输出4路不同频率波形的应用<b class='flag-5'>示例</b>

    新塘M0用定时捕获怎么做模拟串口Rx?

    谁用过新塘M0的定时器输入捕获来搞过模拟UART的Rx,或是用过外部中断加定时器搞过模拟UART的Rx吗?
    发表于 06-20 07:42

    请问PWM捕获测量最大值怎么算?

    就是测量最长的怎么算?可不可以标记一下,比如说一个计数周期后
    发表于 06-20 07:27

    使用通用定时器的输入捕获实例

    本文将介绍通过使用通用定时器的输入捕获功能来记录按键按下的时间,并通过串口调试工具打印出按键按下的时间。
    的头像 发表于 05-01 09:02 664次阅读
    使用通用<b class='flag-5'>定时器</b>的输入<b class='flag-5'>捕获</b>实例

    CH32V103基础教程9-输入捕获

    本章教程通过CH32V103开发板PA8引脚检测PWM宽和周期,并通过串口调试助手打印显示。1、输入捕获简介及相关函数介绍输入捕获模式是定时器的基本功能之一,其通常用于
    发表于 04-14 16:17