ARTICLE DETAIL

资讯详情

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

增量式编码器零位校准:FOC电机控制中的关键一步

增量式编码器零位校准:FOC电机控制中的关键一步 一般搞过FOC驱动的人多半都经历过这种诡异的场面代码在上一块板子上跑得好好的换个电机或者换块驱动板电机上电就嗡嗡震电流哗哗往上飙甚至直接过流保护。排查半天示波器戳来戳去最后发现是零位参数不对。增量式编码器这东西本身不告诉你绝对位置全靠上电后自己找参考点而参考点怎么找、怎么对准电角度零点就是这次要说的核心问题。标题里写了“补充6”说明这是系列文章里补的一篇。之前几篇聊过FOC的电流环、SVPWM、观测器之类的内容这篇单独把增量式编码器的零位校准拎出来不是因为别的而是这个环节是真的容易踩坑而且做不好直接影响整个FOC性能。更关键的是网上能搜到的教程大部分只告诉你“要校准”却没告诉你校准的本质是什么、不同方式之间有什么取舍、校完之后怎么验证。这篇就把这些一次性讲透。1. 为什么增量式编码器绕不开“零位校准”这件事先搞清楚一个基础问题增量式编码器到底缺什么。增量式编码器输出三路信号A相、B相、Z相。A/B两相正交脉冲用来测角度增量Z相每转一圈出一发脉冲用来对零。但本质上它上电那一刻并不知道当前的绝对机械角度是多少。它只能告诉控制器“我从上电位置开始走了多少脉冲”至于“我现在处在机械360度里的哪个位置”它说不出来。这跟绝对式编码器有根本区别。绝对式编码器上电就能读到当前角度的二进制编码位置信息掉电不丢。但绝对式成本高、结构复杂、体积大在很多电机控制场合属于“性能过剩”。增量式编码器便宜、分辨率高、响应快在伺服电机、机器人关节、航模无刷电机这些主流场景里是绝对的主流。代价就是你必须靠一套外部机制来弥补它“上电失忆”的毛病。那跟零位校准有什么关系关系很大。FOC控制里Park变换和反Park变换需要的不是机械角度而是电角度。电角度和机械角度之间隔着极对数和零位偏移而这个零位偏移恰恰取决于编码器安装的位置——码盘粘在转轴上的时候Z信号出现在哪个机械角度是完全不确定的。你换一个码盘、换一个电机壳体、甚至把码盘松了再装上零位就变了。从工程角度讲零位校准的本质就是把这个“Z信号出现的机械角度对应的电角度值”测出来存成一个系统常数。以后每次上电控制器找Z信号就能确定当前位置然后通过增量脉冲推算任意时刻的绝对位置。没有这个过程FOC的电流环、速度环全都在错误的坐标变换下工作表现出来就是电流波形畸形、转矩波动大、电机发热严重、带载能力差。还有一点容易被忽略增量式编码器的校准不只是“为了开机转一下知道在哪”。它跟启动方式也深度绑定。要么上电时锁定一段高频注入的时间来搜索转子位置要么直接靠Z信号快速建立位置基准。零位校准如果做得准启动就快甚至可以在电机静止状态下直接进入闭环不用那种磁极预定位、咔咔响两声再转的笨办法。所以零位校准不是“锦上添花”而是增量式编码器方案里必须做的一道工序。做得好后续所有控制都是顺的做得差你后面调的什么PI参数、什么观测器带宽全都是在错误的地基上盖楼。2. 零位偏移的本质电角度与转子角度的“错位账”零位校准这个概念很多人理解得不够透彻。要真正搞清楚它得把电角度和转子角度之间的关系掰开揉碎。2.1 电角度和机械角度之间的倍频关系对于一台极对数为P的永磁同步电机转子每转一圈电角度走P个周期。机械角度转一圈是360°电角度则是P×360°。公式表达就是θe P × θm θoffset其中θe是电角度θm是机械角度θoffset是零位偏移或初始角偏移。举个例子。手里一台极对数4的电机码盘每转一圈Z信号触发一次。假设Z信号出现的时候转子的机械角度是30°那这一刻的电角度就是4×30°120°。这个120°就是这台电机和这颗编码器组合体的零位偏移。这个值为什么重要因为FOC算法里电流采样得到的Ia、Ib、Ic要经过Clark变换和Park变换转成d/q轴的直流量变换矩阵里的sin、cos用的就是θe。如果θe算错了也就是说坐标变换的参考系没有对准转子磁场方向那励磁电流和转矩电流就分不干净。轻则效率下降重则电流环根本稳定不住。2.2 增量式编码器是怎样“丢失”这个角度的增量式编码器上电后计数器从0开始。如果你不做任何处理直接拿这个“假角度”去做Park变换大概率是错的因为0度并不对应转子磁场的某个已知位置。这就是为什么上电后第一件事是找零位。找零位的方法通常分两类一类是“无传感器式”通过高频注入、观测器之类的手段从电气量中提取转子位置另一类就是这里说的零位校准——用一条物理的Z信号作为绝对参考。Z信号在物理结构上通常由一个码盘上的缺口或反光条纹产生每转一圈输出一次。它的特点是重复性好、精度高——只要你把码盘装好Z信号每圈都在同一个机械角度出现。但问题是这个角度是未知的你只能把“它出现时对应的电角度”通过实验测出来。2.3 零位校准的最终产物是一个常数很多初学者以为零位校准是要在程序里改什么复杂的结构。不是的。校准过程最终产出的往往就是一个float或者uint16变量——Z信号出现那一时刻的电气角。这个常数写进Flash或EEPROM下次开机直接读出来用。有了这个常数控制流程变成上电编码器计数器清零电机转起来等待第一个Z信号Z信号到来将电角度强制设为θz之前校准的常数此后每个控制周期根据编码器增量脉冲数计算新的电角度θe θz Δcount × 每脉冲电角度增量换句话说零位校准就像给一把没有刻度的尺子刻上了第一道刻度之后所有测量都基于这第一道刻度。如果第一道刻度刻歪了后面量什么都偏。2.4 一个实操中的计算案例说个之前调BLDC时遇到的情况。电机是10极5对极编码器是2500线增量式4倍频后每转10000个脉冲。校准的时候测得Z信号出现时刻电角度为63°。那么每Z脉冲后的一个计数脉冲对应的电角度增量是360° × 5 / 10000 0.18°/脉冲如果当前计数器的值是2000那当前电角度就是63° 2000 × 0.18° 423°折算到0~360°区间是63°。这里有个很容易犯的错极对数乘以计数增量时要确认你的计数器是在Z信号处清零的还是没清零的。很多人把计数器和零位偏移搞混电角度算出来一跳一跳的其实就是没有把基准点对齐。3. 基于反电动势过零检测的自学习校准实操理论部分先放到这说点能直接用的。增量式编码器的零位校准工程上有好几种做法我按推荐程度和适用场景排一排。3.1 方案对比三种常见的校准方式校准方式原理优点缺点适用场景手动定位法给特定通电组合让转子锁定到已知位置记录Z角简单、不依赖外部设备精度受限于手工操作样机调试、验证其他方法时外部拖动法用另一台电机或手匀速转动被测电机测反电动势过零点推算精度高需要额外拖动设备或手工反复操作实验室标定、电机出厂测试电流闭环自学习给定d轴电流矢量转子被锁定后缓慢旋转捕获Z信号时的电角度全自动、可重复性好需要电流环能稳住、有软件配合批量生产、现场更换电机后的自动校准从实际生产的角度第三种最值得展开说也是我个人最推荐的方式。不需要额外工装不需要外部电机靠控制器自己就能完成而且可以做成一个“上电自动校准”的流程。3.2 电流闭环自学习的完整步骤前提条件电机已经能正常输出SVPWM电流采样正常编码器AB信号能正确计数Z信号接到MCU的捕获引脚带输入捕获或外部中断。第一步锁定转子。给电机一个固定的电流矢量也就是给定id设定值、iq0或者反过来给一个方向明确的旋转磁场角度。此时转子会转到一个稳定位置这个位置对应某个确定的电角度。这里有个实际操作的细节电流大小不能太大也不能太小。太小了力矩不够稳不住转子在负载作用下会有几度的晃动太大会把电机烧热尤其对小型无刷电机来说几百毫安的电流就能保住位置。我之前用的阈值大约是额定电流的3%~5%对大多数几千瓦以下的中小型电机都适用。第二步缓慢旋转转子。这一步有多种做法。可以用另一个电流角度斜坡让磁场方向缓慢旋转转子就跟着走。也可以用外部力矩直接用手拧但不推荐因为人的手抖容易引入误差。电流斜坡旋转的关键是慢。为什么要慢因为你要在转子转过一圈的过程中捕获Z信号出现的时刻。如果转得太快Z信号脉冲宽度相对很小MCU中断响应可能来不及或者捕获到的角度点太稀疏误差大。一般建议每圈时间不要低于2~3秒这样Z信号触发时你有充足的时间做高精度角度定格。第三步捕获Z信号对应的电角度。软件里把Z信号接到一个输入捕获通道捕获当前编码器计数值同时记录此时的电角度值。因为电角度是随转子位置实时变化的所以你需要在Z信号中断里立刻读取当前的角度值。好一点的MCU在这方面有硬件支持比如STM32的编码器接口模式同时带索引信号捕获可以做到零延时。第四步多次测量取平均。转一圈就停只能说明测到了一次。建议连续转5~10圈每圈记录一次Z信号的电角度值然后取平均剔除明显偏离的坏值。实测下来这样做之后校准精度能从±3°电角度提升到±1°以内对压缩启动时间和降低启动抖动帮助巨大。3.3 软件实现的伪代码逻辑这个自学习校准逻辑其实代码量不大关键是要想清楚状态机初始化 设置电流环id_ref I_caliq_ref 0 使能Z信号捕获中断 状态一锁定 等待电流稳定id电流稳定在设定值速度环输出为0 维持2秒记录当前电角度为θ_lock 状态二旋转 使能一个斜坡信号让电压矢量角度从θ_lock开始匀速增加 角速度建议5°/s ~ 15°/s电角度 状态三采集 每次捕获中断读取当前电角度存入数组 判定数组长度 10时停止旋转 状态四计算 剔除坏值 计算平均值 θz average(θ_capture) 将θz写入Flash/EEPROM 状态五退出 断开励磁电流系统进入正常等待状态这套流程在控制周期1kHz、Z信号分辨率2500线的系统上总共耗时不超过15秒。跑完后直接上FOC启动电机能在一个Z周期内完成位置确定启动平滑度显著好于那种“咔咔响两下找位置”的开环预定位方式。3.4 几种方案的细节经验手动定位法虽然糙但很适合作为第一种验证手段。做法是给U相和V相通电比如U接高、V接低转子会被拉到某个固定位置此时用示波器或者串口读一下Z信号和电角度记下来。虽然精度一般但能快速确认整个硬件通路是好的——Z信号有没有接错引脚、编码器AB相位对不对、计数器方向对不对。这些底层问题如果没排除后面做再精细的校准也是白搭。外部拖动法适合高精度应用。电机由另一台电机恒速拖动大概拖到额定转速的5%~10%然后测三相端电压的反电动势波形。反电动势过零点对应转子N极方向和电角度有明确的对应关系。用示波器同时看反电动势过零和Z信号相位差就是零位偏移。这个方法精度很高但操作复杂适合实验室里做标定基准不适合批量生产。4. 校准中常见的问题与排查思路零位校准看着简单实际做起来问题比想象的多。我把这几年调试踩过的坑集中整理一下这些问题如果没人提前提醒基本都要自己折腾好久。4.1 校准结果不收敛每次测出来的零位差很大现象连续跑几次校准得到的零位值忽大忽小偏差能到几十度电角度。排查链路先看Z信号波形。Z信号是每圈一个脉冲正常情况下脉冲宽度基本一致位置稳定。用示波器重点看Z信号和A相的相对相位关系如果Z信号边沿附近有抖动或者毛刺多半是信号没处理好。增量式编码器的Z信号又被叫做索引信号有些码盘在Z位置附近有制造毛刺触发多次是常有的事。这种毛刺在低速旋转时问题不大但在振动环境或者转速快了以后会被放大导致捕获值乱跳。解决办法是硬件上给Z信号加滤波软件上做“连续多次捕获一致性校验”——在同一个机械圈内Z信号前后的角度增量应该基本一致如果某次捕获的增量值偏离均值超过阈值直接丢弃。另外一个容易被忽略的原因是编码器码盘和转轴之间有滑动。码盘是靠顶丝或者摩擦环固定的电机长时间运行后码盘可能松动。此时校准值每次都会变但变化趋势是缓慢的、单调的而不是随机的。判断方法手动在码盘边缘做一个标记跑完校准后看标记位置和初始位置有没有相对位移。如果有先解决机械固定问题再谈校准精度。4.2 校准后启动反转或者启动时抖动一下才转起来现象零位校准值写好之后电机可以转但表现为启动时要“突突”抖一下或者启动方向跟给定方向相反。这个问题的根源十有八九是零位偏移了90°电角度或者某个特定的对称角度。为什么偏偏会是90°因为在FOC坐标变换里如果零位偏移刚好是90°或者180°这类特殊角度控制器的输出力矩方向跟预期方向正好相反或者d/q轴分量串位电流环还能勉强稳定但电机转矩方向是反的。表现在宏观上就是给定正转电机却反转或者转矩极小抖一下才走。排查方式是用开环强制给一个固定电角度一点点增大电压观察转子朝哪个方向偏。正确情况下给一个朝向0°的位置令转子应该转到机械0°附近如果转子是朝180°方向动那零位就差180°。这类问题其实是在提醒你校准算法本身没问题但硬件接线或者说Z信号接的边沿方向可能跟算法假设不一致。比如你校准程序里默认在Z信号的上升沿捕获但硬件上Z信号的接口设计或编码器方向安装可能导致实际有效的边沿是下降沿这两个边沿之间的差距通常就是半个码盘齿距对应到电角度可能正好是几十上百度的偏差。改一下捕获边沿设置问题就能解决。4.3 有负载时校准失败空载时校准正常现象电机不挂负载时校准流程跑得完结果也稳定一带上负载比如连了减速机构或者传动轮校准过程就出问题要么转子锁不住要么测出来的零位不对。这个问题跟校准方法有关系。用电流闭环自学习校准的时候如果负载摩擦力矩超过了锁定力矩——就是那个id设定电流产生的力矩不够大——转子会被负载慢慢推动根本停不下来。这就不是零位偏差的问题而是校准状态下电机的力矩输出不够。解决办法有三个方向。第一个提高励磁电流值加大锁定力矩。但要小心长时间的大直流电流会让绕组发热对散热差的电机有风险所以提高的同时要限制校准流程的总时长。第二个把校准改成“分步式”先锁当前位置小步长往里走每一步都允许电机停稳以后再捕获Z信号这样既有足够的净力矩又不会因为某一步用力过猛引起振荡。第三个如果负载本身摩擦力矩很大且不确定干脆改用外部拖动方案用另一台额定力矩更大的电机来拖让被测电机处于发电状态通过反电动势法测零位。4.4 校准值写进Flash后掉电丢失或者一个电机型号的校准值被用到另一个型号上这个听上去很基础但还真有不少人踩过。校准值存Flash或者EEPROM的时候最好做一个“电机标识符零位值CRC校验”的组合存储结构。不然你调试A型号的电机校准完把固件刷到B型号的电机上零位值错乱整个系统表现就跟没校准一样。具体操作时我会在参数区放一个magic number比如0x5A5A每个型号电机对应一个唯一的ID。上电读取参数的时候先校验magic number再校验电机ID最后校验CRC。任一项不通过都认为校准值无效进入重新校准流程。这一点在批量产线上尤其重要不然十几台机器混着发货现场各种“这台电机动不了、那台电机猛震”的问题最后都指向参数混淆。5. 零位参数的固化与FOC系统联调验证校准做完了参数也存下来了这不代表万事大吉。真正考验的是这套零位参数跟你的FOC系统配合起来能不能在所有工作点都稳定。我习惯在参数固化之后跑一轮完整的验证流程。5.1 开环点动法验证零位的正确性最简单、最直观的验证方式就是用开环电压激励做点动测试。具体做法不给闭环直接往逆变器里发一个固定方向、固定幅值的电压矢量比如让电压矢量的角度设定在0°。正常情况转子会被拉到一个稳定的机械位置这个位置对应的电角度应该接近0。然后把电压矢量角度改成180°转子应该转到相反方向。如果这两个方向转变时转子没有出现“犹豫、反向跳动、原地抖动”这类异常说明零位的大方向是对的。更进一步把电压矢量角度设为某个固定角度θcmd转子稳定后读一下编码器的实际位置反算电角度。如果这个反算出来的电角度跟θcmd误差在几度以内零位精度就基本没问题。这个方法探测精度并不高因为它受负载力矩和静摩擦力影响很大但对于判断零位是否错得离谱比如差90°、差180°这种非常有效适合在现场快速发现问题。5.2 低速闭环运行验证零位偏差的灵敏度测试零位误差在低速闭环时是最敏感的。因为此时反电动势小电流环好不容易建立起来的力矩很容易被一个偏差角给扭掉一部分。测试方法是让电机在10%额定转速以下运行先正转稳定一分钟记录电流波形和转速波动再反转稳定一分钟。正常情况这两个方向的电流幅值和转速波动应基本对称。如果某一个方向电流明显偏大或者转速出现规律性脉动频率正好等于电机极对数乘以转频那基本可以断定零位存在固定的偏差角。此时可以用一个“修正搜索算法”来自动找偏差值在程序里把零位值加上一个偏置量比如从-30°到30°以0.5°步进扫描在每个偏置下记录运行电流的d分量均值。当d分量最接近零的时候对应的偏置量就是最优修正值。这个过程可以做成全自动作为产线最终调校的一个环节。5.3 满载带载验证零位误差在重载下的放大效应零位校准好不好重载测试会给你最诚实的答案。给电机加载到额定负载的大半比如80%额定转矩观察相电流波形和质量。零位准确时相电流应接近正弦谐波含量低电机温升正常。零位如果偏了会出现几个明显的病征相电流峰值不对称某两相电流偏大母线电流明显高于理论值但输出转矩没有相应增加电机噪声变大带有周期性的嗡嗡声。用钳流表或者示波器电流探头抓一下母线电流和相电流波形对照一下总输入功率和实际输出机械功率就能估算出系统效率。零位偏差个几度电角度效率可能降低5%~10%。这个数字在批量产品上是非常可怕的损失。我在实际项目里遇到过最典型的案例一台750W伺服电机零位偏差了11°电角度空载完全正常装上负载转到1500rpm以后电流环开始震荡声音发出尖啸电机表面温度十分钟内升了20°C。后来把零位修正调准所有症状直接消失。这说明零位参数不仅影响启动对高速重载段的稳定性和热性能也是决定性的。5.4 固化与上电恢复流程设计零位参数存储到非易失性存储之后配套的软件流程也要跟上。我的参数结构大致如下typedef struct { uint16_t motor_id; // 电机型号标识 uint16_t magic; // 魔数 0x5A5A int32_t z_angle_q; // Z信号电角度单位0.1度 uint16_t crc; // 校验值 } MotorZeroParam;上电后的状态机会分两支读取参数有效且电机ID匹配直接进入正常FOC启动流程利用Z信号建立绝对位置参考。参数无效或ID不匹配进入校准流程等待用户执行一次自动校准校准成功后继续运行。为了应对现场“结构不变但码盘轻微移位”的偶发情况还可以设计一个“零位自检”功能系统每次正常运行经过Z信号时都对比实际捕获到的电角度和存储的零位值如果偏差超过阈值比如1°电角度就报一个“零位漂移警告”。这个功能在你调试期间机器振动大、长期运行后结构松动的时候非常实用能帮你提前发现硬件隐患而不是等性能彻底恶化了才去排查。5.5 校准流程里那些不会写进文档的细节最后再补几个零碎但很实用的经验。第一校准过程中不要寄希望于“电机静止后转子完全不动”。静摩擦力矩导致的微小晃动不可避免。你可以在软件里加一个“稳定判据”连续N个周期内转子位置变化都在一个极小范围内才认为锁定成功。这个N不要取得太大否则校准时间变长也不要太小1~2个周期容易误判一般取20~50个控制周期以1kHz控制频率算也就是20~50ms比较合适。第二编码器的AB相位接反正负方向这个事一定要在校准之前确认。如果AB相接反编码器计数方向就是反的Z信号依然能触发但校准做出来的位置关系从根上就是错的。快速验证方法手动缓慢正转电机同时看计数器数值是否递增反转看是否递减。这一步有问题后面做的所有工作都是在错误坐标系里打转。第三校准使用的励磁电流不要用额定电流的大比例数值。对大多数中小功率电机额定电流的3%~8%已经足够形成稳定的锁定力矩。过大的电流不仅加剧发热还会让电机在锁定位置附近出现小幅度振荡——电流一大反电势产生的阻尼振荡效应就越明显反而影响校准稳定性。第四如果你的控制系统里已经有滑模观测器或者高频注入这种无感算法也可以利用它们的输出作为零位校准的辅助参考。将无感算法估算出来的转子角度和编码器Z信号的角度放一起比对可以做到互相验证。这是成本很低的冗余设计但对提升系统整体可靠性非常有帮助。零位校准这件事归根到底一句话让控制器知道编码器的Z脉冲到底对准了转子磁场的哪个电角度。别看就这么一个常数它牵动着FOC系统的启动速度、带载能力、稳态精度和热性能。这篇文章写的这些方法我基本都在不同项目里试过尤其是电流闭环自学习校准和重载验证这两个环节是实际解决问题最有效的两个手段。如果你正在被“上电抖动”“零位跑偏”“同型号电机换着用性能不一致”这些问题困扰照着上面这套流程捋一遍应该能少走很多弯路。
返回列表