电平输入检测-定时器输入捕获

2024-03-28 22:44

本文主要是介绍电平输入检测-定时器输入捕获,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一,引入

二,具体结构

三,实现步骤

四,PWM输入模式


一,引入

        上篇博客,我们对于定时器的计数核心——时基单元作了细致的了解。这篇博文,我们来介绍定时器的四大功能模块之一——输入捕获模块。

        输入捕获模块,顾名思义,当外界有电平输入MCU时,定时器的输入捕获模块能够捕获到电平,进而通过时基单元(计数器),记录捕获的电平的时间、占空比等数据。

        了解了大体功能后,我们来具体了解输入捕获功能的具体结构与实现步骤。

二,具体结构

        图 2.1 为输入捕获功能的框图:

图 2.1 输入捕获模块

        此处,我们以通道 1 为例。

        TIMx_CH1为外界电平输入引脚,TIMx_CHy的定义引脚可在数据手册中的引脚定义目录查看(图2.2)。

图 2.2 引脚定义表

        注意到,在通道1至3上,连接着一个异或门。异或门的功能机理为“相异出1,相同出0”——当异或门的两个(或多个)输入端口的逻辑值不同时(一个为0,另一个为1),输出端口将输出高电平(逻辑1);而当输入端口的逻辑值相同时(都为0或都为1),输出端口将输出低电平(逻辑0)。这个异或门是用来连接三相无刷电机的霍尔传感器的,在此处不作说明。

