产品分类
您现在的位置: > 凯发娱乐排行榜推荐 > 基于STM32定时器捕获测量脉宽的应用示例

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

时间:2024-03-02 20:16 来源:未知 作者:admin 点击:

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

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

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

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

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

  在初始状态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】里。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  在初始状态下,将定时器从模式触发沿配置为上沿触发,捕捉通道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来记录和表示当前测试状态,大致流程如下。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  我们知道,STM32芯片里有很多系统级的复位,比方上电复位、欠压复位、看门狗复位、软件复位、复位脚电平触发复位等等。这些系统级的复位往往都是针对整个芯片或芯片的绝大部分区域。 其实,我们在实际应用中有时候可能并不需要、甚至不接受总是对整个芯片做大面积的复位。正因为如此,STM32的芯片里除了具备那些系统级复位功能外,还针对各个外设设计了复位功能,即我们可以只需针对某特定外设或特定区域做复位而不影响其它。特定区域一般是指某一块总线驱动的外设集,比方挂在APB1总线的所有外设。 或许有人不了解、或者说没有使用过针对特定外设复位的功能,这里就简单介绍下,抛砖引玉。在STM32各个系列的参考手册里的RCC章节,有关于对外设或局部外

  芯片的那些系统级复位功能 /

  中国移动多媒体广播(CMMB)是我国自主研发的、具有完全自主知识产权的移动多媒体广播标准。目前,全国各大城市的CMMB网络正在建设和完善当中,而CMMB信号的覆盖测试为网络优化和调整提供了重要的数据依据。数字电视广播网络的建设是一个长期复杂的过程,需要经过不断地调整和优化才能达到一个理想的效果。而只有有效、精确的网络覆盖测试才能为调整、优化提供可靠的依据。一个成熟稳定的CMMB网络覆盖测试系统,对于CMMB的发展具有重大意义。因此,有必要设计一款针对CMMB网络的覆盖测试系统。 本设计基于高性能单片机STM32和GPRS无线通信方案实现了对测试点CMMB网络覆盖情况的实时监测,并利用GPS接收器将测试终端的地理位子信息上传到服

  的CMMB智能网络监测系统的设计与实现 /

  配置流程: 1:系统时钟初始化,包括系统时钟和要开放的IO口或者功能的时钟配置。 2:IO口初始化,包括引脚,速率,输入输出模式等。 3:NVIC 中断向量配置 ,中断向量基地址和优先级的配置。 4:TIM3初始化:包括自动重装值,分频值,计数模式,使能TIM中断,使能TIM3外设 5:中断处理函数:注意清除TIMx的中断待处理位 注意: 1:RCC初始化要使能或者失能 APB1 外设时钟。 2:中断处理函数:注意清除TIMx的中断待处理位 TIMx_SR寄存器 3:关于时钟:初始化RCC时使用SystemInit()函数时默认的是AHB不分频,即HCLK等于SYSHCLK,APB2不分频,APB1为HCLK 2分频而定时器3

  先看邵老师的书中怎么写 里面写到: C/OS中,中断服务子程序要用汇编语言来写。然而,如果用户使用的C语言编译器支持在线汇编语言的话,用户可以直接将中断服务子程序代码放在C语言的程序文件中。 再看《M3权威指南》2.11.2节与9.11节中讲到Cortex-M3在进入异常时自动压栈。。。。返回时自动出栈,再也不需要汇编语言编写了。也就是说我们可以使用C语言来编写中断服务程序。并且省去了上面程序清单的(1)(5)(6). 其实ucos中的终端和裸奔的中断写法基本一致,只是加了几条语句,如下为串口中断的写法: void USART1_IRQHandler(void) { uint8_t RxData; O

  学习记录14 ucosii中的串口中断 /

  STM32F4时钟树 STM32一共有5个时钟源,分别为外部高速时钟(HSE)、内部高速时钟(HSI)、外部低速时钟(LSE)、内部低速时钟(LSI)以及锁相环时钟(PLL); 从时钟树可以看出,系统时钟主要有三个作用,一是为Cotex-M3内核提供运行时钟,二是直接或经过分频后为挂载在各种总线上的外设提供时钟,第三则是以后为RTC(实时时钟)提供时钟源。 下面是对应序号的时钟解释: 1,外部高速时钟(HSE) HSE 是高速的外部时钟信号,可以由有源晶振或者无源晶振提供,频率从 4-26MHZ不等。当使用有源晶振时,时钟从 OSC_IN 引脚进入, OSC_OUT 引脚悬空,当选用无源晶振时,时钟从 OSC_IN 和

  时钟基础知识 /

  】HAL库 STM32CubeMX教程十一---DMA (串口DMA发送接收)

  前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1、芯片: STM32F407ZET6/ STM32F103ZET6 2、STM32CubeMx软件 3、IDE: MDK-Keil软件 4、STM32F1xx/STM32F4xxHAL库 知识概括: 通过本篇博客您将学到: DMA工作原理 STM32CubeMX创建DMA例程 HAL库定时器DMA函数库 注意:关于cubemx的DMA配置,在DMA原理介绍中全部都有所讲解,如果有哪里不懂,请仔细阅读原理详解部分。 DMA的基本介绍 什么是DMA (DM

  】HAL库 STM32CubeMX教程十一---DMA (串口DMA发送接收) /

  刚学习 课上做的一个小实验 保存一下 在GPIOC口,分别接有一个开关K1和两个指示灯LED1和LED2。两个灯一亮一灭,每按一下开关,两个灯的亮灭状态翻。 单片机源程序如下: #include stm32f10x.h #include led.h #include key.h int main(void) { u8 key; LED_Init(); KEY_Init(); while(1){ key = KEY_Scan(); switch(key){ case WK_UP: LED1=!LED1, LED0=!LED0; break; }

  仿真按键控制led灯源程序 /

  STM32的时钟源 STM32F103有两种主时钟方案,一个是依靠内部RC振荡器的HSI(内部高速时钟),另一个是HSE(外部高速时钟)。 内部高速时钟源(HSI) 看数据手册,内部的HSI是由ST出厂时校准过的,但是精度并不高,在0到70℃下误差范围达到 -1.3%到2%,即便是在标准的25℃下,也有 -1.1%到1.8% 的误差(如下图)。 对于高波特率的异步串口通讯,或者需要高精度定时的场合(如:需要跑积分算法的时候),用HSI就有隐患,甚至根本达不到设计要求。 外部高速时钟源(HSE) 为了更高的时钟精度,就要用HSE做主时钟源,起码做到30ppm还是很容易的。无源晶振相对便宜一些,要求不是非常高的话也足够了。 对

  外部晶振电的主时钟方案 /

  F411的无刷直流电机FOC控制系统设计

  的集成化复合式无人机飞控系统设计

  调制

  使用STM32 Nucleo撬开针对物联网的ARM mbed IDE之门

  报名赢【养生壶、鼠标】等|STM32 Summit全球在线大会邀您一起解读STM32方案

  MPS电机研究院 让电机更听话的秘密! 第一站:电机应用知识大考!第三期考题上线,跟帖赢好礼~

  有奖直播 同质化严重,缺乏创新,ST60毫米波非接触连接器,赋予你独特的产品设计,重拾市场话语权

  【下载】LAT1396 STM32CubeIDE实用技巧之STM32H7双核调试的配置

  【下载】LAT1392 LTDC RGB接口 LCD的TouchGFX工程的移植步骤

  【直播】3月27日,STSAFE-A110安全芯片及ST4SIM eSIM芯片助力安全通信

  【线日,基于Buildroot制作STM32MP13启动镜像-深圳/厦门/西安/郑州/苏州

  【新品】STM32H5-Arm® Cortex®-M33 内核,主频高达250MHz,提升性能与信息安全性

  【新品】STM32MP13X-支持Linux、RTOS和Bare Metal应用,新一代通用工业级MPU

  【新品】Arm® Cortex®-M33处理器内核,运行频率160 MHz,基于Armv8-M架构并带有TrustZone®

  【下载】AN5129_适合2.4GHz无线信号的低成本PCB天线 基于 BlueNRG-LP ARM Cortex-M0+

  凝聚ST超低功耗微控制器技术精华的STM32U5于2021年问世,是一款堪称可改变游戏规则的低功耗MCU。作为STM32高性能低功耗系列旗舰产品,STM32 ...

  前言程控三相交流功率源的应用十分广泛,它被大量应用于冶金、通信、化工、电力及军工等诸多行业。用于交流调压、调功、调光及电机软启动等 ...

  音频模拟信号电路常需要在很大范围内调节电平,而高精度电路的调节范同达100 dB以上.相当于二进制线位,同时也要求具有较高的调 ...

  以C8051F020单片机为系统控制器件的实时检测和记录车辆散热系统动态参数电路设计

  1 引言车辆的系统散热性是衡量其先进性的一个重要标志,因为车辆的各个部件和系统都存在一个最佳的工作温度区间,在此温度范围内零部件的 ...

  通过利用C8051F020单片机实现立体声信号相位差电平差测试仪的设计

  将LR立体声信号经频谱分析、整形及占空比检测电路进行处理,采用过零鉴相法,通过测矩形波占空比,实现相位差的测试。将LR信号用AD736专用 ...

  基于C8051F系列单片机和CAN总线技术实现电动汽车数字控制系统的设计

  STM32F103C8T6用官方bootloader实现IAP升级操作方法

  看视频赢京东卡 PI无刷直流电机学习中心正式上线PWR功率分析模块 立即询价享春季好礼!

  芯(E)币兑换Nucleo扩展板:让你的Nucleo变身成pyboard

  提交创意【免费赢取600元DIY物料】,参赛冲击万元大奖!2022得捷电子创新设计大赛火热报名中

  PIC单片机AVR单片机ARM单片机嵌入式系统汽车电子消费电子数据处理视频教程电子百科其他技术STM32MSP430单片机资源下载单片机习题与教程词云: