STM32 TIM(四)编码器接口
STM32 TIM(四)编码器接口
编码器接口简介
-
Encoder Interface 编码器接口
-
编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度,
- 正交编码器,输出的两个方波信号,相位相差90度,超前90度或者滞后90度,分别代表正转和反转。
- 编码器接口工作流程,接收正交信号,自动执行CNT的自增或自减
- 最终的实验现象,编码器有两个输出,一个是A相,一个是B相,然后接入到STM32,定时器的编码器接口,编码器的接口自动控制定时器时基单元中的CNT计数器,进行自增或自减。比如初始化之后,CNT初始值为0,然后编码器右转,CNT就++,右转产生一个脉冲,CNT就加一次,比如右转产生10个脉冲后,停下来,那么这个过程CNT就由0自增到10,停下来,编码器左转,CNT就–,左转产生一个脉冲,CNT就自减一次, 比如编码器再左转产生5个脉冲,那CNT就在原来10的基础上自减5,停下来。
- 编码器接口,其实就相当于是一个带有方向控制的外部时钟,同时控制着CNT的计数时钟和计数方向,这样CNT的值就表示了编码器的位置。如果我们每隔一段时间取一次编码器的值,再把CNT清零,那么每次取出来的值就表示了编码器的速度。
- 编码器测速实际上就是测频法测正交脉冲的频率,CNT计次,然后每隔一段时间取一次计次,这就是测频法的思路。编码器计次能根据旋转方向,不仅能自增计次还能自减计次,是一个带方向的测速。
-
每个高级定时器和通用定时器都拥有1个编码器接口
-
两个输入引脚借用了输入捕获的通道1和通道2
- 编码器的两个输入引脚,就是每个定时器的CH1和CH2引脚,CH3和CH4不能接编码器。
正交编码器
- 正交编码器一般可以测量位置,或者带有方向的速度值,一般有两个信号输出引脚,一个是A相,一个是B相。
- 当编码器的旋转轴转动时,A相和B相就会输出这样的方波信号,转的越快,方波信号的频率就越高,所以方波的频率就代表了速度,去除任意一相的信号来测频率,就能知道旋转速度了,但是只有一相的信号,无法测量旋转方向,因为无论是正传还是反转,都是这样的方波信号。想要测量方向还必须要有另一根线的辅助。
- 正转时,A相提前B相90度,反转时,A相滞后B相90度,当然正转时是A相提前还是A相滞后,并不是绝对的,这只是一个极性问题,毕竟正转和反转的定义也是相对的,总之就是朝一个方向转是A相提前,另一个方向是A相滞后。
- 正交信号精度更高,A、B相都可以计次,相当于计次频率提高了一倍,其次,正交信号可以抗噪声,因为正交信号,两个信号必须是交替跳变的,所以可以设计一个抗噪声电路,如果一个信号不变,另一个信号连续跳变,也就是产生了噪声,那这时计次值是不会变化的。
- 编码器接口的设计逻辑
- 首先把A相和B相的所有边沿作为计数器的计数时钟,出现边沿信号时,就计数自增或自减,具体是自增还是自减,有另一相的状态来决定。
- 当出现某个边沿时,我们判断另一相的高低电平,从而判断是正转还是反转,继而确定是自增还是自减。
边沿 | 另一相状态 |
---|---|
A相↑ | B相低电平 |
A相↓ | B相高电平 |
B相↑ | A相高电平 |
B相↓ | A相低电平 |
边沿 | 另一相状态 |
---|---|
A相↑ | B相高电平 |
A相↓ | B相低电平 |
B相↑ | A相低电平 |
B相↓ | A相高电平 |
编码器接口框图
-
编码器接口有两个输入端TI1FP1和TI2FP2,分别要接到编码器的A相和B相,可以看出,编码器接口的两个引脚,借用了输入捕获单元的前两个通道,所以最终编码器的输入引脚,就是定时器的CH1和CH2这两个引脚。
- 信号的通路是,CH1经过输入滤波器和边沿检测电路,通过TF1FP1,通向编码器接口;CH2经过输入滤波器和边沿检测电路,通过TF2FP2,通向编码器接口。CH3和CH4和编码器接口无关。后面的是否交叉、预分频器和CCR寄存器与编码器接口无关。
-
编码器接口的输出部分,相当于从模式控制器,去控制CNT的计数时钟和计数方向,例如,如果出现了边沿信号,并且对应另一相的状态为正转,则控制CNT自增,否则控制CNT自减。
- 在这里,之前在使用的72MHz内部时钟和我们在时基单元初始化时设置的计数方向并不会使用,因为此时计数时钟和计数方向都处于编码器接口托管的状态,计数器的自增和自减,受编码器控制。
编码器接口基本结构
- 输入捕获的前两个通道,通过GPIO口接入编码器的A、B相。
- 然后通过滤波器和边沿极性检测,产生TI1FP1和TI2FP2,通向编码器接口。
- 编码器接口通过预分频器控制CNT计数器的时钟,同时,编码器接口还根据编码器的旋转方向,控制CNT的计数方向,编码器正转时,CNT自增,编码器反转时,CNT自减
- 这里ARR是有效的,一般设置ARR为65535,最大量程。这样,利用补码的特性,很容易得到负数,比如CNT初始为0,正转,CNT自增,0,1,2,3,4,5,6,7……,反转,CNT自减,0下一个数就是65535,接着是65534,65533,可以把这个16位的无符号数转换为16位的有符号数,根据补码的定义,65535就对应-1,65534就对应-2,65533就对应-3……这样就可以直接得到负数,十分方便。
工作模式
-
TI1FP1和TI2FP2界的就是编码器的A、B相,在A相和B相的上升沿或者下降沿触发计数,具体是向上计数还是向下计数,取决于边沿信号发生的这一时刻,另一相的电平状态,也就是相对信号的电平,TI1FP1对应TI2,TI2FP2对应TI1,就是另一相电平的意思。
-
边沿 另一相状态 A相↑ B相低电平 A相↓ B相高电平 B相↑ A相高电平 B相↓ A相低电平 - 例如,假设TI1接A相,TI2接B相(在TI1和TI2上计数),当A、B相为上表这4个状态时,就是正转,计数器需要自增,上表第一个状态,A相上升沿,B相低电平,对应下表就是TI1FP1上升沿,TI2FP2低电平,执行的是向上计数;上表第二个状态,
A相下降沿,B相高电平,对应下表就是TIFP1下降沿,TI2FP2高电平,执行的是向上计数,以此类推。
- 例如,假设TI1接A相,TI2接B相(在TI1和TI2上计数),当A、B相为上表这4个状态时,就是正转,计数器需要自增,上表第一个状态,A相上升沿,B相低电平,对应下表就是TI1FP1上升沿,TI2FP2低电平,执行的是向上计数;上表第二个状态,
实例(均不反相)
- 第一个状态,TI1上升沿,TI2低电平,由表可知,TI1FP1上升沿,TI2FP2低电平,对应向上计数,所以计数器变高了一级,接着后面的这几个状态,由查表可知,都是向上计数,正转。
- 接着后面的毛刺,展示的就是正交编码器抗噪声的原理了,在这里TI2没有变化,TI1却跳变了多次,不符合正交编码器的信号规律,正交信号,两个信号交替变化,这里TI2没变化,但是TI1变化了多次,显然是一个毛刺信号,二通过下面这张表的逻辑,就可以不计数,把这种噪声过滤掉。
- 比如毛刺部分开始,TI1上升沿,TI2低电平,查表得向上计数,自增;下一个状态,TI1下降沿,TI2还是低电平,查表得向下计数,自减;然后继续TI1上升沿,TI2低电平,自增,继续,TI1下降沿,TI2低电平,自减。所以如果出现了一个引脚不变,另一个引脚连续跳变的毛刺信号,计数器就会+,-,+,-,来回摆动,最终计数值还是原来那个数,并不受毛刺噪声的影响,这就是正交编码器抗噪声的原理。
- 接着是反转的波形,都是向下计数,计数值下降,然后TI1不动,TI2多次跳变,计数值也是来回摆动,过滤噪声,最后是正转,向上计数。
实例(TI1反相)
-
TI1和TI2都会经过边沿检测和极性选择的部分,在输入捕获模式下,这个极性选择是选择上升沿有效还是下降沿有效的,但是在编码器接口模式下,显然上升沿和下降沿都是有效的,上升沿和下降沿都需要计次。
- 所以在编码器接口模式下,不再是边沿的极性选择,而是高低电平的极性选择,如果我们选择上升沿的参数,就是信号直通过来,高低电平极性不反转,如果选择下降沿的参数,就是信号通过一个非门过来,高低电平极性反转,所以就会有两个控制极性的参数,选择要不要加一个非门,反转一下极性。
-
把TI1高低电平反转一下,就是这里的TI1反相,需要先将TI1高低电平取反,才是反相后实际给编码器接口的电平,然后在查表,第一个状态,应该是TI1下降沿,TI2低电平,查表得到是向下计数,与下图对应。后续也一一对应。
-
TI1反相的作用,比如你接一个编码器,发现它数据的加减方向反了,想要正转的方向,结果却自减了,想要反转的方向,结果却自增了,这时就可以调整一下极性,把任意一个引脚反相,就能反转计数方向了,当然也可以通过直接把A、B相两个引脚换一下。
相关文章:

