STM32学习笔记(6_5)- TIM定时器的输出捕获原理

无人问津也好,技不如人也罢,都应静下心来,去做该做的事。

最近在学STM32,所以也开贴记录一下主要内容,省的过目即忘。视频教程为江科大(改名江协科技),网站jiangxiekeji.com

现在开始上难度,STM32功能最强大、结构最复杂的外设——定时器,分四期介绍。

第一期介绍最基础的定时功能理论、定时器中断和定时器内外时钟源选择的代码。

第二期介绍定时器输出比较功能的代码,输出比较功能常用产生PWM波驱动电机。

本期介绍定时器输入捕获功能原理,常用测量方波频率。

最后介绍定时器的编码器接口,更方便读取正交编码器的输出波形,常用编码电机测速。

输入捕获简介

对于同一个定时器,输入捕获和输出比较,只能使用其中一个,不能同时使用,因为同一个通道的捕获/比较寄存器是公用的。

 

频率测量

下图是一个频率逐渐降低的方波波形,这里信号都是只有高电平的数字信号。对于STM32测频率而言,它也是只能测量数字信号的。如果你需要测量一个正弦波,那还需要搭建一个信号预处理电路,最简单的就是用运放搭一个比较器,把正弦波转换为数字信号,再输入给STM32就行了。

测量频率有两种方法:

图中的中界频率是为了减小误差,待测信号频率小于中界频率时,取测周法。

第一种是测频法(适合测高频),执行流程是,通常设闸门时间T=1s,从0开始计,每来一个上升沿,计次+1,所以在1s时间内,来了多少个周期,那它的频率就是多少Hz。

测频法代码思路:我们之前写过, 对射式红外传感器计次、 定时器外部时钟,这些代码,稍加改进, 就是测频法。比如对射式红外传感器计次,每来一个上升沿计次+1,那我们再用一个定时器,定一个1s的定时中断,在中断里,每隔1s取一下计次值,同时清计次,为下一次做准备。这样每次读取的计次值就直接是频率。对应定时器外部时钟的代码,同理。

第二种是测周法(适合测低频),我们捕获信号的两个上升沿,然后测量一下这之间持续的时间,再对时间取倒数就是频率。我们使用一个已知的标准频率fc的计次时钟。 来驱动计数器,从一个上升沿开始计,计数器从0开始,一直计到下一个上升沿,停止。计一个数的时间是1/fc,计N个数, 时间就是N/fc。N/fc就是周期, 再取个倒数, 就得到了公式 fx=fc/N。

我们本期输入捕获测频率,使用的方法是测周法

输入捕获通道

引脚进来,这里有一个三输入的异或门,这个异或门的输入接在了通道1、2、3端口。异或门的执行逻辑是当三个输入脚的任何一个有电平翻转时,输出脚就产生一次电平翻转。之后输出通过数据选择器,到达输入捕获通道1。数据选择器如果选择上面一个,那输入捕获通道的输入,就是3个引脚的异或值;如果选择下面一个,那异或门就没有用,4个通道各用各的引脚。设计这个异或门,其实还是为三相无刷电机服务的,无刷电机有3个霍尔传感器检测转子的位置,可以根据转子的位置进行换相。有了这个异或门,就可以在前三个通道接上无刷电机的霍尔传感器,然后这个定时器就作为无刷电机的接口定时器,去驱动换相电路工作,了解下就好。

然后继续看,输入信号来到了输入滤波器和边沿检测器,输入滤波器可以对信号进行滤波,避免些高频的毛刺信号误触发,然后边沿检测器,这就和外部中断那里是一样的了,可以选择高电平触发,或者低电平触发,当出现指定的电平时,边沿检测电路就会触发后续电路执行动作。另外这里,它其实是设计了两套滤波和边沿检测电路。第一套电路,经过滤波和极性选择,得到TI1FP1(TI1 Filter Polarity 1),输入给通道1的后续电路;第二套电路,经过另一个滤波和极性选择,得到TI1FP2(TI1 Filter Polarity 2),输入给下面通道2的后续电路。同理,下面TI2信号进来,也经过两套滤波和极性选择,得到TI2FP1和TI2FP2,其中TI2FP1输入给上面,TI2FP2输入给下面。在这里,两个信号进来,可以选择各走各的,也可选择进行一个交叉,让CH2引脚输入给通道1,或者CH1引脚输入给通道2,那这里为什么要进行一个交叉连接呢?这样做的目的,主要有两个。第一个目的,可以灵活切换后续捕获电路的输入,比如你一会儿想以CH1作为输入,一会儿想以CH2作为输入,这样就可以通过这个数据选择器,灵活地进行选择。第二个目的,就是可以把一个引脚的输入,同时映射到两个捕获单元,这也是PWMI模式的经典结构。第一个捕获通道,使用上升沿触发,用来捕获周期,第二个通道,使用下降沿触发,用来捕获占空比,两个通道同时对一个引脚进行捕获,就可以同时量频率和占空比,这就是PWMI模式。下面通道3和通道4也是同理。

