32单片机基础:TIM输入捕获

指定的电平跳变,就是上升沿或者下降沿,可以通过程序设置 

PWMI模式,就是PWM的输入模式,是专门为测量PWM频率和占空比设计的,

可配合主从触发模式

这两个功能结合起来,测量频率占空比就是硬件全自动运行的,如今不需要进行任何干预,也不需要进中断,需要测量的时候,直接读取CCR寄存器就行了。使用非常方便,极大地减轻了软件的压力。

对应定时器的电路部分如下图所示 

四个输入捕获和输出比较通道,共用4个CCR寄存器另外它们的CH1到CH4,4个通道1的引脚,也是共用的。所以对应同一个定时器,输入捕获与输出比较,只能使用其中一个,不能同时使用。

对比一下输入捕获和输出比较:

输出比较,引脚是输出端口,输入捕获,引脚是输入端口

输出比较,是根据CNT与CCR的大小关系来执行输出动作

输入捕获,是接收到输入信号,执行CNT锁存到CCR的动作 

OK,如何配置输入捕获电路来测量这些参数,这就是我们的任务。

我们先了解频率测量的相关知识:32单片机只能测量数字信号,所以其他的信号要通过电路转换为数字信号才行。

闸门时间T通常为1S,在1s时间内,对上升沿计次,每来一个上升沿,计次加1,每来一个上升沿,就是来了一个周期的信号,所以在1s时间内,来了多少个周期,那它的频率就是多少hz。与频率的定义一样。

测周法的基本原理就是,周期的倒数就是频率,如果我们能取出一个周期的时间,取个倒数,就是频率。但是,实际上,我们没有一个精度无穷大的秒表来测时间,测量时间的方法,实际也是定时器计次。我们使用一个已知标准频率fc的计次时钟,来驱动计数器。从一个上升沿开始计,计数器从0开始,一直计到下一个上升沿,停止。计一个数的时间是1/fc,计N个数,时间就是N/fc.N/fc就是周期,再取个倒数,就是频率的计算公式。

对比这两种方法的适用范围:

测频法适合测量高频信号,测周法适合测量低频信号。

测频法测量的是在闸门时间内多个周期,所以自带一个均值滤波。如果在闸门时间内波形频率有变化,那得到的其实是这一段的平均频率,所以测评法结果更新慢,测量结果是一段时间的平均值,值比较平滑

反观测周法,它只测量一个周期,就能测出一次结果,所以出结果的速度取决于待测信号的频率。所以测周法更新速度快。由于只测量一个周期,所以结果值会受噪声的影响,波动比较大。

高频适合使用测频法,低频适合测周法,那多高算高,多低算低呢?这就与中界频率有关了。如上图所示。计算公式也给出来。

测频法如何实现呢?这个用我们之前学过的外设就可以实现,我们之前写过,对射式红外传感器计次,定时器外部时钟。这些代码,稍加改进,就是测频法。比如对射式红外传感器计次,每来一个上升沿,计次加1.那我们再来用一个定时器,定一个1s的定时中断。在中断里,每隔1s取一下计次值。同时清零计次,为下一次做准备。这样每次读取的计次值就直接式频率。对应定时器外部时钟的代码。也是如此,每隔1s取一下计次。就能实现测频法测量频率的功能了,

我们本次使用测周法测量输入捕获频率。

我们再来详细看一下输入捕获的各部分电路。

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

信号来到输入滤波器和边沿检测器,输入滤波器可以对信号进行滤波。避免一些高频的毛刺信号误触发,然后是边沿检测器,这就和外部中断那里是一样的,可以选择高电平触发,或者低电平触发,当出现指定的电平时,边沿检测电路就会触发后续电路执行动作。 

 这个电路图是设计了两套滤波和边沿检测电路。第一套电路得到TI1FP1(TI1 Filter Polarity 1),输入给通道1的后续电路,。第一套电路得到TI1FP2(TI1 Filter Polarity 2)输入给下面通道2的后续电路。

