STM32学习笔记(6_7)- TIM定时器的编码器接口原理

无人问津也好,技不如人也罢,都应静下心来,去做该做的事。

最近在学STM32,所以也开贴记录一下主要内容,省的过目即忘。视频教程为江科大(改名江协科技),网站jiangxiekeji.com

现在开始上难度,STM32功能最强大、结构最复杂的外设——定时器,分四期介绍。

第一期介绍最基础的定时功能理论、定时器中断和定时器内外时钟源选择的代码。

第二期介绍定时器输出比较功能的代码,输出比较功能常用产生PWM波驱动电机。

上期介绍定时器输入捕获功能代码,常用测量方波频率。

最后介绍定时器的编码器接口,更方便读取正交编码器的输出波形,常用编码电机测速。

编码器接口简介

本质上也是旋转编码器计次,只不过是通过定时器的编码器接口,来自动计次。而之前是通过触发外部中断,然后在中断函数里手动进行计次。使用编码器接口的好处就是节约钦件资源,如果使用外部中断来计次,那当电机高速旋转时,编码器每秒产生成干上万个脉冲,程序就得频繁进中断。然后进中断之后,完成的任务又只是简单的加一减一。所以,对于这种需要频繁执行,操作又比校简单的任务,一般都会设计一个硬件结构来完成,本期的编码器接口就是用来自动给编码器进行计次的电路。如果我们每隔一段时间取一下计次值,就能得到编码器旋转的速度了。

使用定时器的编码器接口,再配合编码器,就可以测量旋转速度和旋转方向,这里编码器测速一般应用在电机控制的项目上。使用PWM驱动电机,再使用编码器测量电机的速度,然后再用PID算法进行闭环控制,这是常用场景。一般电机旋转速度比较高,会使用无接触式的霍尔传感器或者光栅进行测速。

 一个编码器,它有两个输出,一个是A相,一个是B相。然后接入到STM32的定时器的编码器接口,编码器接口自动控制定时器时基单元中的CNT计数器进行自增或自减。

比如初始化之后,CNT初始值为0,然后编码器右转,CNT就++,右转产生一个脉冲, CNT就加一次。比如右转产生10个脉冲后, 停下来。那么这个过程CNT就由0自增到10,停下来;编码器左转,CNT就--,左转产生一个脉冲, CNT减一次。比如编码器再左转产生5个脉冲,那CNT就在原来10的基础上自减5,停下来。这个编码器接口,其实就相当于是一个带有方向控制的外部时钟,它同时控制着CNT的计数时钟和计数方向。这样的话,CNT的值就表示了编码器的位置。如果我们每隔一段时间取一次CNT的值,再把CNT清零,每次取出来的值就表示编码器速度。

这个编码器测速实际上就是测频法测正交脉冲的频率,只不过这个编码器接口更高级,它能根据旋转方向,不仅能自增计次,还能自减计次,是带方向的测速

一个定时器只有一个编码器接口,如果一个定时器配置成了编码器接口模式,那它就干不了其他活。我们这个C8T6芯片只有TIM1、2、3、4这4个定时器,所以最多配置四个编码器接口,而且配置完后,定时器就干不了其他活。如果编码器接口还是不够用,还可以用外部中断接编码器。

 编码器接口框图

这里编码器接口有两个输入端:分别要接到编码器的A相和B相,就是TI1FP1和TI2FP2。编码器接口两个引脚借用了输入捕获单元的前两个通道,所以编码器接口的两个引脚最终就是定时器的CH1和CH2这两个引脚。其中CH1和CH2的输入捕获滤波器和边沿检测,编码器接口也有使用。

以上是编码器接口的输入部分,那编码器接口的输出部分,其实就相当于从模式控制器,去控制CNT的计数时钟和计数方向。简单来说,这里的输出执行流程是:按照我们下面总结的那个正交编码器的表,如果出现了边沿信号并且对应另一相的状态为正转,则控制CNT自增;否则控制CNT自减。当然这时我们TIM定时器使用的72M内部时钟和在时基单元初始化时设置的计数方向,并不会使用,因为此时计数时钟和计数方向都处于编码器接口托管的状态。

编码器接口基本结构

输入捕获的前两个通道,通过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等等,根据补码的定义,65535=-1,65534=-2

工作模式

一般用第三种,在TI1和TI2上计数,这个模式精度最高,而且该模式下,正转的状态都向上计数,反转的状态都向下计数

正交编码器

就是像这样,输出的两个方波信号,相位相差90度,超前90度或者滞后90度,分别代表正转和反转。

正交编码器如何计次和分辨方向?

先看正转波形,第一个时刻,A相上升沿,对应B相此时是低电平,也就是表里的第一行。继续第二个时刻,B相上升沿,对应A相高电平,是表里的第三行。继续第三个时刻,A相下降沿,对应B相高电平,是表里的第二行。最后是,B相下降沿,对应A相低电平,是表里第四行。所以在正转的时候,我们总结了右边这个表。出现这些边沿时,对应另一相的状态是这4种。反转时状态刚好都相反。

