编码器介绍与应用

一.概述

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++;

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024电商数据资料汇总

2024年跨境电商:连接全球市场的新纪元 随着全球数字化进程的不断推进,跨境电商已经成为了国际贸易的重要组成部分。2024年,跨境电商行业迎来了一系列挑战和机遇,塑造了全新的市场格局。 跨境电商市场规模的持续扩大 2024年&…

基于微信小程序+JAVA Springboot 实现的【马拉松报名系统】app+后台管理系统 (内附设计LW + PPT+ 源码+ 演示视频 下载)

项目名称 项目名称: 马拉松报名系统微信小程序 项目技术栈 该项目采用了以下核心技术栈: 后端框架/库: Java SSM框架数据库: MySQL前端技术: 微信开发者工具、uni-app其他技术: JSP开发技术 项目展示 …

【异常处理】(中北大学-程序设计基础(2))

目录 题目 源码 结果示例 题目 求一元二次方程式ax^2bxc0的实根&#xff0c;如果方程没有实根&#xff0c;则输入有关警告信息。要求&#xff1a;建立一元二次方程类&#xff0c;利用异常技术处理。 源码 #include <iostream> #include <cmath>using namespa…

网络基础-SSH协议(思科、华为、华三)

SSH&#xff08;Secure Shell&#xff09;是一种用于安全远程访问和安全文件传输的协议。它提供了加密的通信通道&#xff0c;使得用户可以在不安全的网络上安全地远程登录到远程主机&#xff0c;并在远程主机上执行命令、访问文件以及传输文件&#xff0c;本篇主要讲解命令执行…

LLM实战:LLM微调加速神器-Unsloth + LLama3

1. 背景 五一结束后&#xff0c;本qiang~又投入了LLM的技术海洋中&#xff0c;本期将给大家带来LLM微调神器&#xff1a;Unsloth。 正如Unsloth官方的对外宣贯&#xff1a;Easily finetune & train LLMs; Get faster with unsloth。微调训练LLM&#xff0c;可以显著提升速…

【JavaEE初阶系列】——博客系统(编写服务器/前后端交互代码)

目录 &#x1f6a9;部署页面需求 &#x1f6a9;准备工作 &#x1f6a9;获取博客列表页 &#x1f6a9;博客详情页 &#x1f6a9;实现登录页面 &#x1f388;强制要求登录 &#x1f388;显示用户信息 &#x1f6a9;退出登录 &#x1f6a9;发布博客 &#x1f6a9;部署页面…

宝塔助手v1.4.1/手机操控云服务器的神器软件

宝塔助手是以宝塔Linux面板提供的API开发的一款可以随时随地管理服务器的APP。通过这款APP你可以随时随地的查看一台或多台服务器的运行情况&#xff0c;对服务器网站、FTP、数据库、文件进行管理。内置文件编辑器&#xff0c;可以对网站文件进行修改。 链接&#xff1a;https:…

三极管 导通条件

一、三极管理解 三极管是电子行业常用的元器件之一&#xff0c;他是一种电流型控制的器件&#xff0c;他有三种工作状态&#xff1a;截止区&#xff0c;放大区、饱和区。当三极管当做开关使用时&#xff0c;他工作在饱和区。下面简短讲解三极管作为开关使用的方法&#xff0c;只…

李飞飞团队关于2024年人工智能发展报告总结 (Artificial Intelligence Index Report)

目录 1 10大核心信息2 AI研究和发展2.1 核心要点2.2 核心对比信息2.3 模型是否会用尽数据2.4 基础模型发展2.5 训练模型成本 3 技术性能3.1 核心要点3.2 重要模型发布情况3.3 AI表现情况3.4 多学科、高难度评估集 (MMMU & GPQA & ARC)3.5 Agents3.6 RLHF & RLAIF3.…

花了3天编制了236份excel财务明细收支报表,自动公式,直接用

财务明细收支报表能够帮助管理者清晰地了解企业的财务状况&#xff0c;及时调整经营策略。财务收支报表也是评估企业偿债能力和盈利能力的重要依据。 一份标准的财务明细收支报表通常包括以下部分&#xff1a;标题、报表期间、收入明细、支出明细、净收入或净支出等。 在制作…

