江科大/江协科技 STM32学习笔记P17

news2024/9/22 17:21:01

文章目录

  • 一、TIM输入捕获
    • 输入捕获与输出比较的关系
    • 频率测量
      • 测频法
      • 测周法
    • 输入捕获的电路
      • 异或门的执行逻辑
    • 输入捕获通道
    • 主从触发模式
    • 输入捕获基本结构
    • PWMI基本结构
    • 输入捕获模式测频率
      • main.c
    • 输入捕获模式测占空比
      • main.c


一、TIM输入捕获

在这里插入图片描述

输入捕获与输出比较的关系

在这里插入图片描述

在这里插入图片描述
在输出比较中,CNT和CCR作为比较电路的输入,根据CNT和CCR的大小关系,从通道引脚输出高低电平。
在这里插入图片描述
输入捕获,一旦左边的边沿信号产生,比如上升沿,输入滤波和边沿检测电路就会检测到上升沿,让输入捕获电路产生动作,控制后续电路,让当前CNT的值锁存到CCR寄存器中

频率测量

在这里插入图片描述
对于STM32测频率而言,只能测数字信号,如果要测正弦波,还需要搭建信号预处理电路,比如最简单的是用运放搭建一个比较器,把正弦波转换为数字信号输入给STM32,如果测量的信号电压非常高,需要考虑隔离的问题,比如用隔离放大器、电压互感器等元件隔离高压端和低压端,保证电路的安全。

测频法

适合测量高频信号,测量结果更新的慢,实际上是闸门时间内的平均频率

测周法

适合测量低频信号,测量结果更新的快,周期的倒数就是频率,用标准频率测一个周期,再取倒数

输入捕获的电路

在这里插入图片描述
左边是四个通道的引脚,通道1、2、3端口接了一个异或门。

异或门的执行逻辑

当三个输入引脚的任何一个有电平翻转时,输出引脚就产生一次电平翻转,之后输出通过数据选择器到达输入捕获通道1,数据选择器如果选择上面一个,输入捕获通道1的输入就是三个引脚的异或值,如果选择下面一个,异或门不起作用,四个通道各用各的引脚。异或门的作用是为三相无刷电机服务,无刷电机有3个霍尔传感器检测转子的位置,可以根据转子的位置进行换相,有了这个异或门就可以在前三个通道接上无刷电机的霍尔传感器,定时器就作为无刷电机的接口定时器,驱动换相电路工作。

在这里插入图片描述

接着输入信号来到了输入滤波器和边沿检测器,输入滤波器可以对输入信号进行滤波,避免高频毛刺信号误触发,边沿检测器可以选高电平或低电平触发,每一个通道都设计两套滤波和边沿检测电路, 第一套电路经过滤波和极性选择,得到TI1FP1,输入给通道一的后续电路,第二套电路经过另一套波和极性选择得到TI2FP2,输入给下面通道2的后续电路,下面同理。
就CH1和CH2来说,两个信号可以各走各的,也可以交叉让CH2引脚输入给通道1,或CH1引脚输入给通道2。这样做的目的第一可以通过数据选择器灵活切换后续捕获电路的输入,第二可以把一个引脚的输入同时映射到两个捕获单元,是PWMI模式的经典结构,PWMI模式简单来说第一个捕获通道使用上升沿触发,用来捕获周期,第二个通道用下降沿触发,用来捕获占空比,两个通道同时对一个引脚进行捕获,就可以同时测量频率和占空比了。
在这里插入图片描述

再接着看预分频器,每个通道各一个,可以选择对前面的信号进行分频,分频后的触发信号可以触发捕获电路进行工作,每来一个触发信号,CNT的值就会向CCR转运一次,转运的同时发生一个捕获事件,事件会在状态寄存器置标志位,同时也可以产生中断,如果需要在捕获的瞬间处理一些事,就可以开启这个捕获中断,这就是整个电路的工作流程。
举个例子,配置上升沿触发捕获,每来一个上升沿,CNT转运到CCR一次,又因为CNT计数器是由内部的标准时钟驱动的,所以CNT的数值可以用来记录两个上升沿之间的时间间隔(周期),取倒数就是测周法测量的频率了。另外注意每次捕获之后都要把CNT清零,这样下次上升沿再捕获时取出的CNT才是两个上升沿的时间间隔,这个操作可以用主从触发模式自动完成。