输入信号进行滤波和极性选择后,就来到了预分频器,可以选择对前面的信号进行分频,分频后的信号就可以触发捕获电路进行工作了,每来一个触发信号,CNT的值就会向CCR转运一次,转运的同时,会发生一个捕获事件,这个事件会在状态寄存器置标志位,同时也可以产生中断。如果需要在捕获的瞬间,处理一些事情的话,就可以开启这个捕获中断,这就是整个电路的工作流程。

比如我们可以配置上升沿触发捕获,每来一个上升沿,CNT转运到CCR一次,又因为这个CNT计数器是由内部的标准时钟驱动的,所以CNT的数值,其实就可以用来记录两个上升沿之间的时间间隔,这个时间间隔,就是周期。再取个倒数,就是测周法测量的频率了。另外这里还有个细节问题,就是每次捕获之后,我们都要把CNT清0一下。这样下次上升沿再捕获的时候,取出的CNT才是两个上升沿的时间间隔。

 输入捕获通道细化框图

简单理解,这个滤波器工作原理就是以采样频率对输入信号进行采样,当连续N个值都为高电平时,输出才为高电平;连续N个值都为低电平时,输出才为低电平;如果你信号出现高频钭动,导致连续采样N个值不全都一样,那输出就不会变化,这样就可达到滤波的效果。采样频率越低,采样个数N越大,滤波效果就越好

主从触发模式

其中主模式可以将定时器内部的信号,映射到TRGO脚,用于触发其他外设。

从模式呢,就是接收其他外设或者自身外设的一些信号,用于控制自身定时器的运行,也就是被别的信号控制。

触发源选择,就是选择从模式的触发信号源的,看成从模式的一部分。触发源选择,选择指定的一个信号,得到TRGI,TRGI去触发从模式,从模式可以在这个列表里,选择一项操作来自动执行

如果我们想让TI1FP1信号自动触发CNT清零,那触发源选择,就可以选中这里的TI1FP1,从模式执行的操作,就可以选择执行Reset的操作。这样TI1FP1的信号就可以自动触发从模式,从模式自动清零CNT,实现硬件全自动测量。

输入捕获基本结构

下图这个结构只使用一个通道,所以只能测量频率。在右上角这里,是时基单元,我们把时基单元配置好,启动定时器。那这个CNT,就会在预分频之后的这个时钟驱动下,不断自增,这个CNT,就是我们测周法用来计数计时的东西。经过预分频之后的时钟频率,就是驱动CNT的标准频率fc,

这里不难看出,标准频率=72M/预分频系数,然后下面输入捕获通道1的GPIO口,输入一个左上角这样的方波信号,经过滤波器和边沿检测,选择TI1FP1为上升沿触发,之后输入选择直连的通道,分频器选择不分频,当TI1FP1出现上升沿之后,CNT的当前计数值转运到CCR1里,同时触发源选择, 选中TI1FP1为触发信号,从模式选择复位操作,这样TI1FP1的上升沿,也会通过上面这一路,去触发CNT清零。当然这里会有个先后顺序,肯定得是先转运CNT的值到CCR里去,再触发从模式给CNT清零。

所以,当我们想要读取信号的频率时,只需要读取CCR1得到N,再计算fc/N,就行了;当不需要读取时,整个电路全自动的测量,不需要占用任何软件资源。

注意事项:CNT的值是有上限的,ARR一般设置为最大65535,那CNT最大也只能计65535个数,如果信号频率太低,CNT计数值可能会溢出;另外还有就是,这个从模式的触发源选择,如果想使用从模式自动清零CNT,就只能用通道1和通道2。对于通道3和通道4,就只能开启捕获中断,在中断里手动清零了,不过这样程序就会频繁中断。

PWMI基本结构

这个PWMI模式,使用了两个通道同时捕获一个引脚,可以同时测量周期和占空比

图中的上部分结构和上面的输入捕获基本结构一样,下面多了一个通道。

首先,TI1FP1配置上升沿触发,触发捕获和清零CNT,正常的捕获周期,这时我们再来一个TI1FP2,配置为下降沿触发,通过交叉通道,去触发通道2的捕获单元。

