输入捕获模式测频率PWM输入模式(PWMI)测占空比
一、概念介绍
输出比较:
比较电路输入的CNT、CCR大小关系 ,在通道引脚输出高低电平
二、*频率知识、测量方法补充 *
N/fc得到标准频率的时长,也就是待测频率的周期
测频法代码实现:修改对射式红外传感器计次(上升沿计次)、定时器外部时钟(1s中断)
测频法:定时器中断,并记录捕获次数;测周法:捕获中断,并记录定时器次数。
三、输入捕获电路分析如何实现测周法:
异或门其实还是为三相无刷电机服务,三个霍尔传感器检测转子位置,根据转子位置进行换相,在前三个通道接上霍尔传感器,这个定时器就作为无刷电机的接口定时器,去驱动换相电路工作
输入滤波器:避免毛刺
3.1设计成交叉状的目的:
TI1FP1(TI1 Filter Polarity 1) -->IC1<--TI2FP1
TI1FP2-->IC2<--TI2FP2
(1)灵活切换后续捕获电路输入 CH1变成CH2 即一个通道切换两个引脚
(2)把一个引脚的输入,同时映射到两个捕获单元(PWMI模式经典结构) 即两个捕获单元捕获一个引脚
举例:
第一个捕获通道?TI1FP1上升沿触发,用来捕获周期
第二个捕获通道TI1FP2下降沿触发,用来捕获占空比
两个通道同时对一个引脚进行捕获
3.2预分频器(测周法实现)&捕获中断
*设置上升沿触发,分频后的触发信号每来一次,CNT就会向CCR转运一次,又因为CNT是内部的标准时钟驱动的,CNT数值就可以记录两个上升沿之间的时间间隔,也就是周期,取倒数得到频率
上升沿用于触发输入捕获,CNT用于计数计时
捕获中断:同时产生捕获事件,这个事件在状态寄存器置标志位,同时也可以产生中断
3.3应用场景:超声波模块检测电路
3.4细节问题
每次捕获后,把CNT清零,这样下次上升沿再捕获,取出的CNT 才是两个上升沿的时间间隔
用主从触发模式自动完成
四、电路执行细节
注意:
CNT的值是有上限的(65535=ARRmax),若信号频率太低,CNT计数值会溢出
从模式的触发源选择:TI1FP1 TI2FP2没有3,4 想用从模式自动清零CNT,只能用通道1和通道2,对于通道3和通道4只能开启捕获中断,手动清零
-->Q:能否外部中断? AS:概念不清,外部中断那是CPU了啊,这里是硬件映射主模式,然后配置从模式
也可以捕获第二个引脚:TI2FP1 TI2FP2
五、函数学习
/*****初始化输入捕获单元******/
void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);//只配置一个通道void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);//配置两个通道(PWMI模式)/*****给输入捕获结构体赋初值*****/
void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct);*****************************选择从模式*********************************/*****选择从模式输入触发源*****/void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
/*****选择主模式输出触发源*****/
void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource);
/*****选择从模式*****/
void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode);/*****配置分频器*****/
结构体里也能配置,一个效果void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);/*****读取CRR*****/
输入捕获模式下只读,输出比较只写(TIM_SetComparex),函数是不一样的
uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture3(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture4(TIM_TypeDef* TIMx);
Q&AnS
为什么ARR要大一些?
-->防止N过大计数溢出,为了防止cnt到了某个值就重装了
psc也不能给的太小,防止测量的信号频率过低,导致计数器溢出
注意:
1.滤波器 VS分频器
滤波器计次不会改变信号原有频率,因为滤波器采样频率远远高于信号频率,只会滤除高频噪声,使信号更平滑
分频器对信号本身计次,会改变频率
这里用上升沿触发归零,后边用下降沿不触发归零,两个值一减就是占空比。归零一次是一个周期,从0开始计高电平方便得出占空比,不然还得用1再减一下
2.Fc = 72MHz/(psc+1)
六、输入捕获模式测频率代码分析
main.c
为什么PWM那里还是 720-1 IC却要改72-1?
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"
#include "IC.h"int main(void)
{OLED_Init();PWM_Init();IC_Init();OLED_ShowString(1,1,"Freq:00000Hz");PWM_SetPreScaler(720-1); //Freq= 72M / (PSC+1) / 100PWM_SetCompare1(50); //Duty = CRR / 100while(1){OLED_ShowNum(1,6,IC_GetFreq(),5);}}
IC.C
#include "stm32f10x.h" // Device headervoid IC_Init(void)
{/*****STEP1 开启时钟*****/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//TIM2要输出PWM 换成3捕获RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//TIM3_CH1 在PA6口/*****STEP2 配置GPIO*****/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);/*****STEP3 配置时基单元*****/ TIM_InternalClockConfig(TIM3);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision =TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up ;TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;//ARRTIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1 ;//PSC 1MHzTIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);/*****STEP 4 输入捕获配置*****/TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择通道TIM_ICInitStructure.TIM_ICFilter = 0xF; //配置滤波器参数,数值越大过滤效果越好TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //极性选择TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //分频器TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //配置数据选择器TIM_ICInit(TIM3,&TIM_ICInitStructure);/*****STEP 5 配置主从触发模式 *****/TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1); //触发源选择TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset); //配置从模式/*****STEP6 启动定时器*****/TIM_Cmd(TIM3,ENABLE);
}uint32_t IC_GetFreq(void)
{return 1000000 / TIM_GetCapture1(TIM3); //Fc = 72MHz/(psc+1)
}
现象
10001Hz
原因:
计数到1000Hz那个数信号刚好跳变,导致数没记上
有朋友说是因为:读取的是N,但实际上计了N+1个数,因为计数器CNT是从0开始计的,所以这里要加一,错,自行探讨
改进:
uint32_t IC_GetFreq(void)
{
return 1000000 /( TIM_GetCapture1(TIM3)+1); //Fc = 72MHz/(psc+1)
}
七、PWMI测占空比代码分析
与上一个代码不同的地方:
1.输入捕获初始化需要升级:
两个通达捕获同一个引脚,比较朴素的想法就是再定义一遍结构体参数
通道1 直连输入,上升沿触发 通道2 交叉输入(通道2相当于通道1 的交叉输入结果)下降沿触发
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; //选择通道TIM_ICInitStructure.TIM_ICFilter = 0xF; //配置滤波器参数,数值越大过滤效果越好TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; //极性选择TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //分频器TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI; //配置数据选择器TIM_ICInit(TIM3,&TIM_ICInitStructure);
简单的办法 (只支持通道1、2之间):
TIM_PWMIConfig(TIM3,&TIM_ICInitStructure); //自动把剩下的通道配置成相反的配置
2.占空比函数
uint32_t IC_GetDuty(void)
{return (TIM_GetCapture2(TIM3) + 1) * 100 /(TIM_GetCapture1(TIM3) + 1);
}
3.main变动
/***main 变动***/
OLED_ShowString(2,1,"Duty:00%");/***while 变动***/
OLED_ShowNum(2,6,IC_GetDuty(),2);
八、探究测频率性能
测频率范围
fc 1MHz Nmax = 65535 最低频率是15Hz左右
要是再想降最低频率限制,PSC加大(这里fc=72M/(PSC+1)就是1M,当fc越小,能够测量的信号频率就越小,所以你要想测频率更小的信号,就可以减小fc,也就是增大PSC值)
频率上限,就是标准频率了,再高,没法测,误差(正负一误差=1/计数值)大,提高上限就要降低PSC或者尝试测频法
相关文章:

输入捕获模式测频率PWM输入模式(PWMI)测占空比
一、概念介绍 输出比较: 比较电路输入的CNT、CCR大小关系 ,在通道引脚输出高低电平 二、*频率知识、测量方法补充 * N/fc得到标准频率的时长,也就是待测频率的周期 测频法代码实现:修改对射式红外传感器计次(上升沿…...

解锁VIP会员漫画:用Python爬虫轻松实现高清漫画下载
嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 环境使用: Python 3.10 Pycharm 模块使用: requests >>> pip install requests 数据请求模块 parsel >>> pip install parsel 数据解析模块…...

备战蓝桥杯---动态规划(入门3之子串问题)
本专题再介绍几种经典的字串问题。 这是一个两个不重叠字串和的问题,我们只要去枚举分界点c即可,我们不妨让c作为右区间的左边界,然后求[1,c)上的单个字串和并用max数组维护。对于右边,我们只要反向求单个字串和然后选左边界为c的…...

JavaScript:隐式类型转换与显式类型转换
文章目录 隐式类型转换(Implicit Type Conversion)1、字符串与数字的转换2、非布尔值到布尔值的转换3、在相等性比较中的转换4、对象到基础类型的转换5、在算术运算符中的其他转换 显式类型转换(Explicit Type Conversion)1、Numb…...

【电路笔记】-LR串联电路
LR串联电路 文章目录 LR串联电路1、概述2、示例1所有线圈、电感器、扼流圈和变压器都会在其周围产生磁场,由电感与电阻串联组成,形成 LR 串联电路。 1、概述 在本节有关电感器的第一个文章中,我们简要介绍了电感器的时间常数,指出流过电感器的电流不会瞬时变化,而是会以恒…...

Ansible 自动化运维工具的使用
目录 Ansible的简介 ansible 环境安装部署 ansible 命令行模块 command 模块 shell 模块 cron 模块 user 模块 group 模块 copy 模块 file 模块 hostname 模块 ping 模块 yum 模块 service/systemd 模块 script 模块 mount 模块 archive 模块 unarchive 模…...

亚马逊、ozon、速卖通、Lazada等跨境平台为什么评论老是被删
对于卖家而言,最难的并不是销售量,最难的是让客户在购买后能够留下一个高质量的review,毕竟现在的市场,以listing的排名为基准,以review数量多少和质量的高低来评判店铺的好坏 几乎所有的卖家都会有索评的烦恼&#x…...

手把手带你在Linux上安装带GPU加速的opencv库(C++版本)
1.安装依赖 sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install python-dev python-numpy python3-dev python3-numpy sudo apt-get install libtbb2 libtbb-dev libjpeg-dev l…...

【Linux】软件包管理器 yum | vim编辑器
前言: 软件包管理器 yum和vim编辑器讲解 文章目录 软件包管理器 yum编辑器-vim四种模式普通模式批量化注释和批量化去注释末行模式临时文件 软件包管理器 yum yum(Yellowdog Updater, Modified)是一个在基于 RPM(管理软件包的格式和工具集合&…...

vue常见问题
文章目录 data为什么是一个函数,而不是一个对象?什么情况下可以使用对象?key的作用,为什么不能用Index?render函数,h函数,和template什么关系?vue 是怎么解析template的? template会…...

ArcgisForJS基础
文章目录 0.引言1.第一个ArcgisForJS应用程序1.1.安装部署ArcgisForJS1.2.实现ArcgisForJS应用程序 2.开发与调试工具2.1.集成开发环境2.2.调试工具2.3.Firebug 0.引言 ArcGIS API for JavaScript是一款由Esri公司开发的用于创建WebGIS应用的JavaScript库。它允许开发者通过调…...

白话微机:5.解释串行接口以及一些考研面试问题
一. 前言(回顾世界观) 很久很久以前,有这样一个世界,这个世界有着现实世界一样的元素:那里的人又有一个别的名字叫做“数据”,人有0有1;人们也有住房,这些住房在这个世界叫做“存储器…...

版本控制(Git)
Fork 本课程网站的仓库 将版本历史可视化并进行探索是谁最后修改了 README.md文件?(提示:使用 git log 命令并添加合适的参数)最后一次修改_config.yml 文件中 collections: 行时的提交信息是什么?(提示&am…...

USB-C音频转接器:实现边充电边听歌的新选择 | LDR6020P
随着科技浪潮的推进,Type-C接口已逐渐成为电子设备的主流选择,以其正反随意插、高速传输和强大功能等独特优势,在日常生活中占据越来越重要的地位。而Type-C音频转接器,作为连接Type-C接口与音频设备的桥梁,正引领着音…...

C/C++ 怎么把多个静态库给整合成一个静态库?
来源:https://www.wikitechy.com/tutorials/linux/how-to-merge-two-ar-static-libraries-into-one 使用 libtool (这也是可移植性最强的方式)(但这通常要求两个子库也是 libtool 制作的) libtool --modelink cc -static -o libaz.la libab…...

OBD部署OceanBase集群-配置文件方式
前一篇文章介绍了OBD白屏可视化方式部署OceanBase集群 ,其原理是把可视化设置生成为一个配置文件,然后使用OBD命令部署集群 本篇想使用命令行加配置文件方式,只部署OceanBase和ODProxy两个组件 服务器参数配置和 oceanbase-all-in-one-*.ta…...

Flink介绍
Flink 介绍 文章目录 Flink 介绍1. 简介1.1 背景1.2 用途 2. 核心概念2.1 流(Stream)2.2 转换(Transformation)2.3 窗口(Window)2.4 状态(State) 3. 编程模型3.1 编程模型介绍3.2 程…...

vscode突然连不上服务器了,以前都可以的,并且ssh等其它方式是可以连接到服务器的
过完年回来准备开工干活,突然发现vscode连不上服务器了,奇了怪了,年前都可以的,看了一下报错,如下, 以为是服务器挂了,结果执行ssh xxxxxx 发现是可以远程连接的,看来服务器没有问题…...

【shell】Shell学习后篇
Linux 常用 Shell 文章目录 Linux 常用 ShellBanner设置字体颜色设置提示操作系统操作系统版本号系统处理器架构关闭防火墙和SELinux系统操作防火墙相关获取当前目录判断文件是否存在判断目录是否存在后台挂起静默执行判断之前的命令是否成功 Banner 设置字体颜色 RED\033[31…...

协同程序原理
一、协程的本质 //协程可以分为两个部分 //1.协程函数本体 //2.协程调度器 //协程本体就是一个能够中间暂停返回的函数 //协程调度器是Unity内部实现的,会在对应的时机帮我们继续执行协程函数 //Unity只实现了协程调度器部分 //协程的本体本质上就是 C#的一个迭代…...

怎样保证数据库和redis里的数据一致性
使用缓存更新策略:在更新数据库时,同时更新Redis中相应的数据。这可以通过编写代码来实现,在数据库更新操作完成后,同步更新Redis中对应的数据。这可以通过在代码中使用事务来保证更新的原子性,确保数据库和Redis中的数…...

探索设计模式的魅力:创建型设计模式的比较与决策
设计模式专栏:http://t.csdnimg.cn/U54zu 目录 一、设计模式概览 1.1 创建型模式 二、比较创建型设计模式 1.1 适用场景典型用例 1.2 关键要素与差异对比 1.3 结构图 三、模式选择指南 3.1 场景分析 3.2 决策流程图 四、结语 4.1 优势 4.2 考量因素 一、…...

Linux之Shell
第 1 章 Shell 概述 1)Linux 提供的 Shell 解析器有 [zhaohadoop101 ~]$ cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash /bin/tcsh /bin/csh2)bash 和 sh 的关系 [zhaohadoop101 bin]$ ll | grep bash -rwxr-xr-x. 1 root root 941880…...

nginx upstream server主动健康检测模块添加https检测功能[完整版]
目录 1 缘起1.1 功能定义2. 实现后的效果2.1 配置文件2.2 运行效果3. 代码实现3.1 配置指令3.1.1 配置指令定义:3.1.2 配置指令结构体:3.1.3 配置指令源码定义:3.2 模块的初始化3.3 添加新的健康检测类型的定义3.4 握手完成后的处理3. 5 发送http请求3.6 接收http响应3.7 连…...

django中admin页面汉化
在Django中,将admin界面汉化为中文需要进行一些配置和翻译文件的添加。下面是一个基本的步骤指南,帮助你实现Django admin的汉化: 一:安装并配置Django: 如果你还没有安装Django,首先通过pip安装它: pip…...

prometheus基于consul的服务发现
文章目录 一、基础二、安装consul下载地址启动consul访问consul 三、编写服务发现文件nodes.json四、prometheus配置consul发现修改prometheus.yml重启Prometheus 参考 一、基础 二、安装consul 下载地址 https://developer.hashicorp.com/consul/install 启动consul mkdi…...

深度学习之pytorch实现线性回归
度学习之pytorch实现线性回归 pytorch用到的函数torch.nn.Linearn()函数torch.nn.MSELoss()函数torch.optim.SGD() 代码实现结果分析 pytorch用到的函数 torch.nn.Linearn()函数 torch.nn.Linear(in_features, # 输入的神经元个数out_features, # 输出神经元个数biasTrue # 是…...

Vue3快速上手(八) toRefs和toRef的用法
顾名思义,toRef 就是将其转换为ref的一种实现。详细请看: 一、toRef 1.1 示例 <script langts setup name"toRefsAndtoRef"> // 引入reactive,toRef import { reactive, toRef } from vue // reactive包裹的数据即为响应式对象 let p…...

《数学建模》专栏导读
文章分类 相关概念入门快速建模相关混合整数线性规划(MILP)加速技巧数值问题探讨相关问题解决技巧 相关概念入门 文章相关概念离散优化模型的松弛模型线性松弛问题混合整数线性规划MILP问题中增添约束的影响约束的影响 快速建模相关 文章求解器涉及步…...

App启动优化笔记 1
app大致的启动流程。有Launcher进程,system_server进程,zygote进程,APP进程。 Launcher进程:启动activity来启动应用 system_server进程:(ams是其中的一个binder):发送一个socket消息给Zygote。 zygote进程:收到消息后,fork新的进程,---》app进程启动 APP进程:…...