STM32 TIM(四)编码器接口
STM32 TIM(四)编码器接口 编码器接口简介 Encoder Interface 编码器接口 编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的…...
力扣第56题 合并区间 c++ 贪心
题目 56. 合并区间 中等 相关标签 数组 排序 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例…...
php 日期
其中关于周的起止,使用date("N"),确保每周周一为起始,避免周日时出现作为新一周起始的情况 //获取上个月第一天 echo "上个月开始时间:".date(Y-m-01 00:00:00,strtotime(-1 month))."\r\n\r\n"; …...
食物链解读
[NOI2001] 食物链 题目描述 动物王国中有三类动物 A , B , C A,B,C A,B,C,这三类动物的食物链构成了有趣的环形。 A A A 吃 B B B, B B B 吃 C C C, C C C 吃 A A A。 现有 N N N 个动物,以 1 ∼ N 1 \sim N 1∼N 编号。…...

Day10配置文件日志多线程
配置文件 在企业开发过程中,我们习惯把一些需要灵活配置的数据放在一些文本文件中,而不是在Java代码写死 我们把这种存放程序配置信息的文件,统称为配置文件 properties 是一个Map集合(键值对集合),但是我…...

leetcode:1154. 一年中的第几天(python3解法)
难度:简单 给你一个字符串 date ,按 YYYY-MM-DD 格式表示一个 现行公元纪年法 日期。返回该日期是当年的第几天。 示例 1: 输入:date "2019-01-09" 输出:9 解释:给定日期是2019年的第九天。 示例…...