所以我们编码器接口的设计逻辑就是:首先把A相和B相的所有边沿作为计数器的计数时钟,出现边沿信号时,就计数自增或自减。那增还是减呢?这个计数的方向由另一相的状态来确定。当出现某个边沿时,我们判断另一相的高低电平,如果对应另一相的状态出现在上面这个表里,那就是正转,计数自增;反之出现在下面表里就是反转,计数自减。这样就能实现编码器接口功能,这也是STM32定时器编码器接口的执行逻辑。

实例(TI1和TI2均不反相)

比如你接一个编码器,发现它数据的加减方向反了,你想要正转的方向,结果它自减了,这时,就可以调整一下极性,把任意一个引脚(TI1或TI2)反相,就能反转计数方向了或者直接把A、B相引脚交换。

这个图展示了,什么时候向上计数,什么时候向下计数,以及正交编码器抗噪声的原理。

旋转编码器简介

第一个是只有一个光栅加红外对管的编码器,这只能输出一个方波信号,并不是正交编码器,只能测速度。

第二、三个就是套件使用的编码器,里面靠两个金属触点交替导通。可以输出A相和B相两个正交信号,是正交编码器。这里有4个引脚,上面两个是供电的正极和负极,下面两个是A相和B相的输出。

第四个图是电机后面自带的一个编码器,电机旋转带动中间的磁铁旋转,两个霍尔传感器90度放置,最终输出A相和B相两个正交信号,是正交编码器。下面一般都六根线,最左和最右是直接接到电机的,然后是靠里一些的两根是编码器电源,最中间的两根就是A相和B相的输出了。

最后一个图是单独的编码器元件,一般都是正交编码器,当然也有的不是,需看商品说明,一般有六根线,两个是编码器电源,两个是A、B相,一般还有个编码器0位置的输出,也就是Z相。0位置就是编码器每转到一个固定位置时,输出一个脉冲。一般应用于位置测量,校淮0位置用的。最后还有一个NC脚。

编码器接口程序测速现象

 在这里接了一个旋转编码器模块,这个代码和之前我们写的旋转编码器计次的代码,实现的功能基本都是一样的。OLED显示的是Speed速度,向右慢速旋转,数值为正,计次比较小。向右快速旋转,计次就会增大;然后向左慢速旋转,数值为负,计次比较小;然后停下来,速度就是0。

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

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

相关文章

【Java程序设计】【C00374】基于(JavaWeb)Springboot的社区疫情管理系统(有论文)

TOC 博主介绍:java高级开发,从事互联网行业六年,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,博客中有上百套程序可供参考,欢迎共同交流学习。 项目简介 项目获取 🍅文末点击卡片…

教学软件哪个好?这个一站式智慧教学系统值得推荐!

过去培训机构老师授课的场景主要在线下,可以使用大屏幕 PPT 来完成培训的交付,而现在随着数字化基础设施的完善,同时为了尽可能覆盖更多的人,依赖线下的培训场景也逐步转移到线上来完成,因此也对在线教学工具产生了需…

东方博宜 1521. 计算分数加减表达式的值

东方博宜 1521. 计算分数加减表达式的值 #include<iostream> #include<iomanip> using namespace std; int main() {double n ;cin >> n ;double sum ;sum 0.0 ;double j ;j 1.0 ;for (int i 1 ; i < n ; i){sum 1.0 / i * j ; j * -1 ;}cout <…

计算机网络01-20

计算机网络01-20 以下是本文参考的资料 欢迎大家查收原版 本版本仅作个人笔记使用1、OSI 的七层模型分别是&#xff1f;各自的功能是什么&#xff1f;2、说一下一次完整的HTTP请求过程包括哪些内容&#xff1f;孤单小弟 —— HTTP真实地址查询 —— DNS指南好帮手 —— 协议栈可…

Docker进阶:Docker Swarm —弹性伸缩调整服务的副本数量

Docker进阶&#xff1a;Docker Swarm —弹性伸缩调整服务的副本数量 1、 创建一个Nginx服务&#xff08;Manager节点&#xff09;2、查看服务状态&#xff08;Manager节点&#xff09;3、测试访问&#xff08;Worker节点&#xff09;4、查看服务日志&#xff08;Manager节点&am…

详解智慧路灯杆网关的集中供电能力

智慧路灯杆网关是智慧杆物联网系统中不可或缺的设备。智慧杆网关不仅可以作为杆载设备与云平台、设备与设备之间的桥梁&#xff0c;促进数据的无缝传输&#xff0c;而且还能提供高效的能源管理和供电功能。 BMG8200系列交流型智慧路灯杆网关就集成了强大的供电能力&#xff0c;…

浅析扩散模型与图像生成【应用篇】(十三)——PITI

13. Pretraining is All You Need for Image-to-Image Translation 该文提出一种基于预训练扩散模型的图像转换方法&#xff0c;称为PITI。其思想并不复杂&#xff0c;就是借鉴现有视觉和NLP领域中常见的预训练方法&#xff0c;考虑预先在一个大规模的任务无关数据集上对扩散模…

