编码器介绍与应用

一.概述

1.编码器

编码器,是一种用来测量机械旋转或位移的传感器。这种传感器能够测量机械部件在旋转或直线运动时的位移位置或速度等信息,并将其转换成一系列电信号。其可和电机组装到一起用,反馈电机方向、转换角度的,然后电机根据反馈再动作纠偏,提升精度。

编码器是工业中常用的传感器之一,广泛应用于工业生产当中需要对机械系统进行监视或控制的场景,包括工业控制、机器人、照相机镜头、雷达平台以及部分计算机输入设备例如轨迹球和鼠标滚轮等等。

2.增量型编码器

增量型编码器是能够根据旋转运动产生信号的编码器,其刻度方式为每一个脉冲都进行增量计算,因此得名。

增量式旋转编码器是将设备运动时的位移信息变成连续的脉冲信号,脉冲个数表示位移量的大小。只有当设备运动的时候增量式编码器才会输出信号。编码器一般会把这些信号分为通道 A

和通道 B 两组输出,并且这两组信号间有 90° 的相位差。同时采集这两组信号就可以知道设备的运动和方向。除了通道 A、通道 B 以外,很多增量式编码器还会设置一个额外的通道 Z 输出信

号,用来表示编码器特定的参考位置,传感器转一圈 Z 轴信号才会输出一个脉冲。增量式编码器只输出设备的位置变化和运动方向,不会输出设备的绝对位置。

3.增量编码器结构

增量型编码器由一个中心有轴的光电码盘,其上有环形通、暗的刻线,有光电发射和接收器件读取,获得四组正弦波信号组合成A、B、C、D,每个正弦波相差90度相位差(相对于一个周波为360度),将C、D信号反向,叠加在A、B两相上,

可增强稳定信号;另每转输出一个Z相脉冲以代表零位参考位。由于A、B两相相差90度,可通过比较A相在前还是B相在前,以判别编码器的正转和反转,通过零位脉冲,可获得编码器的零位参考位。

分辨率―编码器以每旋转360度提供多少的通或暗刻线称为分辨率,也称解析分度、或直接称多少线,一般在每转分度5~10000线。

4.编码器基本参数

分辨率:

指编码器能够分辨的最小单位。对于增量式编码器,其分辨率表示为编码器转轴旋转一圈所产生的脉冲数,即脉冲数/转 (Pulse Per Revolution 或 PPR)。码盘上透光线槽的数

目其实就等于分辨率,也叫多少线,较为常见的有 5-6000 线。对于绝对式编码器,内部码盘所用的位数就是它的分辨率,单位是位 (bit),具体还分单圈分辨率和多圈分辨率。

精度:

首先明确一点,精度与分辨率是两个不同的概念。精度是指编码器每个读数与转轴实际位置间的最大误差,通常用角度、角分或角秒来表示。例如有些绝对式编码器参数表

里会写 ±20′′,这个就表示编码器输出的读数与转轴实际位置之间存在正负 20 角秒的误差,精度由码盘刻线加工精度、转轴同心度、材料的温度特性、电路的响应时间等各方面因素

共同决定。

最大响应频率:

指编码器每秒输出的脉冲数,单位是 Hz。计算公式:最大响应频率 = 分辨率 * 轴转速/60。

信号输出形式:

对于增量式编码器,每个通道的信号独立输出,输出电路形式通常有集电极开路输出、推挽输出、差分输出等。对于绝对式编码器,由于是直接输出几十位的二进

制数,为了确保传输速率和信号质量,一般采用串行输出或总线型输出,例如同步串行接口 (SSI)、RS485、CANopen 或 EtherCAT 等,也有一部分是并行输出,输出电路形式与增量

式编码器相同。

二.程序

1.硬件接口

STM32芯片内部有专门用来采集增量式编码器方波信号的接口,这些接口实际上是 STM32 定时器的其中一种功能。不过F407编码器接口功能只有高级定时器 TIM1、TIM8 和通用定时器 TIM2 到TIM5 才有。

2.增量式编码器程序设计,两个步骤:

①如何判断转动方向

②如何将脉冲数准确;  

第一个问题,如何根据编码器的脉冲判断电机的转动方向。

    目前比较常见的方法:使用DSP或者STM32,检测到A相信号的下降沿时触发中断,检测此时的B相信号的电平高低,如果电平为低,则为正转;如果为高,则为反转(正反转方向每个人的定义不同,不影响,只要根据自己的需要定义就行)。  

