ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

编码器信号链路全解析:从正交脉冲到速度测量与干扰排查

编码器信号链路全解析:从正交脉冲到速度测量与干扰排查 一台伺服电机在客户现场跑了两小时突然报“脉冲值不匹配”上位机显示的位置和实际位置差了半圈另一台设备的转速波形低速段毛躁得厉害PID怎么调都压不下去。这两个问题最后追根溯源都不是控制算法的锅而是编码器信号链路出了问题。做运动控制这些年我越来越确认一件事天天和编码器打交道的工程师不少但真正搞明白“编码器读到的到底是什么”的人没有想象中那么多。编码器本身压根不知道速度也不知道绝对角度它只做一件事——在转动时输出一串电平跳变也就是我们常说的脉冲。位置、速度、方向全是外部系统根据这串脉冲“解读”出来的。先说清楚这篇只聊运动控制里的旋转编码器别和视频编码、深度学习自编码器混成一锅粥。下面我把从脉冲到速度的整条链路捋一遍正交信号原理、倍频计数、三种测速方法的误差边界以及调试现场最容易栽跟头的干扰和参数不匹配问题。搞电机控制、机器人、自动化设备的兄弟可以直接对照着排查刚入门的朋友跟着走一遍也能把原理吃透。1. 编码器输出的不是速度而是一串“有意义的边沿”1.1 增量式旋转编码器码盘、码道和脉冲的生成过程增量式旋转编码器的核心是一个码盘和一组光电检测器件。码盘上均匀分布着透光和遮光的栅格发光管和接收管分别位于码盘两侧。码盘转动时接收管交替看到透光区和遮光区内部比较器输出一组方波脉冲。码盘上栅格的总数就是编码器的“线数”常见的有100、250、512、1000、2000、2500、5000线。每转一圈输出方波的周期数就等于线数这就是编码器最基本的物理分辨率。所谓“3码道”对增量编码器来说通常指的就是A、B、Z三路通道。码盘上刻有三圈栅格A码道和B码道的栅格分布完全相同但相位错开90度Z码道只有一道零位栅格每转一圈输出一个Z脉冲用于标记机械零点。除光电式之外磁编码器是另一大类它用霍尔元件或磁阻传感器感知旋转磁铁的磁场角度再在内部合成ABI脉冲输出。物理原理不同但对外接口信号的行为和光电式一致所以从控制器视角看它们都是“脉冲源”。1.2 为什么方向判断必须靠两路信号正交脉冲的时序逻辑如果编码器只输出一路脉冲我们最多能算出转速算不出转向。A相和B相的出现解决了这个问题两路方波相位差恒定90度这组信号叫正交信号。电机正转时A相上升沿先来B相随后反转时顺序反过来。外部电路只要检测这两个边沿的先后顺序就知道该加数还是减数。一个容易理解的生活类比是过斑马线斑马线是横向条纹你从左往右过和从右往左过看到的条纹先后顺序完全相反。A、B两路脉冲就相当于两条错开的斑马线只有同时观察它们才能确定“方向”。实际的增量编码器数据手册都会给一张时序图正转时A超前B约90度反转时B超前A约90度。硬件正交解码器本质上就是一个边沿状态机每来一个边沿就根据当前状态决定计数值加一还是减一。1.3 Z相零脉冲一圈一个给位置一个“锚点”增量编码器断电后计数值清零机械位置随之丢失。为了让位置有意义码盘上会额外刻一圈零位栅格这就是Z相。每转一圈输出一个窄脉冲脉冲宽度通常接近一个A/B周期电机每转一圈只出现一次。Z相存在的意义是给相对位置提供一个“锚点”上电后先让设备慢速运动直到捕获Z相脉冲此时的位置就被定义为机械零点。实际做回零程序时通常先用光电开关或限位开关做粗定位让电机在Z相附近慢速爬行再用Z相跳变沿做精确定位这样才能避开Z相附近可能出现的抖动区间。一个常见的误区是有人以为编码器输出的计数值本身就是绝对角度其实那只是从“上电时刻”开始的相对位置。真要拿到机械绝对位置要么找Z相要么直接用绝对式编码器。2. 谁在解读脉冲倍频、计数器与“位置到底是多少”2.1 1x/2x/4x倍频你的分辨率远不止“线数”很多人把编码器分辨率等同于线数这是另一个高频误区。A、B两路正交方波的一个完整周期里存在四个跳变沿A上升沿、B上升沿、A下降沿、B下降沿。如果我们对每个跳变沿都计数一圈获得的脉冲数就是线数的4倍。这就是1x、2x、4x倍频的由来只计A相上升沿是1x同时计A相上升沿和下降沿是2x两路四个边沿都计是4x。工程上2000线编码器配4倍频后每转的计数总量是8000。很多驱动器或运动控制卡默认按4倍频工作如果你在配置界面里把“每转脉冲数”填成2000整个电子齿轮比和位置换算就全部对不上。我见过不止一个现场问题是这种低级参数错位引起的原理不难难的是没人往这个方向想。2.2 硬件解码从STM32编码器模式到PLC高速计数器正交信号边沿频繁且方向依赖前后两路状态靠CPU逐边沿判断会成为性能瓶颈所以主流方案是用硬件正交解码。STM32系列定时器自带编码器接口模式。以定时器为例A相接TI1B相接TI2配置编码器模式为TI12两路同时参与计数定时器内部就会根据A/B的相位关系自动加减TIMx_CNT寄存器里的值直接就是倍频后的位置值。核心配置大致如下// STM32 HAL 编码器接口模式基本配置示意 htim3.Init.Period 0xFFFF; // 16位计数范围 HAL_TIM_Encoder_Init(htim3, sConfig); sConfig.EncoderMode TIM_ENCODERMODE_TI12; // A和B都参与4倍频 sConfig.IC1Polarity TIM_ICPOLARITY_RISING; // A相上升沿触发 sConfig.IC2Polarity TIM_ICPOLARITY_RISING; // B相上升沿触发 HAL_TIM_Encoder_Start(htim3, TIM_CHANNEL_ALL);需要注意编码器输出的电平必须落在定时器引脚允许的范围内。3.3V只能直接接3.3V输出的编码器5V输出要么用电平转换要么按开漏再接上拉的方式处理否则长期工作可能损伤引脚。PLC上的高速计数器HSC原理类似通过组态软件选择“正交计数模式”同样由硬件完成加减计数。TI的DSP则是用eQEP模块在CCS工程里配置输入引脚、倍频系数和位置初始值思路完全一致。2.3 计数值本身没有单位位置换算与多圈扩展硬件计数器读回来的只是一个整数这个整数代表什么完全取决于你把它放进什么坐标系。角度换算很简单当前角度 计数值 / 每转总计数 × 360度。如果要换算成直线位置再乘丝杆导程如果经过减速机再除减速比。所以计数值本身没有单位单位是外部换算赋予的。另一个绕不开的问题是溢出。16位计数器可计范围只有0~65535一旦速度高、时间一长必然翻转。正规做法是在更新中断里把上溢和下溢次数记录下来由软件把计数值扩展成一个32位甚至64位的大计数。但这里有个工程前提中断响应必须快过计数脉冲频率否则溢出事件会丢失位置就错了。高转速大减速比场合宁可换32位计数器或降低倍频也别指望一个慢中断能兜住海量边沿。3. 从计数值到速度M法、T法和M/T法各有各的误差边界3.1 先给结论没有一种测速方法能通吃所有转速区间速度的本质是“单位时间内的脉冲数变化量”但脉冲到达是离散事件并非连续信号。怎么在一个有限窗口里把离散事件变成平滑速度值就是测速算法要解决的事。最常用的三种方法是M法、T法和M/T法。它们的共同核心公式是转速n(r/min) 每秒脉冲速率 / 每转总计数 × 60区别只在于“每秒脉冲速率”怎么测而测法直接决定误差特性。3.2 M法测频法固定窗口数脉冲高速区间越用越准M法也叫测频法固定一个时间窗口T计数窗口内的脉冲数C每秒脉冲速率 C / T转速公式为n 60 × C / (T × N)其中N是每转总计数含倍频。M法的误差来源是窗口边界带来的±1个脉冲量化误差。窗口时间固定时转速越低窗口内脉冲数越少相对误差越大。以2000线编码器、4倍频、N8000为例窗口取100ms3000r/min时窗口内脉冲数约40000个±1的量化误差可以忽略30r/min时窗口内只有400个脉冲误差约0.25%3r/min时窗口内只有40个脉冲误差约2.5%0.3r/min时窗口内只有4个脉冲误差直接飙到25%基本不可用。所以M法只适合中高速区间。想要它兼顾低速就得拉长窗口但窗口拉长又牺牲了实时性这里永远是矛盾。3.3 T法测周期法测相邻脉冲间隔低速越用越准T法换了个思路不追求窗口而是测量相邻两个脉冲边沿的时间间隔Δt。间隔越短说明脉冲越密速度越高。转速公式为n 60 / (N × Δt)Δt如何测准通常用高频时钟计数假设时钟频率为f_clk间隔对应的时钟计数值为H则Δt H / f_clk。T法的量化误差同样来自±1个时钟计数但影响方向和M法相反转速越高脉冲间隔越短H越小时钟量化误差越大。仍以N8000为例用10MHz高频时钟3000r/min时Δt 60 / (8000 × 3000) 2.5μsH只有25个±1个时钟就是4%误差30r/min时Δt 250μsH 2500个误差约0.04%3r/min时Δt 2.5msH 25000个误差几乎可忽略。T法还有一个天然短板转速为零时没有脉冲边沿测不到速度必须靠超时判断强制归零。3.4 M/T法同步计数把误差约束在一个脉冲之内M/T法的思路是把计数窗口和脉冲边沿对齐先定义一个名义窗口但真正的测量终点不是窗口到点而是窗口到点之后出现的下一个有效脉冲边沿。这样一来窗口内包含的一定是整数个脉冲同时用高频时钟记录这个“被修正的窗口”的真实时长H。最终转速公式近似为n 60 × C / (N × (H / f_clk))C是窗口内实际脉冲数H是高频时钟计数。由于C和H的计数边界是同步的量化误差被压制在一个时钟级别低转速和高转速都能保持较高的相对精度。这也是多数伺服驱动器内部实际采用M/T法或类似“等精度测速”的原因。代价是实现稍复杂且硬件上需要有高频时钟和一个可被边沿同步锁存的计数器组。3.5 实测对比与选型建议把三种方法放在同一个场景N8000M法窗口10msT法时钟10MHz对比如下实际转速M法误差10ms窗口T法误差10MHz时钟谁更合适3000r/min±0.025%±4%M法300r/min±0.25%±0.4%两者接近30r/min±2.5%±0.04%T法3r/min±25%±0.004%T法这不是说M法绝对不行而是要看你的用场额定转速高、采样周期固定的速度环M法简单可靠点动、爬行、低速定位T法更准对稳定性和带宽都有要求的伺服级应用直接上M/T法。4. 信号链路上的坑从脉冲注入到“脉冲值不匹配”报警4.1 编码器输出方式集电极开路、推挽还是RS422差分脉冲信号能不能被控制器正确读到很大程度上取决于编码器的输出电路形态。常见有三种首先是集电极开路输出。信号线通过一个外接上拉电阻到电源编码器内部晶体管导通时拉低释放时电阻把线路拉高。这种输出兼容性好电平可以通过上拉电源选择但上拉电阻和线缆电容会构成RC低通限制传输频率。电阻选得越大边沿越缓抗干扰越差选得太小灌电流会加大编码器发热。常规3~5米短线用1k~4.7k比较稳妥。其次是推挽输出。高电平和低电平均由输出级主动驱动边沿更陡、驱动能力更强适合中等距离。最后是RS422差分输出。每个通道都有正负互补两线接收端只看差分电压对共模干扰的免疫能力最强。只要传输距离超过10米或者编码器线和动力线不得不走近就优先选差分输出。“5V脉冲与5V电源互不干扰”这件事本质是地环路问题。如果编码器供电来自一个独立开关电源而控制器又是另一个地信号线和地线就会形成环路PWM高频噪声通过地电位差灌进脉冲信号里。最省心的做法是让编码器电源由接收端的5V输出统一提供两边共地且地线短租如果必须独立供电则要用隔离电源或光耦隔离直接把电气联系切断。4.2 干扰排查手法用“脉冲注入”把问题段切开现场一出现丢脉冲、多脉冲很多人第一反应是换编码器但问题往往不在编码器本身。脉冲注入法能把故障段快速切出来先断开编码器用信号发生器往计数器输入端注入固定频率、固定数量的方波脉冲例如1kHz频率注入1000个脉冲读取计数器结果。如果注入结果完全等于理论值说明计数电路、倍频配置、软件换算整条链路没有问题故障大概率出在编码器、传输线或供电质量如果注入结果就不对说明计数配置本身有问题检查倍频、计数模式、触发电平。注入时要用与实际工况接近的电平幅度和频率别拿3.3V脉冲去模拟一个实际工作在5V差分信号的环境。4.3 完整案例一次“脉冲值不匹配”报警的排查链路之前处理过一台设备的顽固报警现象是运行几十分钟后驱动器报“脉冲值不匹配”上位机发出指令脉冲数和反馈累计脉冲数差了一截。第一次复位还能继续跑间隔越来越短最后每次开机不久就报警。排查链路是这样的先确认报警触发条件是“指令脉冲与反馈脉冲偏差超过阈值”问题集中在反馈链路。随后用脉冲注入法断开编码器注入1000个1kHz脉冲计数器读数准确说明计数硬件和配置没问题。接回编码器用示波器同时看A、B相和编码器5V供电发现一个问题电机加减速瞬间A相波形上出现明显的毛刺和凹陷5V电源也有同步抖动。再往下查编码器供电来自一个外置24V转5V模块这个模块的地线单点接到了驱动器动力地编码器信号地又在控制器侧形成了地环路。同时编码器线和伺服动力线在同一线槽里走了将近20厘米。两个因素叠加PWM噪声被灌进脉冲信号丢失几十个脉冲后被驱动器阈值检测发现。解决办法并不复杂把编码器供电改成由控制器侧5V输出直接提供编码器线单独穿管屏蔽层单端接到驱动器地AB信号进入控制器前加了一级RC硬件滤波大约100Ω配1nF。改完连续跑了八小时报警没有再出现。这个案例很典型脉冲信号“看着没问题”不代表高速动态下没问题示波器一定要盯住加减速瞬间的波形。5. 不止是脉冲绝对式编码器和磁编码器带来更省心的玩法5.1 AS5047P这类磁编码器SPI直接读角度还保留ABI输出AS5047P是一款14位磁角度编码器芯片通过感知贴在电机轴端的小磁铁的磁场方向输出0~16383之间的绝对角度值和码盘完全没关系天然不怕油污、粉尘和轻微振动。它的SPI接口可以直接读出当前绝对角度控制器上电后无需回零就能知道位置。但有意思的是这类芯片同时还可以配置成ABI增量输出模拟传统正交编码器信号甚至输出UVW三相换相信号给无刷电机做换向。为什么绝对式芯片还要保留ABI输出因为大量伺服驱动器和运动控制卡只接受正交脉冲输入硬件计数器直接数边沿的实时性远高于SPI轮询SPI绝对角度则留给上电初始化时用。所以磁绝对式编码器并没有淘汰ABI而是“两条腿走路”。需要注意的坑是磁编码器的安装偏心磁铁必须与芯片中心对齐偏离哪怕零点几毫米都会引入谐波误差转速越高偏差越明显。装磁编码器时得做专门的轴端定位工装不能随手粘一颗磁铁了事。5.2 I2C编码器小系统里的低成本角度反馈另一类很接地气的是I2C接口磁编码器比如12位精度的AS5600模块SDA、SCL两根线就能读回0~4095的角度数据。这类方案非常适合云台、机械臂关节、人机交互旋钮等低速角度反馈场景成本低廉几块钱一个模块ST M32直接模拟I2C或硬件I2C读取即可。但I2C编码器有两个明显限制一是I2C总线速率不高通常工作在100k或400k不适合作为高速伺服的速度环反馈源二是地址冲突多片同型号AS5600挂一条总线上时地址相同需要改地址引脚或加I2C多路开关。还有一个细节是角度从4095翻到0时要做回绕判断否则那一瞬间反馈值会从最大跳变到零。5.3 选型思路增量、绝对、磁、总线怎么搭配把常见编码器方案放在一张表里方便直接对比方案输出形态是否需回零典型精度/分辨率成本适合场景光电增量式A/B/Z脉冲需要100~5000线低通用伺服、步进闭环磁增量式AS5047P类ABISPISPI免回零ABI需回零14位角度中关节电机、防油污环境I2C磁编码器AS5600类I2C不需要12位角度低DIY、低速角度反馈总线绝对式SSI/BISS/CANopen不需要单圈17~23位可多圈高高端数控设备、高精度机床我做运动控制调试这么多年最大的体会是编码器读到的从来只是一串脉冲但这一串脉冲信不信得过才是整个系统稳不稳的根。调系统之前先花五分钟用示波器看一眼A、B两路的波形确认信号干净了再整定参数每修改一次编码器线数、倍频、电子齿轮比就把配置截图存档。速度抖动能靠算法压位置跑偏能靠补偿拉但信号链路本身不过关再好的算法也拦不住随机丢脉冲。把“从脉冲到速度”这条链路从原理到实践走一遍你就不再会被编码器问题牵着鼻子走了。
返回列表