stm32定时器输入捕获模式

频率测量

频率测量有两种方法

  • 测频法:在闸门时间T内,对上升沿或下降沿计次,得到N,则评率fx=N/T
  • 测周法:两个上升沿内,以标准频率fc计次得到N,则频率fx= fc/N
  • 中界频率:测频法和测周法误差相等的点fm=√(fc/T),fx大于fm选用测频法更准确。

定时器输入捕获测频原理

在说原理前需要先讲一下定时器的主从模式
主模式则是设置定时器输出时上升沿/下降沿触发自动执行的操作
从模式则是设置定时器输入时上升沿/下降沿触发自动执行的操作
下面我们用到的从模式是复位模式,进入中断定时器的计数器会自动复位清零

在这里插入图片描述
这是定时器运行框图,输入捕获只有看红色框出来的部分就可以了。可能有点抽象,接下来我来翻译一下。

首先是第一框中的TI1代表的是定时器x的通道1GPIO引脚输入的波频,TI2、3、4同理

然后看到是第二个框中第一条通道的TI1FP1和TI1FP2,分别代表的是,TI1这个波频输入哪一个通道处理,TI1FP1则使用定时器通道1的资源对TI1这个波频进行捕获上升沿/下降沿,TI1FP2则使用的是定时器通道2的资源,TI2FP1则代表TI2这个波频使用定时器通道1的资源。

然后就到了处理波频的步骤了,在我们第一个上升沿到来时,定时器的CNT寄存器开始计时,然后下一个上升沿到来,CNT里的值传入CCR输入/比较寄存器,接下来从模式将CNT寄存器自动清零。我们将CCR里的值取出就可以知道一个周期计时值,通过该值大小知道该波频的频率高低。

整个流程如下图
在这里插入图片描述

定时器输入捕获测量占空比(PWMI模式)

上文提到,定时器通道1的引脚输入的波频可以分为TI1FP1和TI2FP2到两个通道的计时器处理,那么我们将一段波频分别给两个定时器通道处理,一个捕获上升沿,一个捕获下降沿,在第二次捕获上升沿的中断进入时,用捕获上升沿的CCR1获取的值减去捕获下降沿的CCR2的值就可以得到高电平的时间,计算即可得到占空比。

如下图所示
在这里插入图片描述
具体步骤:
第一次捕获到上升沿:CNT开始计时
第一次捕获到下降沿:CCR2获取CNT的值,得到高电平时间
第二次捕获到上升沿:CCR1获取CNT的值,进入从模式清除CNT的值,得到周期

那么就可以计算出占空比了。

定时器编码器模式

stm32的定时器拥有编码器模式,使我们可以使用编码器,计算电机转速

AB相编码器

这种编码器可以理解为编码器会输出两个相差90°相位差的波频,而通过A相在前还是B相在前,判断电机正转反转。
在这里插入图片描述
该模式的操作原理比较简单
两波频进入编码器接口后,判断相位差是哪个在前,如果为A相在前就将计数器加1,负责计数器减1。

使用定时器编码模式的软件代码

#include "stm32f10x.h"
#include "hal_TIM.h"/****************************************************************************
*@*名称 : hal_TIM_Encoder_Config
*@*功能 : 初始化定时器2的编码器模式
*@*形参 : 无
*@*返回值 : 无
****************************************************************************/
static void hal_TIM_Encoder_Config(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMx, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;									//上拉输入GPIO_InitStructure.GPIO_Pin = TIM_ENCODER_A_PIN | TIM_ENCODER_B_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);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 = 1 - 1;		//PSC	预分频器		//使用系统时钟作为定时器的编码器模式的时钟,实现 1 至 65536 分频TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIMx, &TIM_TimeBaseInitStructure);TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICStructInit(&TIM_ICInitStructure);												//因为结构体没有定义完整,但担心有不知名错误,先初始化结构体TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;TIM_ICInitStructure.TIM_ICFilter = 0xF;												//滤波次数7次TIM_ICInit(TIMx, &TIM_ICInitStructure);TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;TIM_ICInitStructure.TIM_ICFilter = 0xF;TIM_ICInit(TIMx, &TIM_ICInitStructure);TIM_EncoderInterfaceConfig(TIMx, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);TIM_Cmd(TIMx, ENABLE);
}/****************************************************************************
*@*名称 : hal_TIM_Encoder_Init
*@*功能 : 初始化定时器2的编码器模式
*@*形参 : 无
*@*返回值 : 无
****************************************************************************/
void hal_TIM_Encoder_Init(void)
{hal_TIM_Encoder_Config();
}/****************************************************************************
*@*名称 : hal_TIM_Encoder_Get
*@*功能 : 获取定时器编码器模式计数的CNT(TIM_EncoderMode_TI12通道12都计数,一个周期记4次)
*@*形参 : 无
*@*返回值 : CNT计数值
****************************************************************************/
int16_t hal_TIM_Encoder_Get(void)
{int16_t Temp;Temp = TIM_GetCounter(TIMx);return Temp;
}

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

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