第二个问题的解决方案其实已经在上面说差不多了,如果为了提高精度,可以在A相信号的上升沿和下降沿都进行检测以及可以避免A相信号的下降沿和Z相信号上升沿重合

   (用A相信号的下降沿作为触发条件去检测Z相信号的高低,重合时检测不到,这也是我使用二倍频的原因),没有检测到从而不能及时清零的问题。

3.编码器定时器检测代码

/* 定时器溢出次数 */

__IO int16_t Encoder_Overflow_Count = 0;

TIM_HandleTypeDef TIM_EncoderHandle;

/**

  * @brief  编码器接口引脚初始化

  * @param  无

  * @retval 无

  */

static void Encoder_GPIO_Init(void)

{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  

  /* 定时器通道引脚端口时钟使能 */

  ENCODER_TIM_CH1_GPIO_CLK_ENABLE();

  ENCODER_TIM_CH2_GPIO_CLK_ENABLE();

  

  /* 设置输入类型 */

  GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

  /* 设置上拉 */

  GPIO_InitStruct.Pull = GPIO_PULLUP;

  /* 设置引脚速率 */

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

  

  /* 选择要控制的GPIO引脚 */

  GPIO_InitStruct.Pin = ENCODER_TIM_CH1_PIN;

  /* 设置复用 */

  GPIO_InitStruct.Alternate = ENCODER_TIM_CH1_GPIO_AF;

  /* 调用库函数,使用上面配置的GPIO_InitStructure初始化GPIO */

  HAL_GPIO_Init(ENCODER_TIM_CH1_GPIO_PORT, &GPIO_InitStruct);

  

  /* 选择要控制的GPIO引脚 */

  GPIO_InitStruct.Pin = ENCODER_TIM_CH2_PIN;

  /* 设置复用 */

  GPIO_InitStruct.Alternate = ENCODER_TIM_CH2_GPIO_AF;

  /* 调用库函数,使用上面配置的GPIO_InitStructure初始化GPIO */

  HAL_GPIO_Init(ENCODER_TIM_CH2_GPIO_PORT, &GPIO_InitStruct);

}

/**

  * @brief  配置TIMx编码器模式

  * @param  无

  * @retval 无

  */

static void TIM_Encoder_Init(void)

{

  TIM_Encoder_InitTypeDef Encoder_ConfigStructure;

  

  /* 使能编码器接口时钟 */

  ENCODER_TIM_CLK_ENABLE();

  

  /* 定时器初始化设置 */

  TIM_EncoderHandle.Instance = ENCODER_TIM;

  TIM_EncoderHandle.Init.Prescaler = ENCODER_TIM_PRESCALER;

  TIM_EncoderHandle.Init.CounterMode = TIM_COUNTERMODE_UP;

  TIM_EncoderHandle.Init.Period = ENCODER_TIM_PERIOD;

  TIM_EncoderHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

  TIM_EncoderHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

  

  /* 设置编码器倍频数 */

  Encoder_ConfigStructure.EncoderMode = ENCODER_MODE;

  /* 编码器接口通道1设置 */

  Encoder_ConfigStructure.IC1Polarity = ENCODER_IC1_POLARITY;

  Encoder_ConfigStructure.IC1Selection = TIM_ICSELECTION_DIRECTTI;

  Encoder_ConfigStructure.IC1Prescaler = TIM_ICPSC_DIV1;

  Encoder_ConfigStructure.IC1Filter = 0;

  /* 编码器接口通道2设置 */

  Encoder_ConfigStructure.IC2Polarity = ENCODER_IC2_POLARITY;

  Encoder_ConfigStructure.IC2Selection = TIM_ICSELECTION_DIRECTTI;

  Encoder_ConfigStructure.IC2Prescaler = TIM_ICPSC_DIV1;

  Encoder_ConfigStructure.IC2Filter = 0;

  /* 初始化编码器接口 */

  HAL_TIM_Encoder_Init(&TIM_EncoderHandle, &Encoder_ConfigStructure);

  

  /* 清零计数器 */

  __HAL_TIM_SET_COUNTER(&TIM_EncoderHandle, 0);

  

  /* 清零中断标志位 */

  __HAL_TIM_CLEAR_IT(&TIM_EncoderHandle,TIM_IT_UPDATE);

  /* 使能定时器的更新事件中断 */

  __HAL_TIM_ENABLE_IT(&TIM_EncoderHandle,TIM_IT_UPDATE);

  /* 设置更新事件请求源为:计数器溢出 */

  __HAL_TIM_URS_ENABLE(&TIM_EncoderHandle);

  

  /* 设置中断优先级 */

  HAL_NVIC_SetPriority(ENCODER_TIM_IRQn, 5, 1);

  /* 使能定时器中断 */

  HAL_NVIC_EnableIRQ(ENCODER_TIM_IRQn);

  

  /* 使能编码器接口 */

  HAL_TIM_Encoder_Start(&TIM_EncoderHandle, TIM_CHANNEL_ALL);

}