在cmd中,如何使用cd进入指定文件目录

在cmd中&#xff0c;如何使用cd进入指定文件目录 1.要进入的磁盘与当前磁盘一致 例如: cd C:\Program Files (x86)\Google\Chrome\Application 2.进入到其他磁盘&#xff0c; 例如 cd /d D:\JAVA\codes\01\1.4 或者下面的方式&#xff08;直接输入磁盘F&#xff1a;和文件名…

【UE5 C++】基础学习笔记——01 UObject的创建与使用

目录 步骤 一、创建UObject 二、创建基于UObject的蓝图类 三、在UObject中使用变量和函数 步骤 一、创建UObject 在内容浏览器中新建一个C类 父类选择“Object” 类的类型设置为公有&#xff0c;这里就命名为“MyObject”&#xff0c;点击“创建类”来创建头文件和源文…

【联合索引】最左匹配原则是什么?

什么是联合索引 联合索引&#xff08;Composite Index&#xff09;是一种索引类型&#xff0c;它由多个列组成。 MySQL的联合索引&#xff08;也称为复合索引&#xff09;是建立在多个字段上的索引。这种索引类型允许数据库在查询时同时考虑多个列的值&#xff0c;从而提高查询…

SpringCloud 集成 RocketMQ 及配置解析

文章目录 前言一、SpringCloud 集成 RocketMQ1. pom 依赖2. yml 配置3. 操作实体4. 生产消息4.1. 自动发送消息4.2. 手动发送消息 5. 消费消息 二、配置解析1. spring.cloud.stream.function.definition 前言 定义 Spring Cloud Stream 是一个用来为微服务应用构建消息驱动能力…

中国海洋大学整体来说值得报考吗?中国海洋大学考情分析。

中国海洋大学&#xff08;Ocean University of China&#xff09;&#xff0c;简称中国海大。位于中国青岛&#xff0c;是中华人民共和国教育部直属的综合性重点大学&#xff0c;国家“双一流”、“985工程”和“211工程”重点建设高校之一&#xff0c;入选“2011计划”、“111…

迄今为止最全- 前端性能优化

简介 当我们说前端性能优化的时候&#xff0c;指的可能是不同场景的性能优化。前端涉及性能优化的场景主要有&#xff1a; 项目构建性能优化 页面性能优化 加载时性能优化 运行时性能优化 构建性能主要指构建速度&#xff0c;优化方法和打包工具直接相关&#xff0c;主要…

学习软考----数据库系统工程师32

NoSQL非关系型数据库 CAP理论和BASE特性 关系型数据库主要使用ACID理论 各种NoSQL数据 库的分类与特点

实操Linux磁盘管理(分区、格式化、挂载)

在Linux系统中&#xff0c;磁盘管理是一个必学的知识点。正确地进行磁盘分区、格式化和挂载可以确保我们能够充分利用磁盘空间并高效地存储和访问数据。 相比于Windows系统中的简单盘符管理&#xff0c;Linux中的磁盘管理更加复杂且灵活。在Linux系统中&#xff0c;一切设备都…

企业使用合同档案管理系统软件有什么好处

使用合同档案管理系统软件可以带来以下好处&#xff1a; 1. 提高效率&#xff1a;合同管理软件可以自动化合同流程&#xff0c;包括创建、审批、签署和归档等。通过自动化&#xff0c;可以节省大量时间和精力&#xff0c;提高工作效率。 2. 降低风险&#xff1a;玖拓档案合同管…

鸿蒙内核源码分析(内核态锁篇) | 如何实现快锁Futex(下)

本篇为快锁下篇&#xff0c;说清楚快锁在内核态的实现&#xff0c;解答以下问题&#xff0c;它们在上篇的末尾被提出来。 鸿蒙内核进程池默认上限是64个&#xff0c;除去两个内核进程外&#xff0c;剩下的都归属用户进程&#xff0c;理论上用户进程可以创建很多快锁&#xff0…