【STM32编码器】【STM32】

提示:一般情况下我们会设计一个硬件电路模块来自动完成简单重复而高频的计算

文章目录

  • 一、为什么通常情况下不使用外部中断来对编码器的脉冲进行计数?
  • 二、编码器速度测量程序设计思路
  • 三、正交编码器
  • 四、初始化流程
  • 五、STM32正交编码器输入捕获模式配置示例
  • 总结


一、为什么通常情况下不使用外部中断来对编码器的脉冲进行计数?

电机高速旋转过程中会在短时间产生成千上万个脉冲信号,如果频繁调用中断进行累加运算会占用一定的软件资源;

一般情况下我们会设计一个硬件电路模块来自动完成上述简单重复而高频的计算;

二、编码器速度测量程序设计思路

每隔一段实际取一次值就可以得到编码器旋转的速度了;

编码器接口(Encoder Interface),编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或者自减,从而指示编码器的位置、旋转方向和旋转速度;
每个高级定时器和通用定时器都拥有一个编码器接口;

两个输入引脚借用了输入捕获的通道1和通道2;
注意CH3和CH4引脚不能接编码器

每个高级定时器和通用定时器都拥有一个编码器接口;

三、正交编码器

正交编码器的接口:
A相 B相 编码器电源 GND Z相(编码器0位置的输出,每转到一个固定的位置的时候输出一个脉冲,一般用于位置测量,校准0位置用的。)

正交信号精度更高:
A、B相都可以计次,相当于频率提高了一倍;
正交信号可以抗噪声:
正交信号的两个信号必须是交替跳变的,可以设计成一个抗噪声电路;

65535的补码为-1,如果想读取到负数,可以将编码器的uint_16类型强行转换为int_16类型;
读取编码器计数次数库函数:

uint16_t TIM_GetCounter(TIM_TypeDef* TIMx)

四、初始化流程

①RCC开启时钟,开启GPIO和定时器的时钟;
②配置GPIO,把PA6和PA7 配置成输入模式;
③配置时基单元,预分频器一般选择不分频(PSC = 0),自动重装一般给最大值65535(0~2^16-1);
④配置输入捕获单元,这里输入捕获单元只有滤波器和极性有用,后面的参数没有用到,与编码器无关;
⑤配置编码器接口模式
⑥调用TIM_Cmd启动定时器;

编码器初始化需要调用到的库函数

void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity);

获取定时器CNT的计数值

uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);

五、STM32正交编码器输入捕获模式配置示例

代码如下(示例):

/*** @brief  正交编码器输入捕获初始化,采用PA6、PA7捕获编码器A相与B相数据;注意PA6与PA7不可以随意更换,PA6->TIM3的CH1 PA7->TIM3的CH2;* @param  无* @retval 无*/
void Encoder_Init_IC(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA的外设时钟GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;//设置上拉输入模式GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;//选中GPIO口GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定时器TIM3的外设时钟//TIM_InternalClockConfig(TIM3);//选择内部时钟驱动TIM3的时钟单元,定时器上电默认使用内部时钟,这句话可以不写//TIM_ETRConfig(TIM3,TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_Inverted,0x0F);//选择外部时钟驱动TIM3的时钟单元TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//滤波器的采样时钟分频系数,跟时基单元关联不大,决定了滤波器的输入时钟频率(越低滤波输出越稳定,同时延迟会增大)TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//选择向上计数TIM_TimeBaseInitStruct.TIM_Period = 65535;//ARR自动重装器的值,取值0~65535,10KHZ/10000=1HZTIM_TimeBaseInitStruct.TIM_Prescaler = 0;//预分频器的值,取值0~65535,72MHZ/7200=10KHZTIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;//重复计数器的值,高级定时器特有的配置,这里用不上TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);TIM_ICInitTypeDef TIM_ICInitStruct;TIM_ICStructInit(&TIM_ICInitStruct);//给结构体赋初始值,主要是为了防止结构体不完整导致出错TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;//指定配置1~4哪一个通道TIM_ICInitStruct.TIM_ICFilter = 0xF;//选择输入捕获的滤波器,数值越大滤波效果越好(一般滤波器的采样频率会远高于信号频率,此处滤波器不会改变输入信号的频率,而是滤除高频噪声使得输入信号更加平滑)TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;//这里的上升沿代表高低电平极性不反转//TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;//分配器会改变输入信号的频率,这里需要每次信号触发都有效,所以选择不分频//TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;//选择信号从哪一路引脚输入,可以选择直连通道或者交叉通道(DirectTI表示直连通道,InDirectTI表示交叉通道)TIM_ICInit(TIM3,&TIM_ICInitStruct);TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;//指定配置1~4哪一个通道TIM_ICInitStruct.TIM_ICFilter = 0xF;//选择输入捕获的滤波器,数值越大滤波效果越好(一般滤波器的采样频率会远高于信号频率,此处滤波器不会改变输入信号的频率,而是滤除高频噪声使得输入信号更加平滑)TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;//这里的上升沿代表高低电平极性不反转//TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;//分配器会改变输入信号的频率,这里需要每次信号触发都有效,所以选择不分频//TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;//选择信号从哪一路引脚输入,可以选择直连通道或者交叉通道(DirectTI表示直连通道,InDirectTI表示交叉通道)TIM_ICInit(TIM3,&TIM_ICInitStruct);TIM_Cmd(TIM3,ENABLE);//启动定时器TIMx  这里的上升沿代表高低电平极性不反转TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12 ,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);//写入到TIMCmd后防止被覆盖
}/*
在输入捕获的模式下如果想获取编码器的位置信息可以直接读出CNT的值;
如果想获取编码器的速度和方向,需要每隔一段固定的闸门时间,去除一次CNT再把CNT清零;
上述测量速度即测频法;
*/