/**

  * @brief  编码器接口初始化

  * @param  无

  * @retval 无

  */

void Encoder_Init(void)

{

  Encoder_GPIO_Init();    /* 引脚初始化 */

  TIM_Encoder_Init();     /* 配置编码器接口 */

}

/**

  * @brief  定时器更新事件回调函数

  * @param  无

  * @retval 无

  */

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

  /* 判断当前计数器计数方向 */

  if(__HAL_TIM_IS_TIM_COUNTING_DOWN(htim))

    /* 下溢 */

    Encoder_Overflow_Count--;

  else

    /* 上溢 */

    Encoder_Overflow_Count++;

}

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

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

相关文章

数据结构——循环队列(数组)

一、循环队列的定义 二、循环队列图示 三、循环队列使用规则 为解决队满和队空的判断条件相同。 我们 采用 损失一个单元不用的方法 即当循环队列元素的个数是MAXSIZE-1时,就认为队列已满(front指向空的单元) 这样循环队列的队满条件就变…

Spring框架深度解析:打造你的Java应用梦工厂

想要在Java企业级应用开发中大展身手?Spring框架的核心容器是你不可或缺的伙伴! 文章目录 一. 引言1.1 介绍Spring框架的重要性1.2 阐述核心容器在Spring框架中的作用1.3 故事开端 二. 背景介绍2.1 描述Spring框架的发展历程2.2 概述Spring框架的主要特点…

汇昌联信:拼多多入驻条件是哪些?

在电商领域,拼多多以其独特的团购模式迅速崛起,吸引了众多商家的目光。想要在拼多多上开店,了解其入驻条件是必不可少的第一步。下面将详细解读拼多多的入驻条件,帮助有意加入的商家们做好准备。 一、企业资质要求 想要成功入驻拼…

vmware16下的ubuntu使用记录

设置ubuntu共享文件夹 cd /mnt/hgfs/ ls ls (列出当前目录下的文件的名字)(路径就是路径下的文件名字) windows传文件到linux 共享文件夹 复制文件到LinuxShare文件夹 拖拽文件 添加成功 拍摄快照 用于恢复之前某个时间点的状态

Java抽象类:为何它是你代码架构的基石?

目录 1、抽象类的概念 2、抽象类语法 3、抽象类特性 4、抽象类的作用 5、 完结散花 个人主页:秋风起,再归来~ 文章专栏:javaSE的修炼之路 个人格言:悟已往之不谏,知来者犹可追 克…

彩虹易支付用户中心美化主题 模版源码

简介: 彩虹易支付用户中心美化主题 模版源码 使用本主题前请备份官方版本文件再进行解压到user目录替换! 点击下载

SSH远程管理 远程访问及控制