竞赛 深度学习图像修复算法 - opencv python 机器视觉
文章目录 0 前言2 什么是图像内容填充修复3 原理分析3.1 第一步:将图像理解为一个概率分布的样本3.2 补全图像 3.3 快速生成假图像3.4 生成对抗网络(Generative Adversarial Net, GAN) 的架构3.5 使用G(z)生成伪图像 4 在Tensorflow上构建DCGANs最后 0 前言 &#…...
flutter升级+生成drift文件
1. flutter升级 可以安装fvm进行flutter version manager FVM 安装笔记 - 掘金 (juejin.cn) 使用flutter upgrade, 但是没有效果, 可能需要到我的电脑中,更改高级系统设置;改变/增加环境变量;用来加上flutter官网获取信息的内…...

[AUTOSAR][诊断管理][ECU][$34] 下载请求
文章目录 一、简介二、服务请求报文定义肯定响应支持的NRC三、示例代码34_req_dowload.c一、简介 RequestDownload(0x34)—— 下载请求 这个服务主要是用来给ECU下载数据的,最常见的应用就是在bootloader中,程序下载工具会发起下载请求,以完成ECU程序的升级。 二、服务…...
C 标准库 - <errno.h>和<float.h>详解
目录 简介 常见库宏 简介 常见库宏 <errno.h> 简介 <errno.h>头文件定义了一个名为errno的全局变量,用于表示最近发生的错误代码。errno是一个整数变量,它的值通常是一个非零的错误代码,用于指示发生了什么类型的错误。也可以…...
对于如何学习的一点思考
目录 1、学习遇到的问题 2、问题分析 3、解决思路 1、学习遇到的问题 我们经常在学习一个知识时,经常会遇到知识点凌乱、读书效率低、缺乏长期记忆等问题,主要体现在: 知识点凌乱:花时间学习了很多技术点,但是由于…...
Ensemble Methods集成学习大比拼:性能、应用场景和可视化对比总结
集成学习(Ensemble Learning)是一种机器学习范式,其中多个模型(通常称为“弱学习器”)被训练以解决相同的问题,并且通过某种方式结合它们的预测以提高整体性能。这种方法的核心思想是,多个模型比单一模型更能准确地预测未知数据。在本文中,我们将探讨多种集成学习算法,…...