相关文章

Spark的通用运行流程与Spark YARN Cluster 模式的运行流程

Spark的通用运行流程 集群启动后Worker节点会向Master节点心跳汇报资源Client向Driver提交APP,根据不同的运行模式在不同的地方创建Driver。Driver以粗粒度的方式向Master注册应用并申请资源(在Application执行之前,将所有的资源申请完毕&…

助力企业前行——ScalaSpark最佳实践课程

时间飞逝,转眼间我们的Scala&Spark培训课程已经圆满结束!在这段精彩的学习旅程中,你们展现了坚韧、决心和追求卓越的品质。 scala(Scalable Language)是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的…

【机器学习】On the Identifiability of Nonlinear ICA: Sparsity and Beyond

前言 本文是对On the Identifiability of Nonlinear ICA: Sparsity and Beyond (NIPS 2022)中两个结构稀疏假设的总结。原文链接在Reference中。 什么是ICA(Independent component analysis)? 独立成分分析简单来说,就是给定很多的样本X,通…

Springboot-热部署-IDEA2023

方式一&#xff1a;jrebel 方式二&#xff1a; 1、导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <…

C++ DAY08 异常

概念 异常事件&#xff08;如&#xff1a;除 0 溢出&#xff0c;数组下标越界&#xff0c;所要读取的文件不存在 , 空指针&#xff0c;内存不足 等等&#xff09; 在 C 语言对错误的处理是两种方法&#xff1a; 一是使用整型的返回值标识错误&#xff1b; 二是使用 errn…

自动解决IP冲突的问题 利用批处理更改末位IP循环+1直到网络畅通为止 解放双手 事半功倍

好久没出来写点什么了&#xff0c;难道今天有点时间&#xff0c;顺便把这两天碰到的问题出个解决方法吧。 这几天去客户那儿解决网络问题&#xff0c;因为客户的网络是固定的静态IP&#xff0c;因为没做MAC绑定&#xff0c;IP固定在本地电脑上&#xff0c;只要上不了网&#xf…

PDF转Word,1行Python代码就够了,免费用

大家好&#xff0c;这里是程序员晚枫。 今年十一假期没出去旅游&#xff0c;在家里更新一套原创课程&#xff0c;&#x1f449;给小白的《50讲Python自动化办公》。 所有功能&#xff0c;都只需要1行代码&#xff0c;非常适合非程序员入门Python使用。 目前全网播放量直逼100…

RK3588平台开发系列讲解(嵌入式AI篇)RKNPU详解

文章目录 一、CPU、GPU、FPGA和NPU介绍二、CPU、GPU、FPGA和NPU区别三、NPU 应用四、RKNPU沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇将给大家介绍什么是RKNPU。 一、CPU、GPU、FPGA和NPU介绍 二、CPU、GPU、FPGA和NPU区别 若考虑成本、功耗、计算能力以及体…

探秘开发app与小程序:一场技术与创新的博弈

app与小程序&#xff1a;一场技术与创新的博弈随着科技的飞速发展&#xff0c;移动应用程序已经成为我们日常生活中不可或缺的一部分。在这个充满竞争的时代&#xff0c;企业纷纷投身于开发各类移动应用&#xff0c;以期在市场中占据一席之地。然而&#xff0c;面对多样化的应用…

PC访问华为昇腾开发板的摸索过程

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 最近要折腾华为昇腾开发板&#xff08;官方名称叫&#xff1a;Atlas 200I DK&#xff09;。先是按照官方教程折腾&#xff1a;Atlas200DK环境部署。我发现…

Spark---转换算子、行动算子、持久化算子

一、转换算子和行动算子 1、Transformations转换算子 1&#xff09;、概念 Transformations类算子是一类算子&#xff08;函数&#xff09;叫做转换算子&#xff0c;如map、flatMap、reduceByKey等。Transformations算子是延迟执行&#xff0c;也叫懒加载执行。 2)、Transf…

Jina AI 的 8K 向量模型上线 AWS Marketplace,支持本地部署!

在当前多模态 AI 和大模型技术风头正劲的背景下&#xff0c;Jina AI 始终领跑于创新前沿&#xff0c;技术领先。2023 年 10 月 30 日&#xff0c;Jina AI 隆重推出 jina-embeddings-v2&#xff0c;这是全球首款支持 8192 输入长度的开源向量大模型&#xff0c;其性能媲美 OpenA…

汇编-PROC定义子过程(函数)

过程定义 过程用PROC和ENDP伪指令来声明&#xff0c; 并且必须为其分配一个名字(有效的标识符) 。目前为止&#xff0c; 我们所有编写的程序都包含了一个main过程&#xff0c; 例如&#xff1a; 当要创建的过程不是程序的启动过程时&#xff0c; 就用RET指令来结束它。RET强制…

Bean依赖注入注解开发

value Value("xfy")private String userName;private String userName;Value("xiao")public void setUserName(String userName) {this.userName userName;} Autowired // 根据类型进行注入 如果同一类型的Bean有多个&#xff0c;尝试根基名字进行二次…

AIGC,ChatGPT AI绘画 Midjourney 注册流程详细步骤

AI 绘画,Midjourney完成高清图片绘制,轻松掌握AI工具。 前期准备: ① 一个能使用的谷歌账号 ② 可以访问外网 Midjourney注册 1.进入midjourney官网https://www.midjourney.com 点击左下角”Join the Beta”,就可以注册,第一次使用的小伙伴会弹出提示,只需要点击Acc…

2019年12月 Scratch(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 怎样修改图章的颜色? A:只需要一个数字来设置颜色 B:设置RGB的值 C:在画笔中设置颜色、饱和度、亮度 D:在外观中设置或修改角色颜色特效 答案:D 在外观中设置或修改角色颜色特…

【深度学习】脸部修复,CodeFormer,论文,实战

代码&#xff1a; https://github.com/sczhou/CodeFormer 论文&#xff1a;https://arxiv.org/abs/2206.11253 Towards Robust Blind Face Restoration with Codebook Lookup Transformer 文章目录 论文摘要1 引言2 相关工作**4 实验****4.1 数据集****4.2 实验设置和指标***…

[论文笔记] Scaling Laws for Neural Language Models

概览: 一、总结 计算量、数据集大小、模型参数量大小的幂律 与 训练损失呈现 线性关系。 三个参数同时放大时,如何得到最佳的性能? 更大的模型 需要 更少的样本 就能达到相同的效果。 </

笔记本外接显示器的一些基本操作

1>&#xff0c;安装问题直接问客服&#xff0c;正常情况是将显示屏接上电源&#xff0c;然后用先将显示屏和笔记本的HDMI接口连接即可。 按下组合键 win p ,选择 “复制”。 2>&#xff0c;接上显示屏后&#xff0c;原笔记本无声音&#xff1f; 1、找到笔记本电脑右下…

Doris 建表示例(七)

建表语法 使用 CREATE TABLE 命令建立一个表(Table)。更多详细参数可以查看&#xff1a; HELP CREATE TABLE; 建表语法&#xff1a; CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [database.]table_name(column_definition1[, column_definition2, ...][, index_definition1[, i…