同理,下面TI2信号进来,也经过两套滤波和极性选择,在这里,两个信号可以选择各走各的,也可以选择进行一个交叉,让CH2引脚输入给通道1,或者CH1引脚输入给通道2,为啥要进行一个交叉选择呢?这样做的目的,主要有两个:第一个目的,可以灵活切换后续捕获电路的输入,比如你一会想以CH1作为输入,一会儿想以CH2作为输入,这样就可以灵活的选择。第二个目的,就是可以把一个引脚的输入,同时映射到两个捕获单元,这也是PWMI模式的经典结构,比如让第一个捕获通道,使用上升沿触发,用来捕获周期,第二个通道,使用下降沿触发,用来捕获占空比。两个通道对同一个频率进行捕获,就可以用来测量频率和占空比,这就是PWMI模式。

TRC信号也可以作为捕获部分的输入,来源是下图,这样设计,也是为了无刷电机的驱动。

进入分频,分频后的触发信号就可以触发捕获电路进行工作了,每来一个信号,CNT的值,就会向CCR转运一次,转运的同时,会发生一个捕获事件,这个事件会在状态寄存器置标志位,同时也可以产生中断,如果需要在捕获的瞬间,处理一些事情的话,就可以开启这个捕获中断 

 

这就是整个电路的工作流程,比如我们可以配置上升沿触发捕获,每来一个上升沿CNT转运到CCR一次,又因为CNT计数器是有内部的标准时钟驱动的,所以CNT的数值,就可以用来记录两个上升沿之间的时间间隔,这个时间间隔,就是周期, 

这样与测周法的操作步骤是一样的,上升沿用于触发输入捕获,CNT用于计数计时,每来一个上升沿,取一下CNT的值,自动存在CCR里,CCR捕获得到的值,就是计数值N,CNT的驱动时钟,就是fc,fc/N就得到了待测信号的频率,另外还有个细节问题,就是每次捕获之后,我们都要把CNT清零一下,这样下次上升沿再捕获时,取出的CNT才是两个上升沿的时间间隔。这个在一次捕获后自动将CNT清零的步骤,我们可以使用主从触发模式,自动来完成。 

 

下图是输入捕获通道1的一个更详细的框图

 

引脚进来,先经过一个滤波器,滤波器的输入是TI1,就是CH1的引脚,输出的TI1F,就是滤波后的信号。fDTS是滤波器的采用时钟来源,下面CCMR1里的ICF位可以控制滤波器的参数,

滤波之后的信号,经过边沿检测器,捕获上升沿和下降沿,可以用这个CCER寄存器的CC1P位就可以选择极性了,最终得到TI1FP1触发信号,通过数据选择器,进入通道1后续的捕获电路 ,CC1S位可以选择数据选择器,ICPS位可以选择分频,CCIE位,控制输出使能或失能。如果使能了输出,输出端产生指定边沿信号,经过层层电路,就可以让CNT的值,转运到CCR里面去。

我们之前说过,每捕获一样CNT的值,都要把CNT清零一下,以便下一次的捕获,在这里硬件电路就可以在捕获之后自动完成CNT清零工作,如何自动清零CNT呢?我们看一下TI1FP1和TI1F_ED信号,都可以通向从模式控制器,从模式里,就有自动完成CNT的清零,

这个滤波器具体是如何工作的呢?我们看一下手册。

 

简单来理解的话,以采样频率对输入信号进行采样,当连续N个值都为高电平,输出才为高电平 

 连续N个值都为低电平,输出才为低电平。如果你信号出现高频抖动,导致连续采用N个值不全都一样,那输出就不会变化,这样达到了滤波的效果,采样频率越低,采样个数N越大,滤波效果越好,下图的这些描述,就是每个参数对应的采用频率和采用个数,实际应用中,如果波形噪声比较大,就可以把这些参数设置大一些,这样就可以滤除过滤噪声了。

我们研究一下主从触发模式:

主从触发模式有什么用,如何完成硬件自动化的操作。

 

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

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

触发源,就是选择从模式的触发信号源的,触发源选择,选择指定的一个信号,得到TRGI,TRGI去触发从模式,从模式可以选择一项操作来自动执行。