【2024秋招】2023-9-16 贝壳后端开发二面
1 自我介绍 2 秒杀系统 2.1 超卖怎么解决 3 redis 3.1 过期策略 3.2 过期算法 4 kafka 4.1 说一说你对kafka的了解 4.2 如何保证事务性消息 4.3 如何保证消息不丢失 4.4 消息队列的两种通信方式 点对点模式 如上图所示,点对点模式通常是基于拉取或者轮询…...

SpringCloud 微服务全栈体系(七)
第九章 Docker 一、什么是 Docker 微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署,环境不一定一致…...

SAP ABAP 报表输出成 excel 统计图形 (RFC : GFW_PRES_SHOW_MULT)
SAP 预设了一个类型组 GFW ,做简单的excel图形输出 话不多说,直接上代码: *&---------------------------------------------------------------------* *& Report ZCYCLE057 *&----------------------------------------------…...
微信小程序如何获取地理位置
在微信小程序中,可以通过以下步骤获取用户的地理位置: 在小程序的app.json文件中配置权限: json "permission": {"scope.userLocation": {"desc": "你的位置信息将用于获取附近的服务"} }这样配置后…...

计算机网络相关硬件介绍
计算机相关硬件 计算机由运算器、控制器、存储器、输入设备和输出设备等五个逻辑计算机硬件部件组成。 一、中央处理器(CPU)(运算器、控制器) (1)运算器 运算器是对数据进行加工处理的部件ÿ…...

Megatron-LM GPT 源码分析(三) Pipeline Parallel分析
引言 本文接着上一篇【Megatron-LM GPT 源码分析(二) Sequence Parallel分析】,基于开源代码 GitHub - NVIDIA/Megatron-LM: Ongoing research training transformer models at scale ,通过GPT的模型运行示例,从三个维…...

Python---使用turtle模块+for循环绘制五角星---利用turtle(海龟)模块
首先了解涉及的新词汇,编程外国人发明的,所以大部分是和他们语言相关,了解对应意思,可以更好理解掌握。 import 英 /ˈɪmpɔːt/ n. 进口,进口商品;输入,引进;重要性;…...
Python的比较运算符查询表
据个人的编程开发经验,Python的比较运算符最常于条件判断,而条件判断是python编程中最常用的语法之一,与for或while的循环一样,功能十分强大! 在机器学习当中,或深度学习当中,在运用算法对统计…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...

C# winform教程(二)----checkbox
一、作用 提供一个用户选择或者不选的状态,这是一个可以多选的控件。 二、属性 其实功能大差不差,除了特殊的几个外,与button基本相同,所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...

负载均衡器》》LVS、Nginx、HAproxy 区别
虚拟主机 先4,后7...

路由基础-路由表
本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中,往往存在多个不同的IP网段,数据在不同的IP网段之间交互是需要借助三层设备的,这些设备具备路由能力,能够实现数据的跨网段转发。 路由是数据通信网络中最基…...
Qt Quick Controls模块功能及架构
Qt Quick Controls是Qt Quick的一个附加模块,提供了一套用于构建完整用户界面的UI控件。在Qt 6.0中,这个模块经历了重大重构和改进。 一、主要功能和特点 1. 架构重构 完全重写了底层架构,与Qt Quick更紧密集成 移除了对Qt Widgets的依赖&…...