SSH远程管理 SSH(Secure Shell) 是一种安全通道协议,主要用来实现字符界面的远程登录、远程复制等功 能。SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令。与早 期的 Telent (远程登录)、RSH(Remote Shell, 远程执行命…

嗨动PDF编辑器适合你的pdf编辑器,试试吧!

pdf编辑器有哪些?在数字化办公日益普及的今天,PDF文档因其跨平台、高保真度的特性而备受欢迎。无论是工作汇报、学术研究还是日常学习,我们都需要对PDF文档进行编辑、修改和整理。然而,如何选择合适的PDF编辑器却成了许多人头疼的…

vue3实战Easy云盘(一):创建项目+登录注册页面+构建框架页+上传头像/修改密码/退出登录

一、创建项目 1.创建项目 2.安装各种依赖 npm install highlightjs/vue-plugin moefe/vue-aplayer aplayer axios docx-preview dplayer element-plus highlight.js js-md5 sass sass-loader spark-md5 vue-clipboard3 vue-cookies vue-pdf-embed vue-router …

Linux系统(CentOS)下安装配置 Nginx 超详细图文教程

一、下载并安装 1.打开nginx官网并点击右侧的download,Nginx官网下载地址 2.选择稳定版本 我放在/usr/local/nginx/下,新建文件夹 mkdir /usr/local/nginx/ 通过xftp传输到Linux的服务器上,这里方法不过多复述。 或者如果Linux联网&#xf…

Hystrix服务熔断

服务熔断 熔断机制是应对雪崩效应的一种微服务链路保护机制。当某个微服务不可用或者响应时间太长时, 会进行服务降级,进而熔断该节点微服务的调用,快速返回“错误”的响应信息。当检测到该节点微 服务调用响应正常后恢复调用链路。 在Spri…

鸿蒙开发:【从TypeScript到ArkTS的适配规则】

从TypeScript到ArkTS的适配规则 ArkTS通过规范约束了TypeScript(简称TS)中过于灵活而影响开发正确性或者给运行时带来不必要额外开销的特性。本文罗列了所有在ArkTS中限制的TS特性,并提供了重构代码的建议。ArkTS保留了TS大部分的语法特性&a…

半监督的GCN:Semi-Supervised Classification With Graph Convolutional Networks

Semi-Supervised Classification With Graph Convolutional Networks -Theophilus Siameh-2017(2023) 思路 使用可扩展方法对图进行半监督学习,其中CNN应用在图数据上,得到GCN。 这种方法是在图的边的数量上进行线性的缩放模型,并学习包含局部图结构和图节点的几个隐藏层…

红米Turbo3小米平板6SPro澎湃OS系统强解BL锁-跳小米社区绑定-刷ROOT权限

红米Turbo3小米平板6SPro这2款设备都出厂为澎湃OS系统,官方提供都是小米社区申请解锁权限,然后自己答题解锁,门槛非常高,想要玩机root的用户,都在堵在门外。还在这目前这两款机型官方并没有加入强制验证,在…

【深度学习实战(33)】训练之model.train()和model.eval()

一、model.train(),model.eval()作用? model.train() 和 model.eval() 是 PyTorch 中的两个方法,用于设置模型的训练模式和评估模式。 model.train() 方法将模型设置为训练模式。在训练模式下,模型会启用 dropout 和 batch norm…

pytorch常用内置loss函数与正则化技术(补充小细节)

文章目录 前言一、常用损失函数(后面用到了新的会一一补充)1.1 回归中的损失函数1.1.1 nn.MSELoss()示例1:向量-向量示例2:矩阵--矩阵(维度必须一致才行)1.2 分类中的损失函数1.2.1 二分类(1)nn.BCELoss --- 二分类交叉熵损失函数示例1:向量-向量示例2:矩阵--矩阵(维…

基于SSM的“基于协同过滤的在线通用旅游平台网站”的设计与实现(源码+数据库+文档)

基于SSM的“基于协同过滤的在线通用旅游平台网站”的设计与实现(源码数据库文档) 开发语言:Java 数据库:MySQL 技术:SSM 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统主界面 景点信息界面 后台界面 部分源码…

【每日刷题】Day39

【每日刷题】Day39 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 622. 设计循环队列 - 力扣(LeetCode) 2. 387. 字符串中的第一个唯一字符 - …

百度云防护502 Bad Gateway原因总结和处理方法

最近,随着原百度云加速用户新接入百度云防护后,很多站长反馈网站打不开,出现了502 Bad Gateway的情况。 为此,百度云这里给大家总结下,出现502的大概几个原因: 1.服务器防火墙拦截了百度云防护的IP节点请求…

vivado Kintex UltraScale+ 配置存储器器件

Kintex UltraScale 配置存储器器件 下表所示闪存器件支持通过 Vivado 软件对 Kintex UltraScale 器件执行擦除、空白检查、编程和验证等配置操作。 本附录中的表格所列赛灵思系列非易失性存储器将不断保持更新 , 并支持通过 Vivado 软件对其中所列非易失性存…