nginx学习记录-反向代理

1. 反向代理 一个简单的反向代理示意图如下&#xff1a; 我们的PC需要访问内网资源时&#xff0c;网关路由不直接将请求转发给内网的应用服务器&#xff0c;而是通过nginx服务器进行代理转发&#xff0c;转发到应用服务器上&#xff0c;应用服务器响应请求后会将响应数据再通过…

AJAX~

概念:AJAX(Asynchronous JavaScript And XML):异步的JavaScript和XML AJAX作用&#xff1a; 1.与服务器进行数据交换:通过AJAX可以给服务器发送请求&#xff0c;并获取服务器响应的数据 使用了AJAX和服务器进行通信&#xff0c;就可以使用HTMLAJAX来替换JSP页面了 2&#xf…

【MATLAB源码-第170期】基于matlab的BP神经网络股票价格预测GUI界面附带详细文档说明。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 基于BP神经网络的股票价格预测是一种利用人工神经网络中的反向传播&#xff08;Backpropagation&#xff0c;简称BP&#xff09;算法来预测股票市场价格变化的技术。这种方法通过模拟人脑的处理方式&#xff0c;尝试捕捉股票…

欧美用户真实反馈!他们为什么选择爱可声助听器?

在竞争激烈的助听器市场上&#xff0c;爱可声助听器在欧美地区赢得了广泛的认可和好评。为什么越来越多的欧美用户选择爱可声助听器呢&#xff1f; 约翰&#xff0c;纽约的退休音乐教师 约翰是一位热爱音乐的退休音乐教师&#xff0c;他的一生都与音乐相伴&#xff0c;从年轻…

常用的AD规则设置

目录 规则编辑器&#xff1a; 间距规则&#xff1a; 线宽规则&#xff1a; 过孔规则&#xff1a; 铺铜设置&#xff1a; 生成制造过孔&#xff1a; 过孔之间间距&#xff1a; 最小阻焊层间距&#xff1a; 丝印到阻焊的距离&#xff1a; 丝印到丝印距离&#xff1a; 走…

01使用调试工具

文章目录 前言一、用openocd打开单片机二、利用4444端口向单片机写入hex文件三、利用3333端口和gdb进行调试四、之前我出的问题总结 前言 之前写了一篇关于在linux下搭建stm32标准库的文章后&#xff0c;有一些小伙伴们还是出现了一些奇奇怪怪的错误&#xff0c;这一篇文章就是…

JDK21|借鉴了近十种语言,String终于变好用了

作者:鱼仔 博客首页: https://codeease.top 公众号:Java鱼仔 前言 要想看官方对于JDK21的更新说明&#xff0c;可以直接跳转到下面这个官方网站中 官网地址为&#xff1a;https://openjdk.org/projects/jdk/21/ JDK21是最新的LTS版本&#xff0c;里面添加了不少新的特性&…

YOLOv9改进策略:IoU优化 | Wasserstein Distance Loss,助力小目标涨点

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文独家改进&#xff1a;基于Wasserstein距离的小目标检测评估方法 Wasserstein Distance Loss | 亲测在多个数据集能够实现涨点&#xff0c;对小目标、遮挡物性能提升明显 &#x1f4a1;&#x1f4a1;&#x1f4a1;MS COCO和PASC…

Linux(CentOS)/Windows-C++ 云备份项目(服务器网络通信模块,业务处理模块设计,断点续传设计)

此模块将网络通信模块和业务处理模块进行了合并 网络通信通过httplib库搭建完成业务处理&#xff1a; 文件上传请求&#xff1a;备份客户端上传的文件&#xff0c;响应上传成功客户端列表请求&#xff1a;客户端请求备份文件的请求页面&#xff0c;服务器响应文件下载请求&…

【王道训练营】第3题 判断某个年份是不是闰年,如果是闰年,请输出“yes”,否则请输出“no”

文章目录 引言闰年初始代码代码改进改进1&#xff1a;添加提示信息改进2&#xff1a;代码格式改进3&#xff1a;变量命名 其他实现方式使用if-else语句使用函数使用三元操作符 结论 引言 在公历中&#xff0c;闰年的规则如下&#xff1a;如果某个年份能被4整除但不能被100整除…

基于SpringBoot的“原创歌曲分享平台”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“原创歌曲分享平台”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 平台功能结构图 平台首页界面图 用户注册界面…

nvic优先级溢出

nvic的抢占优先级大于当前的配置群组所要求的最大上限&#xff0c;则真正优先级为数值的溢出部分&#xff1b;如果溢出部分为0则循环为最大数据&#xff1a; 如上图所示&#xff1a;中断分组为2&#xff1a; 因此优先级因为0--3 TICK_INT_PRIORITY等于0xf即为15&#xff1b;与3…

【Java多线程】1——多线程知识回顾

1 多线程知识回顾 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记仓库&#x1f449;https://github.com/A-BigTree/tree-learning-notes 个人主页&#x1f449;https://www.abigtree.top ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star…