使用c++ 实现定时触发键盘事件_基于定时器捕获测量脉宽的应用示例
我们知道,利用单片机定时器捕获功能测量脉冲信号宽度及占空比是种很常见的做法。这里以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寄存器。
在初始状态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来记录和表示当前测试状态。
1.2 、测量用到的算式
根据上面的介绍,一次完整的测量下来,测得的周期和占空比可以用下面算式求得。
【下面算式貌似复杂,只需把上面测试原理和那几个数据理清自然就会计算】
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图形化工具进行配置:
1.3.2 、实现TIM4通道2的输入捕获,假定TIM4的溢出周期为20ms.
A、选择定时器内部时钟为时钟源,32F411定时器内部时钟为100Mhz;
B、设置分频比,选择计数模式、设置计数脉冲个数;
先对时钟源100分频、即PSC=100-1;选择向上计数模式up counting;
计数器基于分频后的脉冲每计数20000个,发生溢出并产生更新事件及中断。
则:ARR=20000-1
按照上面参数来设计,定时计数周期或者说溢出周期就是20ms.
另外,通道2配置为输入捕捉,初始捕捉极性位选择上升沿。
1.4 、工程代码的生成、添加和整理
通过STM32CUBEMX依据上述参数完成配置,并开启TIM4的中断使能,然后生成工程。再在工程里添加应用户代码。
......
Measure_State= 0x00; //测试初始态
Num_OvEvent= 0x00; //TIM4溢出次数初始值
部分处理代码的简要说明:
在TIM4通道2的捕获中断里做3次捕捉值的获取以及计算,在TIM4更新中断里对溢出事件进行统计。
二、本次示例的结果验证
实验中tim4的时基参数保持不变,可通过调整TIM3的PWM输出的脉宽和占空比,来看看实验结果。下面有一个视频剪辑,就是上面工程验证结果的部分内容,有兴趣可以观看。
上面简单介绍了基于单通道的定时器捕获实现对脉宽及占空比测量的过程,现在继续介绍使用双通道,基于定时器PWM输入模式测量脉宽及占空比。同样,在测量过程中也统计用于测量的定时器自身的溢出事件。所用开发板和开发环境跟上面一致。
三、实现原理、思路及步骤
3.1、同样,利用板载芯片内的TIM3的通道1产生一个周期为5s,占空比为40%的PWM输出信号,然后将该信号连线到TIM4的定时器通道2【TI2】,作为其直接输入。基于PWM输入模式对来自于TIM3的PWM输出信号进行脉宽及占空比的测量。
这里先简单介绍下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来记录和表示当前测试状态,大致流程如下。
整个测量过程中,我们使用触发脉冲产生的触发事件作为每次开启测量的起始。
3.3、 测量用到的算式
根据上面的介绍,1次完整的测量下来,测得的周期和占空比可以用下面算式求得:
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图形化配置界面:
3.4.2、 实现TIM4通道2做PWM模式输入测量,假定tim4计数器溢出周期为20ms。
先做时基参数的配置:
1、选择定时器内部时钟为时钟源,32F411定时器内部时钟为100Mhz;
2、设置分频比,选择计数模式、设置计数脉冲个数;
先对时钟源100分频、即PSC=100-1; 选择向上计数模式up counting;
计数器基于分频后的脉冲每计数20000个,发生溢出并产生更新事件及中断。则:ARR=20000-1。注意:TIM4工作在复位从模式。
按照上面参数来设计,定时计数周期或者说溢出周期就是20ms.
再看看定时器TIM4的捕获配置:
TIM4输入捕捉通道2配置为直接输入捕捉,捕捉极性选择上升沿。
TIM4输入捕捉通道1配置为间接输入捕捉,捕捉极性选择为下降沿。
3.5、工程代码的生成、添加和整理
通过STM32CUBEMX依据上述参数完成配置,并开启TIM4的中断使能,然后生成工程。再在工程里添加应用户代码。【只列出部分直接有关的】
部分处理代码简要说明:
发生触发事件时,进入测量状态:
在TIM4通道1发生下沿捕捉事件时,将前面时间段的溢出次数记录下来并切换测量状态。
在TIM4通道2发生上沿捕捉事件时,将整个测量周期发生的溢出次数记录下来,并转入计算处理状态。
另外,在测量状态下,基于TIM4的更新中断对溢出次数进行统计。
四、实验结果验证
同样,我们保持实验中tim4的时基参数保持不变,通过调整TIM3的PWM输出波形的脉宽和占空比,来看看实验结果。
五、小结
上面介绍了两种测量信号脉宽及占空比的方案,都用了捕获中断和更新中断。其中,在第2种方案中用触发事件作为每次测量的起始,这算是个关键点。顺便说下,我们在利用定时器测量脉宽涉及到更新事件次数统计时,比较容易出现多统计一次的问题。因为定时器初始化完成后会软件产生一次更新事件,所以建议在启动定时器更新中断前对该标志位做个清零操作。不过,在我上面两个方案的示例代码的初始化阶段,这个操作倒是可有可无,因为我的代码里对更新事件计数还要结合状态机,并非一有更新中断就累加。
上面提到的实现思路及代码仅供参考,旨在抛砖引玉。当你对原理把握得越清晰时,应用就越灵活。最后,就上面提到的两种测量方案基于个人的理解做个简单比较。
【注:2个通道并不意味着需要2个物理管脚,其实1个脚就够了。另外基于定时器捕获功能配合DMA,解码方面也能有很好的发挥。】
下方的小视频,是基于单通道模式测量信号占空比的验证部分的视频剪辑,有兴趣可以打开看下。
==================================
往期话题阅读链接[点击即可阅读]:
1、IAP代码与APP代码合并烧录示例
2、基于STM32 GUI应用的选型推荐
3、STM32H743从RAM启动异常的案例
4、PCB板边缘的敏感线为何容易ESD干扰
5、一个关于CAN出错中断重复出现的话题
使用c++ 实现定时触发键盘事件_基于定时器捕获测量脉宽的应用示例相关推荐
- c++ 定时器_【话说定时器系列】之十:PWM输入模式测量脉宽及占空比实验
STM32定时器是 ST MCU 内部最基础且常用的外设,实际应用尤为普遍.去年,电堂推出了<STM32 TIMER基础及常规应用介绍>,为大家梳理了 STM32 TIMER 的庞大内容, ...
- 高级定时器之输入捕获应用(测量脉宽)
高级定时器-输入捕获应用 输入捕获一般应用在两个方面,一个方面是脉冲跳变沿时间测量,另一方面是PWM输入测量. 测量脉宽或者频率 测量频率 当捕获通道TIx上出现上升沿时,发生第一次捕获,计数器C ...
- php 监听redis,php监听redis key失效触发回调事件_后端开发
php中使用fsockopen实现异步请求(代码示例)_后端开发 php执行一段程序,有可能几毫秒就执行完毕,也有可能耗时较长.例如,用户下单这个事件,如果调用了些第三方服务进行发邮件.短信.推送等通 ...
- python读取键盘事件_使用 Python 记录键盘事件!真的很神奇~
今天也不知道是想了什么,突然就想要试试看我有效击键时的手速到底有多快.为此,需要记录下来击键的记录.于是找到了 Python 的keyboard 库. 安装非常简单,只需执行pip install k ...
- html页面加载完成后会触发的事件_前端隐秘角落 - 页面渲染
前言 如图所示,webkit内核浏览器的渲染过程(解析HTML,构建DOM树,解析CSS,构建CSSOM树 ,构建render树,布局layout,绘制painting),这些过程理解起来可能有些抽象 ...
- 正确绑定键盘事件_事件为何重要以及如何正确处理
正确绑定键盘事件 玛丽娜·佩奇 ( Marina Paych )在她的生日那天离开了一个非政府组织,开始了IT行业的新起点时,她是开源软件的新来者. 但是真正的惊喜竟然是开源. 快进两年了,这个组织发 ...
- STC用PCA测量脉宽_示波器在进行频率测量时如何减少误差
差分探头_电流探头_示波器探头_隔离探头-PinTech品致官网www.pintech.com.cn 示波器在进行频率测量时测量如何减少误差.PinTech品致可以准确的测量频率并显示被测信号的频谱 ...
- STC用PCA测量脉宽_「话说定时器系列」之九:定时器单通道测量脉宽和占空比
STM32定时器是 ST MCU 内部最基础且常用的外设,实际应用尤为普遍.去年,电堂推出了<STM32 TIMER基础及常规应用介绍>,为大家梳理了 STM32 TIMER 的庞大内容, ...
- STC用PCA测量脉宽_【话说定时器系列】之九:定时器单通道测量脉宽和占空比
STM32定时器是 ST MCU 内部最基础且常用的外设,实际应用尤为普遍.去年,电堂推出了<STM32 TIMER基础及常规应用介绍>,为大家梳理了 STM32 TIMER 的庞大内容, ...
最新文章
- 多少分才能考上重庆计算机学校,重庆多少分能上985大学?重庆985院校分数线是多少?(2021年参考)...
- 使用python实现简单的爬虫
- 每天一道LeetCode-----将有序序列转成高度平衡二叉搜索树
- 动态规划 53:Maximum Subarray,152:Maximum Subarray,266. Palindrome Permutation 回文全排列...
- linux make java版本,告诉make是否在Windows或Linux上运行
- 毫米波雷达_最新的7个毫米波雷达应用案例
- mysql从库应用负载_线上MySQL数据库高负载的解决思路--再次论程序应用索引的重要性...
- Java—File类详解及实践
- 字典(dict)按键(key)和值(value)排序即item()的常用方式
- SPOJ GCDEX (数论)
- JS:ES11新特性
- VS2008安装deffactory.dat文件错误解决方法
- jquery几种常用框架比较
- 《创新思维训练》2021网课章节测验及答案
- arcgis制作分幅图层,并对分幅图进行编号
- 学习要趁早年轻要挣钱
- 师父韩晋文先生传授的八卦掌套路
- 1920x1080平板 android,高清是王道!1080P分辨率屏幕平板大搜罗
- 电脑重装系统,微信备份与恢复聊天记录,保存的文件。微信聊天记录迁移
- mysql主键设置了递增,插入语句的写法
热门文章
- python datasets_python基础之sklearn.datasets
- java中字符串压缩成bcd码_Java 压缩 / 解压缩字符串
- java计算文件里的总分_java程序读取txt文件并计算总分 求帮忙
- 彻底理解kafka中partition和消费者对应关系
- docker pull时候太慢卡死
- python的plt函数_plt.plot画图函数
- 各种门锁的内部结构图_双核CUP,电镀真金把手,0.3秒开锁,欧瑞博智能门锁S2评测...
- 执行transact mysql_创建数据库失败((Microsoft.SqlServer.Smo))执行Transact-SQL
- linux下vim编辑器的基本使用
- 【Java核心面试宝典(1),程序员Javaweb源码