/*

        本人曾写过一篇博客,介绍无霍尔传感器控制无刷电机换相(无感控制),原文指路:

        四轴-无刷电机无感控制(BLDC)-CSDN博客

*/

        不看异或门:电平通过TIMx_CH1端口进入定时器,通过输入滤波器和边缘检测器后,通过边沿检测,到达预分频器,最后到达捕获/比较寄存器。当发生有效的电平转换时(通过通道1的电平发生翻转,被捕获/比较寄存器检测到),计数器中的值传到捕获/比较寄存器中(输入比较模块框图解释)

        由上述语段,可以发现,捕获/比较寄存器(TIMx_CCRy)既需要检测电平变化,又需要储存计数器中的值,且捕获比较寄存器也有影子寄存器。(关于影子寄存器的内容,可参考本人上一篇博客,指路:机器人是怎么计时的(通用定时器 - 时基单元)-CSDN博客

       

        介绍一下输入捕获的中断。

        当捕获事件发生时,相应的CCxIF标志(捕获比较中断标志,只在需要中断时才有用)被置’1’。如果使能了中断(CCxIE)或者DMA(CC1DE)操作,则将产生中断或者DMA。如果捕获事件发生时CCxIF标志已经为高,那么重复捕获标志CCxOF被置’1’。

        上述文字中所提及的“标志”,都是寄存器中所需  读/写的位  的名称。

        其中,重复捕获标志(CCxOF)的作用是,当捕获事件发生时(有电平进入定时器,CCxIF标志被置1),当正在发生此次事件的中断时,又发生了一次捕获事件。

        为了记录重新发生的捕获事件,提醒用户有一次新的捕获事件未被执行,便有了这个“重复捕获标志”,当然,如果CCxOF被置1后,又有新的捕获事件发生,第三次捕获的数据便会遮盖第二次的捕获数据,毕竟重复捕获标志只有一个。

        关于中断,就是框图上那个像闪电一样的箭头,上面写着“CCxI”。

        

        以上,便是输入捕获通道的具体结构。

        下面,我们介绍实现步骤。

三,实现步骤

        以下,是官方参考手册(不是数据手册)中关于  如何在TI1输入的上升沿时捕获计数器的值到TIMx_CCR1寄存器中:

1,选择有效输入端
        TIMx_CCR1 必须连接到 TI1 输入,所以写入 TIMx_CCR1 寄存器中的CC1S=01,只要 CC1S 不为 ’00’ ,通道被配置为输入,并且 TM1_CCR1 寄存器变为只读(图3.1,位介绍见参考手册)。
图 3.1 输入捕获模式设置寄存器
2,根据输入信号的特点,配置输入滤波器为所需的带宽 ( 即输入为 TIx 时,输入滤波器控制位是 TIMx_CCMRx寄存器中的 ICxF )
        假设输入信号在最多5 个内部时钟周期的时间内抖动,我们须配置滤波器的带宽长于5 个时钟周期。因此我们可以 ( f DTS 频率 ) 连续采样 8 次,以确认在TI1 上一次真实的边沿变换,即在 TIMx_CCMR1 寄存器中写入 IC1F=0011( 图3.1)。
此处,“抖动”的意思是,一簇电平的长度为5个时钟(5个电平),边沿变换可能在第1个时钟处出现,也可能在第2个时钟处出现,也可以在第3个、第4个、第5个时钟长度处出现。“采样8次”是为了尽可能地捕获时钟的变换,当然,也可以设置更多的采样次数,就可以加大捕获时钟变换的概率。
3,选择 TI1 通道的有效转换边沿,在TIMx_CCER寄存器(图3.2)中写入 CC1P=0( 上升沿 )
图 3.2 捕获/比较使能寄存器
4,配置输入预分频器。
        在本例中,我们希望捕获发生在每一个有效的电平转换时刻,因此预分频器被禁止(写TIMx_CCMR1 寄存器的 IC1PS=00)
        如果不使用分频器的分频功能,在电平跳变的瞬间,捕获比较寄存器就能捕获到电平跳变的信号,而使用了分频功能,就会延迟捕捉信号,具体原理在下列博客中有介绍: 机器人是怎么计时的(通用定时器 - 时基单元)-CSDN博客
5,设置 TIMx_CCER 寄存器的 CC1E=1 ,允许捕获计数器的值到捕获寄存器中。
6,如果需要,通过设置 TIMx_DIER 寄存器(图3.3)中的 CC1IE 位允许相关中断请求,通过设置
TIMx_DIER 寄存器中的 CC1DE 位允许 DMA 请求。

图 3.3 DMA/中断使能寄存器

        通过配置所选寄存器中的特定位的数据,可以使输入捕获模块执行输入捕获的功能。

四,PWM输入模式

        在输入捕获框图中,我们可以看到如图4.1所示的图像:

图 4.1 PWM输入捕获

        此处,我们只介绍TI1FP2,它的功能是,通过通道1的电平,可以同时到达捕获/比较寄存器1和捕获/比较寄存器2。这样,一组含有高低电平的数据进入MCU时,MCU能够同时检测它的高低电平信号的时间数据,图 4.2 说明了双通道测量数据:

图 4.2 双通道测量数据

        通过时序图,我们可以看到通过IC1、IC2分别计数的过程,配置方法如下:

1,选择TIMx_CCR1的有效输入:置TIMx_CCMR1寄存器的CC1S=01(选择TI1)。
2,选择TI1FP1的有效极性(用来捕获数据到TIMx_CCR1中和清除计数器):置CC1P=0(上升沿
有效)。
3,选择TIMx_CCR2的有效输入:置TIMx_CCMR1寄存器的CC2S=10(选择TI1)。
4,选择TI1FP2的有效极性(捕获数据到TIMx_CCR2):置CC2P=1(下降沿有效)。
5,选择有效的触发输入信号:置TIMx_SMCR寄存器中的TS=101(选择TI1FP1)。
6,配置从模式控制器为复位模式:置TIMx_SMCR中的SMS=100。
7,使能捕获:置TIMx_CCER寄存器中CC1E=1且CC2E=1。

        可以看到,PWM输入模式需要配置从模式控制器为复位模式,在一轮计数完成后(计数值达到预设的周期匹配值),计数器中的数据会复位(如图4.2)。而两个输入信号分别配置为上升沿有效与下降沿有效,就能同时记录PWM的高低电平时间。

        以上,便是输入捕获模式的介绍,欢迎交流喔!

这篇关于电平输入检测-定时器输入捕获的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/856893

相关文章

C++ 检测文件大小和文件传输的方法示例详解

《C++检测文件大小和文件传输的方法示例详解》文章介绍了在C/C++中获取文件大小的三种方法,推荐使用stat()函数,并详细说明了如何设计一次性发送压缩包的结构体及传输流程,包含CRC校验和自动解... 目录检测文件的大小✅ 方法一:使用 stat() 函数(推荐)✅ 用法示例:✅ 方法二:使用 fsee

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

Springboot如何配置Scheduler定时器

《Springboot如何配置Scheduler定时器》:本文主要介绍Springboot如何配置Scheduler定时器问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Springboot配置Scheduler定时器1.在启动类上添加 @EnableSchedulin

Java捕获ThreadPoolExecutor内部线程异常的四种方法

《Java捕获ThreadPoolExecutor内部线程异常的四种方法》这篇文章主要为大家详细介绍了Java捕获ThreadPoolExecutor内部线程异常的四种方法,文中的示例代码讲解详细,感... 目录方案 1方案 2方案 3方案 4结论方案 1使用 execute + try-catch 记录

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学