留意左上角,最开始上升沿,CCR捕获,同时清零CNT,之后CNT++。然后,在下降沿这个时刻,触发CCR2捕获,所以这时CCR2的值,就是CNT从上升沿到下降沿的计数值即高电平期间的计数值。CCR2捕获,并不触发CNT清零,所以CNT继续++,直到下一次上升沿,CCR1捕获周期,CNT清零,这样执行后,CCR1就是一整个周期的计数值,CCR2就是高电平期间的计数值,我们用CCR2/CCR1,是不是就是占空比了

两个程序现象

第一个是输入捕获模式测频率

在这里,为了测量外部信号的频率,我们先得有个信号源,产生一个频率和占空比可调的波形。这里借用上期的代码,先用PWM模块,在PA0端口输出一个频率和占空比可调的波形。然后我们测量波形的输入口是PA6,直接用杜邦线把PA0和PA6连起来,这样就能测量自己PWM模块产生波形的频率了

第二个是PWMI模式测频率和占空比

STM32的输入捕获还设计了一个PWMI模式,即PWM输入模式,

OLED第一行显示频率,当前是1000Hz;第二行显示占空比,当前是50%

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter脚本优化——CSV数据驱动文件

使用 CSV 数据文件设置实现参数化注册 1) 本地创建 csv 文件,并准备要使用的数据,这里要参数化的是注册的用户名和邮箱。所以在 csv 文件中输入多组用户名和邮箱。 2) 通过测试计划或者线程组的右键添加->配置元件->CSV…

【日常记录】【CSS】css实现汉堡菜单

文章目录 1、介绍2、布局3、鼠标移入变成 X 1、介绍 在移动端或者响应式中&#xff0c;可能会遇到 三个横线 鼠标移动到的时候&#xff0c;会变成 一个 X 符号&#xff0c;这个就是汉堡菜单 2、布局 <style>* {margin: 0;padding: 0;box-sizing: border-box;}body {displ…

后端常见面经之JVM

JVM组成 有垃圾回收的是哪些地方&#xff1f; 垃圾回收主要是针对堆内存中的对象进行的&#xff0c;包括以下几个方面&#xff1a; 堆内存&#xff1a;垃圾回收主要针对堆内存中不再被引用的对象进行回收&#xff0c;包括新生代和老年代中的对象。 永久代/元空间&#xff1a…

跑腿小程序|基于微信小程序的跑腿平台小程序设计与实现(源码+数据库+文档)

跑腿平台小程序目录 目录 基于微信小程序的跑腿平台小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 1、用户信息管理 2、跑腿任务管理 3、任务类型管理 4、公告信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、…

【数据结构】非线性结构——二叉树

文章目录 前言1.树型结构1.1树的概念1.2树的特性1.3树的一些性质1.4树的一些表示形式1.5树的应用2.二叉树 2.1 概念2.2 两种特殊的二叉树2.3 二叉树的性质2.4 二叉树的存储2.5 二叉树的基本操作 前言 前面我们都是学的线性结构的数据结构&#xff0c;接下来我们就需要来学习非…

42 ajax 下载文件未配置 responseType blob 导致的文件异常

前言 这是一个最近的关于文件下载碰到的一个问题 主要的情况是, 基于 xhr 发送请求, 获取下载的文件 然后 之后 xhr 这边拿到 字节序列之后, 封装 blob 来进行下载 然后 最开始我们这边没有配置 responseType 为 blob, arraybuffer, 然后 导致下载出来的 文件大小超过了…

基于前端技术实现的全面预算编制系统

前言 在现代商业环境中&#xff0c;预测销售数据和实际成本是每个公司CEO和领导都极为重视的关键指标。然而&#xff0c;由于市场的不断变化&#xff0c;准确地预测和管理这些数据变得愈发具有挑战性。为了应对这一挑战&#xff0c;建立一个高效的系统来管理和审查销售数据的重…

QT环境搭建

学习QT 一、QT环境搭建二、QT的SDK下载三、认识QT SDK 中自带的一些程序 一、QT环境搭建 QT开发环境&#xff0c;需要安装三个部分。 c编译器&#xff08;gcc、cl.exe……不是visual studio&#xff09;QT SDK&#xff08;QT SDK里面已经内置了C编译器&#xff1b;SDK就是软件…

如何使用Harmony OS控制外设——输入输出?