输入捕获通道

在这里插入图片描述
TI1就是CH1的引脚,TI1F就是滤波后的信号, f D T S f_{DTS} fDTS是滤波器的采样时钟来源,CCMR1寄存器里的ICF位可以控制滤波器的参数,滤波器的工作原理就是以采样频率对输入信号进行采样,当连续N个值都为高电平,输出才为高电平,连续N个值都为低电平,输出才为低电平,如果信号出现抖动导致连续采样N个值不全一样,输出则不变,达到滤波效果。采样频率越低,采样个数N越大,滤波效果越好。
滤波后的信号通过边沿检测器,捕获上升沿或下降沿,用CCER寄存器里的CC1P位,就可以选择极性了,最终得到TIFP1触发信号,通过数据选择器进入通道1后续的捕获电路,CC1S位可以对数据选择器进行选择,之后ICPS位可以配置分频器,最后CC1E位控制输出使能或失能,如果使能了输出,输入端产生指定边沿信号,经过层层电路到最后,让CNT的值转运到CCR里,而每捕获一次CNT的值,都要把CNT清零一下,便于下次捕获,如何自动清零CNT,首先TI1FP1信号和TI1的边沿信号都可以通向从模式控制器,比如TI1FP1信号的上升沿触发捕获,上面还可以同时触发从模式,从模式里有电路可以自动完成CNT清零

主从触发模式

在这里插入图片描述
主模式可以将定时器内部的信号,映射到TRGO引脚,用于触发别的外设
从模式就是接收其他外设或者自身外设的一些信号,用于控制自身定时器的运行,也就是被别的信号控制
触发源选择就是选择从模式的触发信号源,选择指定的一个信号得到TRGI,然后去触发从模式,如果想让TI1FP1信号自动触发CNT清零,触发源选择就可以选中TI1FP1,从模式执行的操作,可以选择执行Reset的操作
注意触发源选择只有TI1FP1和TI1FP2,没有TI3和TI4的信号,如果想用从模式自动清零CNT,就只能用通道1和通道2,对于通道3和通道4就只能开启捕获中断,在中断里手动清零

输入捕获基本结构

在这里插入图片描述
CNT是测周法中计数的东西,经过预分配后的时钟频率,就是驱动CNT的标准频率fc,标准频率=72M/预分频系数。下面是输入捕获通道1的GPIO口,输入一个左上角的方波信号,经过滤波器和边沿检测,选择TI1FP1为上升沿触发,之后输入选择直连的通道,分频器选择不分频,当TI1FP1出现上升沿之后,CNT的当前计数值转运到CCR1,同时触发源选择,选中TI1FP1为触发信号,从模式选择复位操作,这样TI1FP1的上升沿也会通过上面一路触发CNT清零,CNT的值转到CCR,0转移到CNT。电路工作时,CCR1的值始终保持为最新一个周期的计数值N, f c / n f_c/n fc/n就是信号的频率

PWMI基本结构

在这里插入图片描述
PWMI模式,使用两个通道同时捕获一个引脚,可以同时测量周期和占空比。首先TI1FP1配置上升沿触发,触发捕获和清零CNT,正常地捕获周期,再来一个TI1FP2,配置为下降沿触发,通过交叉通道触发通道2的捕获单元,就是在下降沿时CCR2捕获此时的CNT计数值(高电平期间的计数值),不触发CNT清零,这样一个周期后CCR1是一整个周期计数值,CCR2是高电平期间的计数值,CCR2/CCR1就是占空比

输入捕获模式测频率

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"
#include "IC.h"

int main(void)
{
	/*模块初始化*/
	OLED_Init();		//OLED初始化
	PWM_Init();			//PWM初始化
	IC_Init();			//输入捕获初始化
	
	/*显示静态字符串*/
	OLED_ShowString(1, 1, "Freq:00000Hz");		//1行1列显示字符串Freq:00000Hz
	
	/*使用PWM模块提供输入捕获的测试信号*/
	PWM_SetPrescaler(720 - 1);					//PWM频率Freq = 72M / (PSC + 1) / 100
	PWM_SetCompare1(50);						//PWM占空比Duty = CCR / 100
	
	while (1)
	{
		OLED_ShowNum(1, 6, IC_GetFreq(), 5);	//不断刷新显示输入捕获测得的频率
	}
}