总结

以上就是今天要讲的内容,本文简单介绍了STM32中编码器的使用方式。

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

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

相关文章

手指关节分割系统:视觉算法突破

手指关节分割系统源码&数据集分享 [yolov8-seg-C2f-RFAConv&yolov8-seg-fasternet-bifpn等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Glob…

灵动AI:艺术与科技的融合

灵动AI视频官网地址:https://aigc.genceai.com/ 灵动AI 科技与艺术的完美融合之作。它代表着当下最前沿的影像技术,为我们带来前所未有的视觉盛宴。 AI 视频以强大的人工智能算法为基石,能够自动分析和理解各种场景与主题。无论是壮丽的自然…

网络学习/复习2套接字

LinuxCode/code26 zc/C语言程序学习 - 码云 - 开源中国

c语言中整数在内存中的存储

整数的二进制表示有三种:原码,反码,补码 有符号的整数,三种表示方法均有符号位和数值位两部分,符号位都是用‘0’表示“正,用1表示‘负’ 最高位的以为被当作符号位,剩余的都是数值位。 整数…

python 制作 发货单 (生成 html, pdf)

起因, 目的: 某个小店,想做个发货单。 过程: 先写一个 html 模板。准备数据, 一般是从数据库读取,也可以是 json 格式,或是 python 字典。总之,是数据内容。使用 jinja2 来渲染模板。最终的结果可以是 h…

使用 telnet 连接 dubbo 服务调用暴露的 dubbo 接口

目录 前言 环境准备 Telnet客户端 zookeeper pom 配置文件 dubbo接口 telnet连接dubbo dubbo命令 ls invoke 前言 工作中的微服务项目远程调用使用的技术是 dubbo,当对外提供了一个 duboo 接口时,无论是开发阶段自测,还是上线了服…

【EndNote版】如何在Word中引用文献

1、在Word中,鼠标光标放在所需插入文献的位置 2、点击选项卡中的“EndNote X9”,直接在EndNote中选中对应的文献 3、选中文献,点击工具栏中的“引用” 4、最后就可在Word中看到所插入的文献

华为配置BFD状态与接口状态联动实验

组网图形 图1 配置BFD状态与接口状态联动组网图 BFD简介配置注意事项组网需求配置思路操作步骤配置文件 BFD简介 为了减小设备故障对业务的影响,提高网络的可靠性,网络设备需要能够尽快检测到与相邻设备间的通信故障,以便及时采取措施&…

技术成神之路:设计模式(二十三)解释器模式

相关文章:技术成神之路:二十三种设计模式(导航页) 介绍 解释器模式(Interpreter Pattern)是一种行为设计模式,用于定义一种语言的文法表示,并提供一个解释器来处理这种文法。它用于处理具有特定语法或表达…

【C++】继承与模板

继承 1.继承的概念 概念:继承(inheritace)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称之为派生类。继承呈现了面向对象程序设计的…

时序分解 | TTNRBO-VMD改进牛顿-拉夫逊算法优化变分模态分解

时序分解 | TTNRBO-VMD改进牛顿-拉夫逊算法优化变分模态分解 目录 时序分解 | TTNRBO-VMD改进牛顿-拉夫逊算法优化变分模态分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 (创新独家)TTNRBO-VMD改进牛顿-拉夫逊优化算优化变分模态分解TTNRBO–VMD 优化VMD分解层数K和…

设计模式-单例模型(单件模式、Singleton)

单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。 单例模式同时解决了两个问题, 所以违反了单一职责原则: 保证一个类只有一个实例。 为什么会有人想要控制一个类所拥有的实例…

【Java并发编程】信号量Semaphore详解

一、简介 Semaphore(信号量):是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。 Semaphore 一般用于流量的控制,特别是公共资源有限的应用场景。例如数据库的连接&am…

谈谈对函数式编程的理解及rxjs的使用

背景 函数式编程可以说是非常古老的编程方式,但是近几年变成了一个非常热门的话题。不管是Google力推的Go、学术派的Scala与Haskell,还是Lisp的新语言Clojure,这些新的函数式编程语言越来越受到人们的关注。函数式编程思想对前端的影响很大&…

C语言基础题(大合集2)

1. 时间转换 给定秒数 --> 输出秒数 转化成 时/分/秒 //时间转换 //给定秒数 --> 转换成 小时/分/秒 int main() {//输入int seconds 0;int h 0;//小时int m 0;//分钟int s 0;//秒scanf("%d", &seconds);//计算h seconds / 60 / 60;m seconds / 60…

详解varint,zigzag编码, 以及在Go标准库中的实现

文章目录 为啥需要varint编码为啥需要zigzag编码varint编码解码 zigzag编码解码 局限性 为啥需要varint编码 当我们用定长数字类型int32来表示整数时,为了传输一个整数1,我们需要传输00000000 00000000 00000000 00000001 32 个 bits,而有价…

【C++】STL初识

【C】STL初识 文章目录 【C】STL初识前言一、STL基本概念二、STL六大组件简介三、STL三大组件四、初识STL总结 前言 本篇文章将讲到STL基本概念,STL六大组件简介,STL三大组件,初识STL。 一、STL基本概念 STL(Standard Template Library,标准…

QT建立工程时出现了:Reading Project

QT建立工程时出现了:Reading Project 打开建立的工程发现,缺少build文件 从别的工程中复制一个build,点击.pro就可以打开了

【CSS3】css开篇基础(4)

1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…

Spring Boot实现的动态化酒店住宿管理系统

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理酒店客房管理系统的相关信息成为必然。开发…