做运动控制的这些年,编码器这东西没少折腾。每次接到旋转台、机械臂关节或者AGV转向轮的项目,总会碰到一个绕不开的问题:这台设备要不要无限旋转?如果要,那“绝对式编码器”怎么配、怎么调,才能既保住绝对位置不丢,又让电机想转几圈转几圈?今天就把我在这块儿积累的配置经验和优化思路一次性倒出来,给正在跟编码器和伺服控制较劲的朋友一个参考。
先明确一个概念:咱们说的“无限旋转”,不是让电机的物理角度真的没有终点,而是在控制器看来,角度值可以一直累加下去,不因为超出编码器的机械量程而归零、跳变或报错。单圈绝对式编码器只能管好一圈以内的位置,多圈绝对式编码器能管几千圈,但再往上也有上限。真正要“无限”,要么选对硬件,要么在软件层做文章。这篇博文就把从选型、接线、配置到过零处理、三环配合、干扰排查的路走一遍,适合做伺服调试、非标自动化、机器人关节和旋转平台的朋友参考。
1. 无限旋转的应用场景与哪些地方被卡脖子
1.1 什么工况真的需要“不限圈数”
先说需求。很多人以为只有机械臂这种看起来高级的设备需要无限旋转,其实日常项目里遍地都是。
旋转分度台是最典型的。工件加工完一个角度要继续转,分度台往往朝一个方向连续转动,一圈两圈是小意思,有些工艺一跑就是几十圈。如果编码器量程不够,控制器就得频繁处理“角度溢出”,一个处理不好,分度精度就崩了。
AGV和移动机器人的转向轮也绕不开。比如舵轮总成里的转向电机,现场调度时转向角度往往是连续变化的,可能这一趟正着转了三十圈,下一趟又要反向转回去,角度累计范围远超单圈编码器的量程。这里还是用绝对式编码器做转向闭环,你总不能每次上电都让车原地找零吧。
再有就是绕线机、绞盘、风电机组偏航机构这类单方向累积旋转的设备。设备长期运行起来,累计圈数就是个天文数字,设计的时候必须把编码器量程和软件处理一并搞定。
这些场景的共同点有两个:一是电机要转的圈数没有明确的“上限”;二是断电重启之后,设备还得知道自己的绝对姿态。这两条凑在一起,就把增量式编码器和普通单圈绝对式编码器的短板全暴露了。
1.2 为什么增量式、普通绝对式在无限旋转上这么难办
增量式编码器输出的是A/B/Z脉冲,控制器通过数脉冲知道转了多少,但它压根没有“绝对位置”的概念。断电再上电,你只知道“刚才我数到哪了”,却不知道“电机实际在哪”。所以用增量式的设备必须配原点开关,每次上电都执行回零动作。放在旋转台上倒还好,放在AGV这种没法做固定原点的设备上就难看了,总不能每次开机都让车把转向轮甩一圈去找开关。
单圈绝对式编码器比增量式强在“上电就知角度”,但它内部的位置值只在0到单圈分辨率之间循环。转完一圈回到0,位置值突然从最大值跳到0,如果控制器没有做好跨圈处理,位置环就会产生一个巨大的误差信号,轻则“咔”一下抖动,重则直接冲行程报警。
这里有一个特别容易被新手忽略的坑:单圈绝对式编码器的“上电即知位置”,指的是在一圈以内有效。你要是让它转了三圈,断电再上电,它给回来的角度和第一圈没有任何区别,控制器根本分不清现在到底是第一圈还是第三圈。所以要做无限旋转,单圈绝对式的硬件量程是远远不够的。
增量式编码器和绝对式编码器的这个差异,我放个表格方便大家对照:
| 维度 | 增量式编码器 | 单圈绝对式 | 多圈绝对式 |
|---|---|---|---|
| 是否知道绝对角度 | 不知道 | 一圈内知道 | 多圈范围内知道 |
| 断电记忆 | 无,需回零 | 有 | 有 |
| 量程 | 无限(靠软件计数) | 360度 | 有限圈数(如4096圈) |
| 过零处理 | 相对简单 | 必须处理 | 必须处理 |
| 做无限旋转难度 | 高(丢步/回零问题) | 高(量程不够) | 中等(需规划量程) |
看完这张表,大家应该就明白了:无限旋转的硬件基础,最好还是落在多圈绝对式编码器上。但多圈编码器也不是装上就能用,选型和配置里门道多得很,继续往下看。
2. 绝对式编码器选型:单圈、多圈、电子多圈怎么选
2.1 绝对式编码器为什么能“记住位置”
先说原理。绝对式编码器码盘上有好几圈码道,每圈码道对应一位二进制数,码道上透明和不透明的区域按格雷码或者纯二进制排列。码盘转动时,码道上的光电接收器读到的是一组唯一的“码字”,这个码字直接对应一个绝对角度。所以它不需要像增量式那样“从零开始数”,通电的一瞬间,看一眼码盘就知道当前角度。
单圈编码器只关心“这一个圆里转到哪”,码盘上读到的码字最多只能区分一圈内的位置。多圈编码器则在这个基础上加了“圈数记录机制”,常见的有两种实现方式。
一种是机械多圈,内部靠齿轮组带动几圈独立的码盘。比如12位多圈,就是一组减速齿轮带着另一个小码盘转,每转一圈记一个数,能记4096圈。这种方案的好处是断电后完全靠机械位置记忆,不需要电池,抗干扰能力也强,海德汉、多摩川的不少老款多圈编码器都是这个路子。
另一种是电子多圈,芯片内部靠低功耗电路和计数器记录圈数,断电时由一块电池给计数电路供电,保住圈数数据。BiSS-C、EnDat协议里的多圈模式很多就是这种电子多圈方案。它的好处是体积小、没有齿轮磨损,坏处是电池没电了圈数记忆也就丢了,日常维护多一件事。
2.2 编码器位数、精度和接口怎么挑
选多圈绝对式编码器,第一件事就是看“单圈位数+多圈位数”。比如一个编码器标称“17位单圈/12位多圈”,意思是单圈分辨率17位,也就是2的17次方等于131072线,一圈能分辨出13万个位置;多圈12位,能记录4096圈。折算下来,单圈最小分辨角度是360除以131072,大概0.0027度,做一般旋转台和关节完全够用。
需要提醒的是,“分辨率”不等于“精度”。分辨率是编码器能输出的最小位置变化,精度是它实际输出的角度值和真实角度之间的偏差。码盘刻线误差、光栅安装偏心、轴承间隙都会影响精度。所以选型时别只盯着分辨率看,要去翻数据手册里的“精度”指标,一般±0.02度到±0.005度之间比较常见。
接口选型同样关键。做伺服控制,接口方式直接决定了位置数据能不能及时、稳定地送进控制器:
| 接口类型 | 数据帧格式 | 实时性 | 典型应用 |
|---|---|---|---|
| SSI | 时钟+数据同步串行 | 中 | 通用伺服、PLC端子 |
| BiSS-C | 高速双向串行 | 高 | 高动态响应伺服 |
| EnDat | 双向串行,带诊断 | 高 | 高端数控机床 |
| CANopen | 总线式 | 中 | 多轴分布式控制 |
| EtherCAT | 以太网现场总线 | 高 | 高端运动控制 |
做单轴伺服、对实时性要求不算极限的,用SSI就够了,简单稳定,PLC和伺服驱动器几乎都支持。做多轴插补、机器人关节这种对同步性和动态响应要求高的,优先看BiSS-C和EtherCAT编码器,数据更新率可以做得很高,也不会因为帧格式太老拖累控制周期。
2.3 选型避坑:别只看分辨率
选型阶段最容易踩的坑,我按出现频率排个序。
第一坑是“分辨率很高但精度拉胯”。有些国产编码器标称21位,实际精度连±0.05度都到不了,用在转台上做粗定位看不出啥,一上精加工就没法看。我的做法是选型时直接看精度和重复精度,这两个指标才是机械加工和运动控制真正关心的东西。
第二坑是“电池多圈当成机械多圈用”。有些设备长期高温运行,电池寿命会明显缩水,编码器断电时间一长,圈数数据就丢了,上电位置就错乱。选型时如果没法保证定期换电池,就老老实实选机械多圈。
第三坑是“接口兼容性没提前确认”。曾经有个项目,控制器用的DSP28379,编码器接口硬件倒是支持SSI,结果客户发过来的编码器是BiSS-C协议的,读出来的数据全是乱的,最后还得加转换板。项目前期一定确认驱动器或控制器支持的编码器协议列表,别等装机了再返工。
3. 无限旋转的几种实现方案与配置步骤
3.1 方案一:多圈绝对式编码器直接上
这是最省心的路子。选一个多圈绝对式编码器,接好线,配置好驱动器和控制器,位置数据里就自带圈数信息,无限旋转的范围取决于多圈量程。
具体配置步骤我拿一个常见的伺服项目举例。假设电机端装了一个17位单圈/12位多圈的SSI绝对式编码器,连接到支持SSI的伺服驱动器。
第一步,接线。SSI接口一般四根线,时钟+、时钟-、数据+、数据-,外加电源正负。时钟线由驱动器发出,编码器在时钟脉冲的驱动下把位置数据按帧返回。这里有个细节:SSI的线要用双绞屏蔽线,屏蔽层单端接地,不然脉冲边沿很容易被干扰,读回来的数据偶发跳变。
第二步,在驱动器里设置编码器类型和分辨率。不同品牌的驱动器界面参数名不一样,但核心内容就是“编码器类型”选“绝对式SSI”,“单圈位数”填17,“多圈位数”填12。填错一位,角度算出来就是天差地别。
第三步,设置单圈方向和多圈方向。这个要和电机实际转向对应上。最简单的方法:先设成默认方向,手动盘一下电机轴,看软件里角度值是否朝预期方向变化,不对就改方向参数。
第四步,定义零点。绝对式编码器的码盘上有一个物理零位,但往往不是你想要的机械零点。比如旋转台的新零点应该在工件装夹位置,而不在码盘出厂零位。所以驱动器都会提供“零点偏移”功能,把设备摇到机械零点,然后把当前位置记录成位置偏置值。做完这一步,控制器的所有角度值就都以机械零点为基准了。
第五步,验证。上电后手动让电机转几圈,确认角度值连续变化、没有跳变;再断电重新上电,确认角度值还是断电前的位置,验证多圈记忆功能正常。这一步千万不能省,很多“上电飞车”事故就是这一步没做透。
3.2 方案二:单圈绝对式 + 软件虚拟多圈
有的项目成本敏感,或者机构本身物理上就不允许转太多圈,这时候用单圈绝对式编码器配合软件虚拟多圈,也能实现“软件意义上的无限旋转”。
原理很简单:单圈绝对式编码器每圈返回一个0到最大分辨率之间的位置值,控制器自己维护一个圈数计数器。检测到位置值从接近最大值跳到接近0时,圈数加一;反过来从接近0跳到接近最大值时,圈数减一。最后的连续角度等于“圈数乘360度加单圈角度”。
这个方案有两个必须解决好的问题。第一个是断电保持,圈数计数器必须存到掉电不丢失的存储器里,比如控制器的非易失区或者带电池的静态内存。第二个是阈值判断,圈数加一减一的判断阈值不能太靠近0和最大值,得留出滞回区间,不然在临界点附近来回抖,圈数就开始乱加了。比如17位编码器最大值131071,可以设定位置值大于130000时认为接近正向过零,小于1000时认为接近反向过零,中间区域不做跳变判断。
这个方案我已经在好几个低成本旋转机构上验证过,只要断电时编码器位置不丢、控制器存储正常,长期运行圈数计数还是稳定的。缺点也很明显:圈数数据是“软件记忆”,一旦复位或者存储区出错,圈数就对不上了,设备得像增量式那样重新做一次回零。
3.3 配置检查清单
配置做得多了,我习惯列一个检查清单,每次快速过一遍:
- 编码器协议、位数、方向是否和驱动器配置一致
- 零点偏移是否已经设置并保存
- 多圈数据是否通过断电上电验证
- 软限位(软件角度限位)是否设置,避免越程损坏机构
- 编码器供电电压是否稳定,电池型多圈电池电压是否正常
- 接线屏蔽层是否单端接地
这个清单看着简单,但每一项都对应过一次真金白银的事故。比如软限位那条,有个旋转台项目因为没设软限位,调试时电机疯狂朝一个方向转,线缆直接缠断。从那以后,我每次配完编码器第一件事就是设软限位。
4. 精度与稳定性优化:过零、滤波、三环配合
4.1 过零点处理算法
配置好编码器只是第一步,真正让无限旋转转得稳、转得准,核心在过零处理。我认识的不少同行,设备“嗡嗡”振动或者一转就咔咔响,十有八九是过零逻辑没做好。
问题是这么来的:编码器的位置值有量程上限,当电机从359.9度往0.1度方向转时,位置值直接从最大跳到最小。控制器的位置环如果拿这个原始值做误差计算,这次采样误差可能是“0.2度”,下一次却变成“最大分辨率-当前位置”,一个巨大的误差阶跃就进来了,位置环的输出瞬间饱和,电机当然要发抖。
解决思路是差值处理,也就是把位置值先换算成“连续角度”,再进位置环。代码示意如下:
// 编码器读取:high位为圈数,low位为单圈位置 // 假设单圈17位,最大单圈值 131071 int32_t raw = read_ssi_encoder(); // 读原始数据 int32_t turns = raw >> 17; // 提取圈数 uint32_t pos = raw & 0x1FFFF; // 提取单圈位置 0~131071 // 连续角度(单位:0.0001度,整数运算避免浮点) int32_t angle_x1e4 = turns * 3600000L + (int32_t)pos * 3600000L / 131072L;这是常规计算。但真正的跨圈场景,比如从第一圈的尾部进入第二圈,位置值一瞬间从“最大值”变成“0”,turns变,pos也变,算出来的连续角度应当是连续的。上面的公式天然保证了这一点。
如果只用单圈编码器做虚拟多圈,差值处理的核心逻辑是这样的:
// 单圈角度 current_deg 在 0~359.999 范围内 static float last_deg = 0.0f; static float accum_deg = 0.0f; float delta = current_deg - last_deg; if (delta > 180.0f) delta -= 360.0f; // 正向过零:359.9 -> 0.1 应减出小负值 if (delta < -180.0f) delta += 360.0f; // 反向过零:0.1 -> 359.9 应加上小正值 accum_deg += delta; last_deg = current_deg;这段代码里的180度就是过零判断的阈值,等价于在0和最大值附近各留了一个“安全带宽”,保证正常的转动不会误触发跳变。实际使用还要再做一层滤波,抑制编码器噪声带来的微小抖动。
做过零点处理时,程序扫描周期越短越好。位置环的周期一般在125微秒到1毫秒之间,如果过零判断的周期和位置环周期错开,或者中间隔着通信延时,就会出现“这帧还是359.9度、下一帧突然变成0.1度”的尴尬,再好的差值算法也救不回来。
4.2 零点标定与方向修正
无限旋转的项目,零点标定比单圈定位项目要做得更仔细。原因是圈数多了以后,任何一点零点偏移都会被放大到速度环和位置环的误差里。
我常用“三次标定平均值”的方法。把设备摇到机械零点,记录当前位置偏移值,然后分别从正方向和反方向各摇一次重新标定,取三次的平均值作为最终偏移。这么做可以抵消机械回程差和人工操作误差。有些高端驱动器和控制器还支持“电子凸轮式零点”,可以做动态零点修正,但对于大多数项目,三次静态标定已经够用。
方向修正也要跟上。电机正转时编码器角度应该增大,如果发现是反向的,与其在硬件上改接线,不如先去找驱动器的方向参数。SSI接口的数据方向一般由编码器安装方式决定,改参数是更快的路子。但要注意:修改方向参数后,多圈计数方向也会跟着变,必须重新做一次过零验证。
4.3 反馈信号滤波与抗干扰
绝对式编码器的数据比增量式的抗干扰性强不少,毕竟走的是数字帧。但在电机高频运动或者变频器附近,信号完整性问题依然存在,主要坑在两个地方。
一个是SSI时钟频率太高导致的反射和毛刺。有些工程师恨不得把SSI时钟拉到最高速,结果数据线上信号边沿振铃严重,读回来的位置偶发跳变。我的建议是所有SSI线长超过1米时,时钟频率控制在2MHz以下,必要时在驱动器的协议配置里打开滤波选项。
另一个是供电地回路。编码器的电源和电机的电源共用一个开关电源,高频电流波动会把编码器供电电压拉出尖峰,导致编码器逻辑错乱。对付这个,编码器电源最好单独一路,或者至少加一个LC滤波器。别小看这个,我有个项目就是电源干扰导致编码器数据偶发多圈乱跳,排查了整整两天才锁定是地线干扰。
软件滤波方面,最容易见效的是“中值滤波+限幅滤波”。对编码器数据连续采样三次取中值,中值和上一次的值差如果超过一个阈值(比如0.5度),就认为本次数据无效,沿用上一帧数据。这个策略既能滤掉通信毛刺,又不会像均值滤波那样把真实的高速运动信号拉钝,做运动控制很实用。
4.4 与伺服三环控制的配合
无限旋转不只是编码器自己的事,它跟伺服的三环控制咬得很紧。说说我的理解。
电流环在里层,周期最快,一般125微秒以内;速度环中间,周期几百微秒;位置环在外层,周期一般1到2毫秒。编码器反馈是速度环和位置环的数据来源,所以编码器数据更新率必须快于外环的执行周期。假如位置环周期1毫秒,编码器数据更新率却只有4毫秒一次,那位置环大部分时候都在拿旧数据凑合,跟随误差自然大。
高频运动更敏感。做振动抑制或者轨迹跟踪的时候,位置环的带宽上限很大程度取决于反馈延迟。用SSI这种查询式接口,CPU主动发起通信请求,数据从编码器到控制器之间有时间差;用BiSS-C或者EtherCAT这类带同步机制的接口,数据更新时间可以和控制周期强同步,延迟小很多。这也是为什么高动态伺服项目普遍抛弃SSI的原因。
三环参数配合上,编码器分辨率提高之后,速度环的Kp可以适当加大,因为速度反馈的量化噪声变小了;位置环的Kp则要保守一点,因为过零点误差处理还没完美的时候,太激进的位置环会把过零尖峰放大成机械冲击。我一直遵循的调参顺序是:先调好电流环,再调速度环,最后才动位置环,每层都确认稳定了再往上走。
4.5 高频运动下的通信优化
电机高频动作的时候,编码器数据要跟得上指令变化。除了选BiSS-C这类高速协议,通信规划上还有一些细节。
第一,中断优先级。在DSP28379这类MCU里做编码器数据读取,中断优先级要高于位置环计算,否则位置环刚取完缓存数据,下一帧中断又把缓存改了,就会出现数据撕裂。第二,DMA传输。SSI的数据读取可以用DMA自动搬运,CPU只负责在给定周期从内存里取最新位置值,能省下不少主循环时间。第三,总线负载控制。用CANopen或EtherCAT接多台伺服时,编码器数据报文要合理安排节点和周期,别让总线在高速运动时跑满负载,一旦出现报文延迟,无限旋转的位置计算就会滞后。
这块我曾经踩过一个很具体的坑:EtherCAT总线上挂了8台伺服,每台都开着位置同步模式,一跑高速插补,其中一台编码器数据偶发延迟,导致整个轴系出现周期性抖动。后来把报文周期从1毫秒压到500微秒,并且给位置同步开了分布式时钟补偿,问题才消失。
5. 调试排错:把我踩过的坑整理成速查表
5.1 上电飞车或位置错乱,先查多圈数据
上电瞬间电机猛地冲一下,或者执行位置指令时角度直接跳到莫名其妙的位置,这种问题十有八九和多圈数据读取有关。
排查思路:先把驱动器的位置反馈显示调出来,手动缓慢盘动电机,看角度值是否连续变化。如果显示值来回跳,重点查编码器和驱动器之间的数据线、屏蔽层接地、供电电压。如果显示值稳定,但位置错乱,重点查多圈计数是否丢失,尤其是电池型多圈编码器,断电时间一长,电池电压不够,圈数数据全丢,复位之后位置自然就错了。
验证多圈功能有个笨办法:让电机从0度正向转两圈,记录角度值,断电再上电,看角度值是否还在两圈附近。不在,就说明多圈记忆根本没生效,回过去查硬件和配置。
5.2 零点漂移:机械固定比软件难搞
运行一段时间后发现设备的原点偏了,程序里的零点偏移没变,但实际机械位置已经不是原来那个零点了,这种问题最磨人。
先检查码盘和电机轴的固定。有的编码器安装用顶丝固定,振动多了顶丝会松,码盘相对轴错位,绝对值位置就漂了。解决方法是换弹性联轴器或者加强顶丝锁固,并在安装完成后做个标记,方便后续检查是否错位。
排除机械原因之后再看软件:控制器如果开了“编码器参考位置更新”之类的功能,可能在运行时被某个事件错误地修改了零点偏移。这类问题查日志就能发现,我遇到的案例基本都是误触发了急停而后控器自动记录了当前位置为新零点。
5.3 高速时丢步、位置跳变:通信时序和供电一起查
高速转到“刷刷刷”的时候,角度值偶尔跳一下,或者转速反馈出现毛刺,先别怀疑编码器坏了,大多数时候是通信时序和供电的问题。
SSI接口的编码器,高速旋转时编码器内部刷新位置数据的速度有限,如果外部时钟来的太密,编码器可能来不及更新内部寄存器,返回的数据就是旧的。这种“数据保持错误”在绝对值编码器里不算罕见。解决办法是降一点SSI时钟频率,或者在驱动器协议设置里加上“编码器数据等待时间”,给编码器一点喘气的时间。
供电电压波动也要盯紧。高速运动时电机母线电流猛增,如果编码器供电取自同一条24V线路且没有稳压措施,压降毛刺就可能影响编码器内部逻辑。用示波器挂在编码器电源引脚上看波形,一目了然。
5.4 电磁干扰导致的多圈乱跳
变频器、接触器、电磁铁这些强干扰源,离编码器线近了,多圈数据就可能随机跳变。干扰路径主要是地环路和空间辐射。
整改措施按优先级来:第一,编码器屏蔽层单端接地;第二,编码器线和动力线分开走线槽,间距保持20厘米以上;第三,编码器供电加磁环或小型滤波器;第四,控制器输入端加光电隔离或者协议芯片自带的抗干扰能力要确认开启。做完前两步,绝大多数干扰问题都能压下去。
5.5 常见问题速查表
| 故障现象 | 可能原因 | 排查手段 | 解决方案 |
|---|---|---|---|
| 上电位置错乱 | 电池没电、多圈数据丢失 | 断电再上电验证 | 换电池并重新标定零点 |
| 运行中位置偶发跳变 | 干扰、通信时钟过高 | 示波器查时钟/数据线波形 | 降SSI时钟、加屏蔽/磁环 |
| 角度值来回抖 | 码盘偏心、轴承间隙 | 安装面跳动检查 | 重新装联轴器/提升机械精度 |
| 过零时电机“咔”一下 | 过零差值算法缺失 | 查位置环误差波形 | 加过零差值处理 |
| 某方向转了几圈后偏差大 | 方向参数和多圈方向不匹配 | 正反各转一圈对比 | 修改方向参数后重设零点 |
| 编码器供电不足引起数据错乱 | 共用电源压降 | 示波器测供电纹波 | 独立供电或加LC滤波 |
调试完成之后再回头想想,无限旋转这个需求本身不难理解,难的是把编码器选型、接口规划、配置验证、过零算法、三环配合这一连串的事情都做扎实。我个人的体会是,项目初期的选型和通信规划最值得花时间,这两个环节定错了,后面调试再努力也绕不过硬件的短板。尤其做旋转分度台这类设备,编码器量程和协议一定提前和客户确认清楚,别等装机了才问“你们这个转台到底最多转几圈”,那时候返工的成本就不是调两天参数能补回来的。
最后再分享一个实用小技巧:所有无限旋转项目,保存零点偏移值时,顺手把当时的编码器单圈值、多圈值和电机机械位置一并记录到调试日志里。下次出问题想确认零点有没有被改、机械有没有滑移,翻日志一对比就能定位,能省下大量排查时间。