输入捕获模式测占空比

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"
#include "IC.h"

int main(void)
{
	/*模块初始化*/
	OLED_Init();		//OLED初始化
	PWM_Init();			//PWM初始化
	IC_Init();			//输入捕获初始化
	
	/*显示静态字符串*/
	OLED_ShowString(1, 1, "Freq:00000Hz");		//1行1列显示字符串Freq:00000Hz
	OLED_ShowString(2, 1, "Duty:00%");			//2行1列显示字符串Duty:00%
	
	/*使用PWM模块提供输入捕获的测试信号*/
	PWM_SetPrescaler(720 - 1);					//PWM频率Freq = 72M / (PSC + 1) / 100
	PWM_SetCompare1(50);						//PWM占空比Duty = CCR / 100
	
	while (1)
	{
		OLED_ShowNum(1, 6, IC_GetFreq(), 5);	//不断刷新显示输入捕获测得的频率
		OLED_ShowNum(2, 6, IC_GetDuty(), 2);	//不断刷新显示输入捕获测得的占空比
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言第13篇

1.下面程序是计算n个数的平均值,请填空.______ #include<stdio.h> void main( ) { int i,n; float x,avg0.0; scanf("%d",&n); for(i0;i<n;i) { scanf("%f",&x); avgavg______; } avg________; printf("avg%f\n",avg); } A) …

[Git][分支管理][上]详细讲解

目录 1.理解分支2.创建分支3.切换分支4.合并分支5.删除分支 1.理解分支 感性理解&#xff1a;分支可以理解为平行宇宙&#xff0c;但是在用户需要的时候&#xff0c;可以将两个平行宇宙合并&#xff0c;此时两个平行宇宙的效果将会"叠加"理性理解&#xff1a;每次提…

树、二叉树、森林的转换

一、树和二叉树的转换 1、 2、 二、森林二叉树的转换 1、 2、

springboot医嘱管理系统-计算机毕业设计源码16053

摘 要 随着医疗信息化水平的不断提升&#xff0c;医嘱管理作为医院日常运营中不可或缺的一环&#xff0c;其重要性日益凸显。传统的医嘱管理方式往往存在效率低下、易出错等问题&#xff0c;已无法满足现代医疗服务的快速发展需求。因此&#xff0c;基于Spring Boot框架开发的…

MySQL-InnoDB引擎

目录 逻辑存储结构 架构 概述 内存结构 Buffer Pool&#xff08;缓冲池&#xff09; Change Buffer&#xff08;更改缓冲区&#xff09; Adaptive Hash Index&#xff08;自适应hash索引&#xff09; Log Buffer&#xff08;日志缓冲区&#xff09; 磁盘结构 System T…

基于CUDA12.1+CUDNN8.9+PYTORCH2.3.1,实现自定义数据集训练

目录 0 结果预览 1 核心点 2 参考链接 0 结果预览 1 核心点 yolo命令行CL需要将虚拟环境的yolo程序加入系统路径。 遇到conda install 失效问题&#xff0c;重建新的虚拟环境&#xff0c;再进行安装。 whl可以下载好后再安装。 pip install F:\tool\ai\torch-2.3.1cu…

使用VM安装K8S

VM 部署K8S 前言 本次使用VM搭建k8s&#xff0c;由于搭建流程复杂&#xff0c;在此记录。 需提前安装好VM&#xff08;可参考&#xff1a;VM安装&#xff09;&#xff0c;起两台虚拟机(模拟master和worker)&#xff0c;且VM里已安装好Docker&#xff08;可参考&#xff1a;D…

GO语言 4 收集器

劳苦功高的数组 声明数组并访问其元素 以下数组不多不少正好包含 8 个元素 var planets [8]string同一个数组中的每个元素都具有相同的类型&#xff0c;比如以上代码就是由 8 个字符串组成&#xff0c;简称字符串数组。 数组的长度可以通过内置的 len 函数确定。在声明数组…

03。仓颉程序结构

1&#xff0c;什么是 仓颉的“源代码”、“源文件”&#xff1f; ~通常以 “ .cj ” 为后缀的文本文件里面包含的仓颉代码&#xff0c;我们称为仓颉源代码、源文件。 / / test.txt --------------- test.cj 2&#xff0c;什么是 “ 作用域” &#xff1f;“嵌套作…

C/C++关键字大全

目录 一、const 二、static 三、#define 和 typedef 四、#define 和 inline 五、#define 和 const 六、new 和 malloc 七、const 和 constexpr 八、volatile 九、extern 十、前置 和后置 十一、atomic 十二、struct 和 class 一、const 1、const 关键字可用于定义…

在vscode中远程连接linux进行开发

目录 引言 配置过程 1.本机安装OpenSSH 2.本机生成RSA公钥和私钥 3.将rsa公钥添加到远程linux的authorized_keys文件中 4.vscode安装Remote - SSH插件 5.在vscode中ssh连接服务器 6.在本地vscode操作远程linux文件进行开发 7.在vscode上给远程linux机器需安装插件 常…

路径规划——贪婪最佳优先搜索

路径规划——贪婪最佳优先搜索 学习A算法前先学习一下贪婪最佳优先搜索算法&#xff0c;在学习过程中在网上找了一些博客、文章还有视频来看以深入理解此算法&#xff0c;但是实际情况却是非常令人恼怒。有些文章标题是贪婪最佳优先搜索&#xff0c;内容却是其他的算法&#x…

【密码学】椭圆曲线密码体制(ECC)

椭圆曲线密码体制&#xff08;Elliptic Curve Cryptography, ECC&#xff09;是一种基于椭圆曲线数学特性的公钥密码系统。在介绍椭圆曲线之前&#xff0c;我们先来了解一下椭圆曲线的基本概念。 一、椭圆曲线是什么&#xff1f; &#xff08;1&#xff09;椭圆曲线的数学定义…

PolSARPro软件安装处理TerraSAR数据(CSDN_20240804)

1. 打开polSARPro软件&#xff0c;点击Enter 2. 点击OK 3. 点击左侧第一个图像&#xff0c;进入PolSARPro Bio。 4. 点击Enter. 5. 点击Environment&#xff0c;选择Single Data Set 6. 选择工作路径 7. 点击No 8. Import -> Spaceborne Sensors ->TerraSAR-X->Quad-P…

C++的vector类

目录 简介 特点 接口 构造函数 迭代器函数 Capacity系列 element access系列 modifiers系列 定义在全局的重载函数 find 总结 简介 vector 是 C 标准模板库&#xff08;Standard Template Library&#xff0c;简称 STL&#xff09;中的一个模板类&#xff0c;用于表…

【iOS】——GCD总结

同步和异步的区别 同步执行等待操作完成&#xff0c;而异步执行允许程序在操作完成前继续运行&#xff0c;提高了效率和响应性。这里的关键就是上一个操作需不需要等待当前操作的执行&#xff0c;如果需要就是同步&#xff0c;如果不需要就是异步。 异步有开启新线程的能力但…

如何构建AI产品:OpenAI与前Shopify产品负责人Miqdad Jaffer的经验分享

一、引言 构建AI产品是一项复杂且充满挑战的任务&#xff0c;尤其是当涉及到面向消费者的解决方案时。在最近的一期播客节目中&#xff0c;OpenAI 和前Shopify产品负责人 Miqdad Jaffer 分享了他在构建AI产品的经验和策略。下面我们将探讨构建AI产品的最佳实践&#xff0c;以及…

行为型设计模式1:状态/策略/命令

行为型设计模式&#xff1a;状态/策略/命令 (qq.com)

【秋招笔试】24-08-03-米哈游-秋招提前批笔试题

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍰 米哈游提前批笔试也是来了,本次题目…

初谈表的约束

文章目录 概念空属性默认值空属性和默认值对比列描述zerofill主键 概念 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数据的合法性&#xff0c;从业务逻辑角度保证数据的正确性。比如有一个字段是emai…