ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

编码器原理与选型实战:从光电/磁电原理到PLC/单片机信号读取

编码器原理与选型实战:从光电/磁电原理到PLC/单片机信号读取 在工业自动化、机器人控制、精密测量等领域电机编码器扮演着“眼睛”和“尺子”的关键角色。无论是伺服电机精准定位、数控机床的精密加工还是机器人关节的角度反馈都离不开编码器的实时数据。然而面对增量式、绝对值、磁编码器、旋转变压器等多种类型以及分辨率、精度、接口协议等复杂参数很多开发者尤其是刚接触运动控制的朋友常常感到困惑编码器到底是如何工作的如何为我的项目选择合适的编码器信号又该如何正确读取和处理本文将彻底拆解编码器的核心工作原理从最基础的光电与磁电原理讲起深入剖析增量式与绝对值编码器的本质区别并结合实际应用场景如PLC读取脉冲、I2C/485通信协议提供从选型、接线到数据读取的完整实战指南。无论你是自动化工程师、嵌入式开发者还是机器人爱好者都能通过本文建立起对编码器清晰、系统的认知并掌握其核心应用技能。1. 编码器核心概念运动控制的“感官器官”在深入原理之前我们首先要明确编码器到底是什么以及它为什么如此重要。编码器Encoder是一种将机械运动中的位移直线或旋转转换为电信号的传感器。这个电信号通常是数字化的可以被控制器如PLC、单片机、运动控制卡读取和处理从而实现对位置、速度、加速度等运动参数的精确感知和控制。你可以把它想象成电机或旋转轴的“眼睛”。没有编码器控制器就像在蒙眼操作只能发出“转动”的指令却不知道电机实际转了多少、转得多快、是否到达了指定位置。有了编码器控制器就能获得实时、精确的反馈形成“闭环控制”从而实现高精度、高动态响应的运动。常见应用场景包括伺服系统实时反馈电机转子位置实现精准的扭矩、速度和位置控制。数控机床测量主轴转速和进给轴位置保证加工精度。工业机器人反馈各关节的精确角度实现复杂的轨迹规划。电梯与传送带定位楼层或物料位置。打印机与扫描仪控制打印头或扫描头的精确定位。根据测量原理和信号输出类型编码器主要有以下几种分类这也是选型时必须考虑的核心维度按测量原理光电编码器利用光栅盘和光电传感器。精度高但抗污染和振动能力相对较弱。磁电编码器利用磁栅和磁敏元件如霍尔传感器、磁阻传感器。结构坚固抗污染、抗振动能力强成本较低近年来在中高端领域应用广泛。旋转变压器Resolver一种模拟式的位置传感器通过电磁感应原理工作。极端坚固耐用耐高温、高湿、强振动常用于航空航天、军事、重工业等恶劣环境。按信号类型增量式编码器Incremental Encoder输出脉冲信号记录相对位移。每转动一个固定角度就发出一个脉冲。它只能告诉你“动了多少”但不知道“初始位置在哪”。断电后位置信息丢失。绝对值编码器Absolute Encoder输出一个唯一的数字代码对应轴的唯一位置。即使断电再上电也能立即知道当前位置。它直接告诉你“现在在哪里”。按机械结构旋转编码器测量旋转运动最常见。直线编码器测量直线位移。理解这些基本概念是选择和使用编码器的第一步。接下来我们将深入其内部看看信号究竟是如何产生的。2. 工作原理深度剖析从物理现象到数字信号编码器的工作原理是其技术的核心。我们以最典型的光电增量式编码器和磁电绝对值编码器为例进行拆解。2.1 光电增量式编码器工作原理光电编码器的核心部件包括光源LED、光栅盘、光电接收器光敏元件。工作流程如下光栅盘一个刻有密集透光和不透光栅线的圆盘安装在电机转轴上随轴一起旋转。栅线的数量直接决定了编码器的分辨率如1000线、2500线。发光与感光光源发出的光照射到旋转的光栅盘上。当光栅盘转动时栅线交替遮挡和透过光线。信号生成光电接收器检测到这种明暗交替变化并将其转换为电流的强弱变化。波形整形电流信号经过编码器内部的电路如施密特触发器进行放大、整形最终输出规整的方波脉冲信号。为了判断旋转方向编码器会布置两套光路产生两路相位差为90度的脉冲信号通常标记为A相和B相。通过判断A相和B相的相位领先关系控制器就能确定电机是正转还是反转。此外许多编码器还提供一个Z相零位信号。电机每旋转一圈Z相输出一个脉冲。这个信号用于确定机械零位或进行圈数计数。信号关系图示逻辑分析仪视角正转时A相领先B相90度 A: _|‾|_|‾|_|‾|_|‾ B: ‾|_|‾|_|‾|_|‾|_ 反转时B相领先A相90度 A: _|‾|_|‾|_|‾|_|‾ B: |_|‾|_|‾|_|‾|_|‾(注此图为ASCII示意实际为规整方波)2.2 磁电绝对值编码器工作原理磁电编码器正日益流行它采用不同的物理原理但目标一致。核心部件包括磁栅磁环、磁敏传感器如霍尔传感器、TMR/GMR传感器、信号处理芯片。工作流程如下磁栅一个充有交替NS极的多极磁环替代了光栅盘安装在转轴上。磁场感应当磁环旋转时其表面的磁场方向周期性变化。信号采集磁敏传感器对磁场方向极其敏感检测到磁场变化输出相应的正弦/余弦模拟电压信号。插值与数字化内部的专用芯片如AS5047P, AS5048等对这两路相位差90度的模拟信号进行高倍率插值如从256个磁极对插值到14位分辨率并通过反正切运算arctan2(sin, cos)计算出当前磁环的绝对角度。这个角度值通过特定的数字接口如SPI, I2C, PWM, 绝对值串行协议输出。绝对值编码器的核心优势在于其“绝对位置”信息。常见的输出位数有8位256个位置、10位1024、12位4096、14位16384等。一个12位的单圈绝对值编码器可以将一圈均匀分为4096个位置每个位置对应一个唯一的数字编码如0x000到0xFFF。2.3 旋变编码器旋转变压器简介旋变是一种特殊的模拟式绝对值传感器。它本质上是一个微型变压器由转子绕组和定子绕组组成。通过测量定子绕组上感应出的正弦波信号的幅值或相位变化可以解算出转子的绝对角度。其输出是模拟的Sin/Cos包络信号需要外接专用的RDC旋变数字转换器芯片将其转换为数字角度值。它的最大优点是极其可靠但系统成本较高。3. 关键参数与选型指南读懂数据手册面对琳琅满目的编码器如何选择你需要关注以下几个核心参数类型增量式 vs 绝对值。这是首要决策点。增量式成本低接口简单A/B/Z脉冲适用于连续旋转、速度控制或已知参考点的场合。缺点断电位置丢失上电需回零。绝对值成本高接口可能复杂并行、SSI、BiSS-C、SPI、I2C等但无需回零抗干扰能力强适用于需要知道绝对位置、安全要求高的场合如机器人、起重机。分辨率指编码器旋转一圈所输出的脉冲数增量式或位置数绝对值。增量式通常用“PPR”Pulses Per Revolution每转脉冲数表示如1000 PPR。注意通过控制器对A/B相进行4倍频计数实际位置分辨率可达4 * PPR。绝对值用位数表示如12位4096/圈、17位131072/圈。多圈绝对值编码器还会标明圈数如13位8192圈 12位4096/圈。精度 vs 分辨率这是两个常被混淆的概念。分辨率是“尺子的最小刻度”决定了你能读到多细。精度是“尺子刻得准不准”指实际位置与测量值之间的最大偏差。一个高分辨率但低精度的编码器读数可能很细但不准。输出信号与接口增量式推挽输出、集电极开路、差分输出RS422如A, /A, B, /B, Z, /Z。差分输出抗干扰能力最强适用于长距离传输。绝对值并行输出多位数据线同时输出速度快但线缆多。串行输出如SSI同步串行接口、BiSS-C、SPI、I2C。线缆少适合嵌入式系统。现场总线如PROFIBUS-DP, CANopen, EtherCAT。直接集成到工业网络中。模拟量如1Vpp Sin/Cos或PWM输出。机械特性轴径、轴型实心轴/空心轴、安装方式轴套/法兰、防护等级IP等级、最高转速、启动力矩等。选型决策树简化版是否需要断电保持位置 ├── 是 → 选择【绝对值编码器】 │ ├── 需要多圈信息 → 选择【多圈绝对值编码器】 │ ├── 接口需求 → 根据控制器选择SPI/I2C/SSI/总线 │ └── 环境恶劣 → 优先【磁电】或【旋变】 └── 否 → 选择【增量式编码器】 ├── 控制精度要求 → 决定【分辨率】PPR ├── 传输距离远、干扰大 → 选择【差分输出】 └── 需要找零位 → 确认带【Z相】信号4. 实战应用如何读取与处理编码器信号理解了原理和参数我们进入实战环节。这里以最常见的场景为例使用PLC读取增量编码器脉冲和使用单片机通过I2C读取绝对值磁编码器。4.1 场景一西门子S7-1200 PLC读取增量编码器脉冲这是工业自动化中最常见的应用。我们假设使用一个1000 PPR、差分输出A, /A, B, /B的增量编码器连接到S7-1200 PLC的高速计数器HSC输入点。硬件连接编码器电源通常24V DC接PLC的传感器电源或外部电源。编码器输出A相接PLC的I0.0HSC1的A相B相接I0.1HSC1的B相。对于差分信号通常只需接入A和B将/A和/B悬空或按手册接入有些需要接入M。公共端注意PLC输入点的公共端M与编码器电源的0V共地。软件配置TIA Portal V17示例设备配置中启用高速计数器在“设备视图”中双击CPU进入“属性”-“高速计数器(HSC)”-“HSC1”。将“功能”设置为“计数”。“计数类型”选择“AB正交计数器4倍频”。这是最常用的模式利用A/B相90度相位差将分辨率提高4倍1000 PPR - 4000 计数值/圈。“运行阶段”选择“连续计数”。“初始计数方向”根据实际需要选择“向上”。在“硬件输入”中分配A相为I0.0B相为I0.1。编写控制程序 在OB1主循环或更好的在OB200循环中断中读取计数值。// 西门子SCL语言示例 (在FC或FB中) PROGRAM Main VAR hsc1CurrentValue : DINT; // 当前计数值32位有符号整数 revolutions : REAL; // 计算出的圈数 angleDeg : REAL; // 计算出的角度度 END_VAR // 读取HSC1的当前值到变量 hsc1CurrentValue : HSC.CV; // 实际指令为“CTRL_HSC”或直接访问ID1000:DB4等此处为逻辑示意 // 计算圈数和角度 (假设1000 PPR, 4倍频后为4000 counts/rev) revolutions : DINT_TO_REAL(hsc1CurrentValue) / 4000.0; angleDeg : (DINT_TO_REAL(hsc1CurrentValue) MOD 4000) / 4000.0 * 360.0;注意实际编程中需要使用“CTRL_HSC”指令来读取和操作高速计数器。上述代码为逻辑示意重点在于计算原理。关键点计数溢出32位计数值范围为-2,147,483,648 到 2,147,483,647。在连续旋转中需要考虑溢出处理。可以使用“CTRL_HSC”指令的周期中断功能或在程序中进行差值计算来应对溢出。滤波在高速计数器属性中可以设置输入滤波时间以消除触点抖动或噪声干扰。复位可通过程序或硬件门控信号将计数器复位为零。4.2 场景二STM32单片机通过I2C读取AS5047P磁编码器AS5047P是一款流行的12位4096位置绝对值磁编码器芯片支持SPI和I2C接口。这里演示I2C读取。硬件连接VDD: 接3.3VGND: 接地SCL: 接单片机I2C时钟线如PB6SDA: 接单片机I2C数据线如PB7PROG: 悬空或接高用于编程模式磁铁安装在电机轴上与芯片中心对齐保持适当气隙通常0.5-2mm。软件驱动基于HAL库I2C初始化// stm32f1xx_hal_msp.c 或 main.c 中 I2C_HandleTypeDef hi2c1; void MX_I2C1_Init(void) { hi2c1.Instance I2C1; hi2c1.Init.ClockSpeed 400000; // 400kHz hi2c1.Init.DutyCycle I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 0; hi2c1.Init.AddressingMode I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode I2C_DUALADDRESS_DISABLE; hi2c1.Init.OwnAddress2 0; hi2c1.Init.GeneralCallMode I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode I2C_NOSTRETCH_DISABLE; if (HAL_I2C_Init(hi2c1) ! HAL_OK) { Error_Handler(); } }读取角度值函数 AS5047P的I2C地址为0x407位地址。角度值存储在14位寄存器0x3FFF和0x3FFE中但有效数据为12位0xFFF。// as5047p.h #define AS5047P_I2C_ADDR (0x40 1) // HAL库使用8位地址左移一位 #define AS5047P_ANGLE_REG 0x3FFF // 角度寄存器地址14位含校验位 #define AS5047P_AGC_REG 0x3FFD // 自动增益控制寄存器可用于诊断 // as5047p.c /** * brief 通过I2C读取AS5047P的原始角度值0-16383 * param hi2c: I2C句柄指针 * retval 原始角度值读取失败返回0xFFFF */ uint16_t AS5047P_ReadAngle(I2C_HandleTypeDef *hi2c) { uint8_t tx_data[2] {0}; uint8_t rx_data[2] {0}; uint16_t angle_raw 0; HAL_StatusTypeDef status; // 1. 发送要读取的寄存器地址高位在前 tx_data[0] (AS5047P_ANGLE_REG 8) 0xFF; // 寄存器高字节 tx_data[1] AS5047P_ANGLE_REG 0xFF; // 寄存器低字节 status HAL_I2C_Master_Transmit(hi2c, AS5047P_I2C_ADDR, tx_data, 2, HAL_MAX_DELAY); if (status ! HAL_OK) { return 0xFFFF; // 传输失败 } // 2. 读取2字节数据高位在前 status HAL_I2C_Master_Receive(hi2c, AS5047P_I2C_ADDR, rx_data, 2, HAL_MAX_DELAY); if (status ! HAL_OK) { return 0xFFFF; // 接收失败 } // 3. 组合数据并提取角度高字节在前低14位有效 angle_raw ((uint16_t)rx_data[0] 6) | (rx_data[1] 2); // 原始14位数据 // 注意实际数据格式需参考AS5047P数据手册此处为常见格式示意。 // 更严谨的做法是进行奇偶校验PARC。 return angle_raw; } /** * brief 将原始角度值转换为弧度或角度 * param raw_angle: 原始角度值 (0-16383 for 14-bit) * param resolution_bits: 分辨率位数 (e.g., 12 for 4096 positions) * retval 角度值单位度 */ float AS5047P_RawToDegrees(uint16_t raw_angle, uint8_t resolution_bits) { // 将原始值缩放到有效位数然后转换为角度 uint16_t max_count (1 resolution_bits) - 1; // e.g., 4095 for 12-bit // 假设 raw_angle 是14位但有效角度是12位存储在最高12位 raw_angle raw_angle (14 - resolution_bits); // 右移取高12位 return ((float)raw_angle / (float)max_count) * 360.0f; }在主循环中调用// main.c int main(void) { // ... 初始化代码HAL_Init, SystemClock_Config, MX_I2C1_Init... uint16_t raw_angle; float angle_deg; while (1) { raw_angle AS5047P_ReadAngle(hi2c1); if (raw_angle ! 0xFFFF) { angle_deg AS5047P_RawToDegrees(raw_angle, 12); // 12位分辨率 printf(Angle: %.2f deg\r\n, angle_deg); } else { printf(Read AS5047P failed!\r\n); } HAL_Delay(10); // 100Hz读取 } }关键点数据手册务必仔细阅读AS5047P的数据手册确认寄存器地址、数据格式特别是奇偶校验位PARC的位置、I2C时序。奇偶校验AS5047P传输的数据包含一个奇偶校验位用于检测通信错误在实际产品代码中必须实现校验。磁场强度读取AGC寄存器的值可以判断磁铁距离是否合适值过低或过高都会影响精度。滤波可以在软件中对读取的角度值进行滑动平均滤波以平滑噪声。5. 常见问题与故障排查指南在实际使用中你可能会遇到各种问题。下面是一个快速排查清单问题现象可能原因排查步骤与解决方案PLC/控制器读不到脉冲1. 电源未接通或电压不对。2. 接线错误A/B相反、共地点不对。3. 编码器损坏。4. PLC高速计数器未正确配置或使能。5. 信号类型不匹配NPN/PNP。1. 用万用表测量编码器电源电压。2. 对照手册检查接线特别是A/B相和电源极性。3. 用示波器或逻辑分析仪直接测量编码器输出引脚是否有波形。4. 检查PLC配置确认HSC已启用、计数模式正确、输入点分配无误。5. 确认编码器输出类型NPN/PNP与PLC输入电路兼容。计数值不稳定、跳动1. 电源噪声或接地不良。2. 信号受到强电磁干扰。3. 编码器机械安装松动或轴套打滑。4. 传输距离过长信号衰减。5. PLC输入滤波时间设置不当。1. 检查电源质量使用稳压电源确保良好共地。2. 使用屏蔽电缆并将屏蔽层单端接地。远离电机、变频器等干扰源。3. 紧固编码器安装螺丝检查联轴器是否紧固、对中。4. 对于长距离传输优先选用差分输出RS422编码器。5. 适当增加PLC输入点的滤波时间常数。绝对值编码器通信失败1. I2C/SPI总线接线错误SCL/SDA接反。2. 上拉电阻缺失I2C总线需要上拉。3. 通信速率过高。4. 从设备地址错误。5. 协议时序不符合要求。1. 用示波器检查SCL和SDA线上是否有正确的波形。2. I2C总线的SCL和SDA线必须接上拉电阻通常4.7kΩ。3. 降低I2C或SPI的时钟频率尝试。4. 确认芯片的7位地址AS5047P为0x40注意HAL库等可能需要左移一位。5. 严格遵循数据手册的读写时序特别是建立和保持时间。位置出现累积误差1. 增量编码器在高速下丢失脉冲。2. 计数溢出未正确处理。3. 机械传动存在背隙。1. 检查编码器最高响应频率是否高于实际转速产生的脉冲频率。选择更高响应频率的编码器。2. 在软件中实现32位或64位长整型计数并处理计数器溢出事件。3. 机械背隙非编码器问题需优化机械结构或进行软件补偿。上电后绝对值编码器位置不对1. 多圈计数器电池耗尽对于依赖电池的多圈编码器。2. 磁铁位置移动或脱落。3. 单圈绝对值编码器但机械零位未对齐。1. 更换电池。对于无电池多圈编码器如采用韦根发电或齿轮组机械计数检查其机械结构。2. 重新安装并固定磁铁确保气隙符合要求。3. 进行单圈校准将机械零位与编码器零位对齐。6. 工程实践与进阶要点掌握了基础应用后以下进阶知识能帮助你在实际项目中做得更稳健、更高效。信号调理与抗干扰差分传输是王道在工业环境尤其是长距离或靠近变频器、电机时务必选择差分输出RS422/485的编码器并使用双绞屏蔽线。终端电阻高速或长距离差分传输时在接收端并联一个120Ω的终端电阻可以抑制信号反射。电源隔离为编码器使用隔离的DC-DC电源模块可以有效切断地环路引入的干扰。软件层面的鲁棒性处理溢出处理对于增量编码器使用32位或64位变量进行计数累加。在中断或循环中计算本次计数值与上次的差值即使底层16位计数器溢出也能得到正确的位置变化量。int32_t total_count 0; uint16_t last_hsc_value 0; void HSC_Update(void) { // 在HSC中断或定期调用 uint16_t current_hsc READ_HSC(); int16_t delta (int16_t)(current_hsc - last_hsc_value); // 处理16位有符号差值 total_count delta; last_hsc_value current_hsc; }软件滤波对读取的原始位置或速度值进行滤波如滑动平均滤波、一阶低通滤波可以平滑噪声但会引入相位滞后在高速控制中需谨慎。异常诊断定期读取编码器的状态寄存器如果支持如AGC值磁场强度、错误标志等实现预测性维护。多圈绝对值编码器的选择电池备份型内部有电池为圈数计数器供电。优点是真绝对值缺点是需要维护电池。机械齿轮型通过一套齿轮组机械记录圈数无需电池。优点是免维护缺点是体积可能稍大有机械寿命。韦根发电型利用韦根效应在旋转时发电并为内部超级电容充电用以保存圈数信息。是一种平衡的方案。与伺服驱动器的集成 在现代伺服系统中编码器通常直接连接到伺服驱动器如松下、安川、西门子V90等。驱动器内部完成了高速、精密的信号处理和解算并通过总线如EtherCAT、PROFINET、CANopen将位置、速度信息传递给上位控制器。这种情况下开发者更多是配置驱动参数和进行网络组态而非直接处理脉冲信号。从光电栅格到磁场变化从简单的脉冲计数到复杂的串行通信编码器技术是连接物理世界与数字控制系统的桥梁。希望这篇近万字的详解能帮你彻底吃透编码器的工作原理、选型要点和应用方法。记住理论结合实践是关键拿出一块开发板、一个编码器亲手接上线写几行代码读取它的数据观察波形你会有更深刻的体会。在复杂的运动控制项目中稳健的硬件连接、清晰的信号处理和鲁棒的软件逻辑是确保系统长期稳定运行的基础。
返回列表