我们要CNT自动清零,就可以选择TI1FP1.从模式执行的操作,就可以选择执行Reset的操作。

 

敲代码的思路图:

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分类算法入门:以鸢尾花数据集为例

近两年人工智能技术蓬勃发展,OpenAI连续放出ChatGPT、Sora等“王炸”产品,大模型、AIGC等技术带来了革命性的提升,很多人认为人工智能将引领第四次工业革命。国内各大互联网公司也是重点投资布局,从个人角度来说要尽快跟上时代的潮…

MyBatis操作数据库(SQL注入)

本文主要来讲解6大标签&#xff0c;以便更好的MyBatis操作数据库&#xff01; <if>标签<trim>标签<where>标签<set>标签<foreach>标签<include>标签 前提需求&#xff1a; MyBatis是一个持久层框架&#xff0c;和Spring没有任何关系&…

静态时序分析:SDC约束命令set_fasle_path详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 目录 指定建立/保持时间检查 指定上升/下降沿 指定时序路径起点 删除虚假路径 添加注释 简单使用 写在最后 在之前的文章中&#xff0c;我们讨论了如何使…

持续集成(CICD)- Jenkins+Git+gogs综合实战(笔记二)

文章目录 七、拉取代码方法一:直接填写命令进行拉取(不建议用这种)方法二:使用源码管理拉取代码步骤一:确认环境(检查自己是否有Git插件)步骤二:构建项目时对项目的源码管理选择 Git步骤三:输入你仓库的SSH地址或者https地址,并且添加gitee的用户名和密方法一和方法二…

SpringCloud的Consul

0.介绍 Console是一款服务发现、健康检查、分布式配置中心&#xff0c;有单独的web可供配置和查看的Spring家族的一员。 1.下载 https://developer.hashicorp.com/consul/install?product_intentconsul 2.启动 consul agent-dev访问localhost:8500 3 Java使用注册中心 …

【李沐论文精读】GAN精读

论文&#xff1a;Generative adversarial nets 参考&#xff1a;GAN论文逐段精读、生成对抗网络、李沐视频精读系列 一、介绍 什么是GAN? GAN(Generative adversarial network&#xff0c;生成对抗网络&#xff09;&#xff0c;它由生成器G&#xff08;Generator Neural Netwo…

Java 简单模拟银行存取钱

模拟银行存取钱 一、实验任务 在银行办理业务时&#xff0c;通常银行会开多个窗口&#xff0c;客户排队等候&#xff0c;窗口办理完业务&#xff0c;会呼叫下一个用户办理业务。本实验要求编写一个程序模拟银行存取钱业务办理。假如有两个用户在存取钱&#xff0c;两个用户分别…

力扣--动态规划413.等差数列划分

思路分析 : 开始时判断输入向量的大小是否小于等于2&#xff0c;若是&#xff0c;则返回0&#xff0c;因为少于3个元素不可能形成等差数列。初始化一个大小为n的动态规划数组dp&#xff0c;用于存储以每个位置为结尾的等差数列的数量。初始化一个变量result用于存储最终的结果…

华为机试 字符串最后一个单词的长度

本题中&#xff0c;我们是要从键盘输入一个字符串&#xff0c;然后返回这个字符串最后一个单词的长度。所以我们需要scancer类。我们需要注意的是&#xff0c;hasnext()和hasnextline()这两个函数的区别。 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 pack…

数据持久层框架:MyBatis-Plus

数据持久层框架&#xff1a;MyBatis-Plus 前言注解代码生成器CURD接口Service CRUD 接口Mapper CRUD 接口 条件构造器QueryWrapper和UpdateWrapperallEqeq、negt、ge、lt、lebetween、notBetweenlike、notLike、likeLeft、likeRight、notLikeLeft、notLikeRightisNull、isNotNu…

Cookie 探秘:了解 Web 浏览器中的小甜饼

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

list链表的创建,排序,插入, test ok

1. 链表的建立&#xff0c;打印 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <stack> #include <iostream> #include <string.h> #include <string>using namespace std;struct node {int data;s…