相关知识点 Hi3861开发板第一个示例程序演示 熟悉使用DevEco Device Tool插件进行程序烧录 熟悉串口调试工具sscom的使用 官方文档中控制核心板上LED的led_example.c讲解及演示 源码路径&#xff1a;applications/sample/wifi-iot/app/iothardware/led_example.cHarmony OS …

docker--Dockerfile (三)

1&#xff0c;Dcockerfile是什么 docker推荐使用dockerfile的定义文件和docker build命令来构建镜像。dockerfile使用基本的基于DSL&#xff08;面向领域语言&#xff09;语法的指令来构建Docker镜像。另一种创建Docker镜像的方式是使用docker commit&#xff0c;不推荐使用。 …

酷开系统让用户和电视双向传递,酷开科技实现商业变现

电视在我们的日常生活中扮演着重要的角色。虽然&#xff0c;作为客厅C位的扛把子——电视的娱乐作用深入人心&#xff0c;但是&#xff0c;它的涵义和影响力却因我们每个人的具体生活环境而存在着种种差异&#xff0c;而我们的生活环境又受到我们所处的社会及文化环境的影响。 …

6.使用个人用户登录域控的成员服务器,如何防止个人用户账号的用户策略生效?

&#xff08;1&#xff09;需求&#xff1a; &#xff08;2&#xff09;实战配置步骤 第一步:创建新的策略-并编辑策略 第二步&#xff1a;将策略应用到服务器处在OU 第三步&#xff1a;测试 &#xff08;1&#xff09;需求&#xff1a; 比如域控&#xff0c;或者加入域的…

以XX大学校园为例的智慧能源管理系统建设方案【能源物联网+智能微电网数字校园、节能校园、低碳校园】

建设背景 贯彻落实《中共中央 国务院关于完整准确全面贯彻新发展理念做好碳达峰碳中和工作的意见》和《国务院关于印发2030年前碳达峰行动方案的通知》要求&#xff0c;把绿色低碳发展纳入国民教育体系。 2021年3月26日为推动信息技术与教育教学深度融合&#xff0c;教育部印…

AI基础知识扫盲

AI基础知识扫盲 AIGCLangchain--LangGraph | 新手入门RAG&#xff08;Retrieval-Augmented Generation&#xff09;检索增强生成fastGPT AIGC AIGC是一种新的人工智能技术&#xff0c;它的全称是Artificial Intelligence Generative Content&#xff0c;即人工智能生成内容。 …

线性代数 - 应该学啥 以及哪些可以交给计算机

AI很热&#xff0c;所以小伙伴们不免要温故知新旧时噩梦 - 线代。 &#xff08;十几年前&#xff0c;还有一个逼着大家梦回课堂的风口&#xff0c;图形学。&#xff09; 这个真的不是什么美好的回忆&#xff0c;且不说老师的口音&#xff0c;也不说教材的云山雾绕&#xff0c;单…

Python程序设计 分支结构

1.判断三角形类型 编写一个能判断三角形类型的小程序。 输入三个数值&#xff0c;判断其是否能构成三角形的三条边。如果能构成&#xff0c;判断其是否等边三角形、直角三角形还是普通三角形。 xeval(input("边长一")) yeval(input("边长二")) zeval(inp…

SQLite使用的临时文件(二)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite数据库文件损坏的可能几种情况 下一篇&#xff1a;未发表 ​ 1. 引言 SQLite的显着特点之一它是一个数据库由一个磁盘文件组成。 这简化了 SQLite 的使用&#xff0c;因为移动或备份 数据库就像复制单个文…

linux用户管理1

linux系统可以多用户同时登录&#xff0c;在各自权限下做各自的事情 useradd添加普通用户&#xff0c;之后使用suusername切换用户 所有用户中&#xff0c;root用户权限最大&#xff0c;对应uid&#xff0c;gid均为0&#xff0c;uid为用户编号&#xff0c;gid为用户所在组编号…

力扣算题【第二期】

文章目录 1.反转链表1.1 算法题目1.2 算法思路1.3 代码实现 2.回文链表2.1 算法题目2.2 算法思路2.3 代码实现 1.反转链表 1.1 算法题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 1.2 算法思路 1.设置工作指针p,来遍历链表。 2.采…

基于java+SpringBoot+Vue的就业信息管理系统设计与实现

基于javaSpringBootVue的就业信息管理系统设计与实现 开发语言:Java数据库:MySQL技术:SpringBootMyBatis工具:IDEA/Ecilpse、Navicat、Maven 系统展示 前台展示 后台展示 系统简介 本就业信息管理系统以springboot作为框架&#xff0c;b/s模式以及MySql作为后台运行的数据库…