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的循环一样,功能十分强大! 在机器学习当中,或深度学习当中,在运用算法对统计…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
