最近我调试一台120W的直流无刷风机,低速时总在某个电角度区间“打咯噔”,带霍尔传感器也救不回来;换成编码器做速度环,反倒因为启动定向不准,一上电就抽风。折腾两三天,最后问题的解法不是换传感器,而是把两种传感器放进一套控制策略里协同工作——霍尔管扇区和启动,编码器管稳态和精细位置。这套逻辑在ST-MC-Workbench里配置好后,整个系统立刻顺了不少。
这篇文章想把我在ST-MC-Workbench里做霍尔传感器加编码器融合的全过程捋一遍:霍尔信号和反电势怎么对齐,编码器参数怎么填才不白装,低速依赖霍尔、高速切换到编码器时角度怎么平滑过渡,以及踩过的几个坑。内容适合正在做BLDC/PMSM电机驱动、想从单一传感器方案往传感器融合方案升级的工程师参考。
1. 为什么单靠霍尔或单靠编码器都不够体面
1.1 霍尔传感器先天的边界在哪
霍尔效应本身不复杂:电流流过半导体薄片,在垂直磁场作用下产生横向电位差,这个电位差经过比较器整形后就是方波位置信号。放在无刷电机里,三枚霍尔元件以120度或60度间隔排布,转子磁极旋转的时候,输出三路互补的方波,六个状态组合正好对应六个电角度扇区。这就是无刷电机六步换相的基础。
霍尔方案最讨喜的地方是低速和静止时几乎不挑环境。电机堵转时磁场还在,霍尔照样能给出转子所在的扇区,所以上电定向、低速爬行、遇阻重启这些场景,霍尔是天然可靠的。可它的精度上限摆在那里:一个机械周期只有六个霍尔状态变化,每个状态覆盖60度电角度,控制器只能知道转子“落在哪个扇区”,不知道具体在扇区里的哪个位置。转速一高,换相点靠霍尔跳变触发还可以,但速度环要想跑得细腻,靠60度一跳的位置信息做角速度估算,噪声会大得离谱。
1.2 编码器补上了精度,却带来了启动难题
编码器的情况正好反过来。增量式编码器用A、B两路正交脉冲表达转动方向和距离,配上Z信号做零位参考,配上定时器编码器接口之后,MCU可以拿到很细腻的机械角度增量。速度高了之后,M法或M/T法测速都能获得足够的分辨率,速度环带宽做上去也不难。绝对式编码器更省心,上电就能读到单圈绝对位置,比如磁编码器AS5047P通过SPI直接吐14位角度,连回零过程都省了。
麻烦在于增量式编码器上电那一刻不知道转子在哪。机械轴停的位置是随机的,编码器的计数值可能停在任意状态,控制器如果不额外做预定位,直接闭环就很容易反转起步或过流堵转。常见的“给个电流矢量先把转子拉到已知位置”的办法,在风机泵类这种带惯量负载的场景下很痛苦,拉过头、拉不到位、拉的过程中负载被顶住,都是实际工程里反复遇到的故障。
1.3 融合的本质是分工,不是堆料
所以传感器融合在我这里的理解不是“把两个传感器数据简单地取平均”,而是“各干各擅长的事,再用一个状态机把权责切清楚”。霍尔负责上电定向、零速和极低速阶段的扇区级位置感知,以及堵转检测;编码器负责速度起来之后的精细速度和连续角度反馈;中间地带用一个角度观测器或锁相环做平滑过渡,让霍尔角度和编码器角度在切换瞬间保持一致。
这套分工逻辑放到ST-MC-Workbench里特别合适。ST的MC SDK本身就把“速度传感器”抽象成了霍尔、编码器、无感观测器几种模式,工程师要做的不是在Workbench里硬选一项,而是理解底层API之后,在生成的工程里加入自己的混合状态机。这也是本篇后面几节展开的重点。
2. 霍尔与反电势波形:定标数据背后的物理意义
2.1 过零点和跳变点之间那30度电角度
搞霍尔定标之前,必须先看懂无刷电机反电势和霍尔波形在时间轴上的对应关系。理想情况下,PMSM/BLDC的相反电势近似梯形波,霍尔信号通常在反电势过零点前后30度电角度处翻转。为什么是这个数值?因为六步换相的理想换相点,刚好落在相反电势过零后30度,如果把霍尔跳变沿与换相点绑定,霍尔状态就能直接触发换相逻辑。
我整理了一张常用的对应表,假设霍尔A超前反电势A相30度电角度,霍尔状态按1/2/3排列时常见换相序列如下(以AB导通为例,具体还要看霍尔是120度还是60度排布):
| 霍尔状态 | 对应扇区中心(电角度) | 建议下一步导通相序 |
|---|---|---|
| 101 | 30° | C+ A- |
| 001 | 90° | B+ A- |
| 011 | 150° | B+ C- |
| 010 | 210° | A+ C- |
| 110 | 270° | A+ B- |
| 100 | 330° | C+ B- |
这张表并不神秘,Workbench里的霍尔定标流程本质上就是帮用户确认两点:一是霍尔状态与电角度的固定映射是不是如上表这样单调且均匀,二是霍尔跳变沿相对反电势过零点的偏移量是不是符合设计值。偏移量不对,轻则换相噪声变大,重则电流波形畸变导致效率下降。
2.2 ST-MC-Workbench里的霍尔定标到底在标什么
Workbench里的“Hall Sensor Calibration”通常不是让用户自己拿示波器反复对,而是通过控制算法做自动定标。常见流程是:电机开环给定一个固定的电流矢量,把转子拉到某个已知位置,记录此时的霍尔状态;然后再换一个电流矢量,让转子转一个已知角度,再次记录霍尔状态。几次拉动之后,算法就能推算出霍尔状态到电角度的映射表以及补偿角。
这里最容易出问题的是极性定义。霍尔输出是高有效还是低有效,三路霍尔接的是TIM的哪个通道,正交译码还是普通GPIO读取,这些在Workbench配置界面里都有选项。我见过不少案例,霍尔线序没有按模板接,定标结果看着数值正常,电机一启动就嗡嗡响。原因就是霍尔状态表和真实的六扇区排列错位了,算法把转子位置估偏了一个或两个扇区。
2.3 霍尔线序接错时的典型表现与快速判断
我自己的排查习惯是:先用示波器同时抓霍尔A和A相反电势波形,看跳变沿与过零点的相位关系。如果霍尔A上升沿出现在A相反电势过零点前30度,说明接线和默认模型一致;如果出现在过零点后30度,说明霍尔极性反了或者传感器安装方向反了。这个判断比看电流波形快得多。
交流伺服/风机行业里还有一种常见错误:霍尔线材颜色和厂家规格书不一致。标称黄绿蓝,实际出厂是蓝绿黄,或者把霍尔地线接到了屏蔽层上导致共模噪声。遇到启动抖动、高速换相噪声大的问题,不要先怀疑算法,先把三路霍尔波形都抓出来看,确认跳变顺序是0-1-3-2-6-7这种格雷码递增循环,方向与电机正转一致。Workbench里如果发现调换霍尔两路接线后正常,又不想拆线,也可以在配置界面里修改霍尔状态映射表,效果等价。
3. 编码器接入与参数配置:PPR、倍频和方向别想当然
3.1 增量编码器的ABZ与EC11
增量式编码器输出A/B两路正交方波,Z是每圈一次零位脉冲。控制器用定时器编码器接口可以四倍频计数:A和B的每个上升沿、下降沿都计一次,所以线数为500线的编码器,一个机械周期能产生2000个计数脉冲。这里就引出了那个常见问题——EC11编码器转一下发几个脉冲。EC11这类手拧编码器规格多数写“带定位点数20或30”,意思是每圈输出20或30个脉冲,四倍频后每圈80或120个计数。拧快的时候脉冲频率不算低,但它本身是机械触点,结构上用滚珠定位,触点抖动和寿命都达不到电机闭环的要求,顶多用来做面板旋钮或手动微调,真放到电机轴上做速度反馈,低速会抖到怀疑人生。
工程上做电机反馈,我更愿意选带光电或磁栅的专用编码器。增量式编码器选型时主要看三个参数:线数PPR、输出类型(推挽、集电极开路、差分)、以及是否带Z。差分输出比单端抗干扰强一个量级,线缆长度超过1米时强烈建议用差分,或者用AM26LS31/32这类芯片转接。
3.2 绝对式磁编码器的捷径:AS5047P这类芯片
绝对式编码器解决的是“上电就知道转子绝对位置”的痛点。以AS5047P为例,它是14位磁角度传感器,芯片中心上方垂直安装一颗径向充磁的小磁铁,转子转动时芯片内部的霍尔阵列感知磁场角度变化,通过SPI接口一次性输出0到16383的绝对角度值。它还同时提供ABZ增量输出,兼容老式增量接口。通讯速率支持到10MHz左右,电流环同步读取完全来得及。
用这类芯片时要特别留意磁铁的安装工艺:磁铁要尽量对中,偏心会造成角度误差;芯片和磁铁之间的气隙要按数据手册控制在1到3毫米左右,太近会碰,太远信噪比下降。另外很多磁编码器芯片上电后默认零点在0°,安装后必须做一次机械零位找正,否则电角度映射是乱的。
提到I2C接口的编码器,像AS5600这类芯片就只提供I2C/模拟输出,读取速度不如SPI,但胜在引脚少。运动控制里如果电流环频率要跑到10kHz以上,I2C接口的读取频率往往不够,建议用在位置环慢速节点,不要直接塞进FOC电流环同步链路里。
3.3 在Workbench中配置编码器的常见错误
编码器在ST-MC-Workbench里的配置项看起来不多,PPR、极对数、计数方向、速度计算方式,但每一项都能让系统表现出完全不同的“性格”。
第一是PPR填错。曾经有人把四倍频后的计数当原始线数填进去,结果速度环算出来的速度整整偏了四倍,启动时电流极限直接把母线电压拉穿。记住Workbench里如果选“AB encoder”模式,通常会要求填编码器线数或者定时器计数总值,要看清是PPR还是CPR,CPR就是四倍频后的每圈计数。
第二是计数方向反了。A相超前B相和B相超前A相,编码器计数的增减方向是反的。方向反了之后最典型的症状是:给定正速度,电机也能转,但速度环输出持续饱和,或者跑起来电流忽大忽小。处理办法很简单:调换A/B接线,或者在Workbench里把计数方向取反,二选一即可。
第三是极对数和电角度的匹配。机械角度乘以极对数才是电角度,电机是4对极,编码器一圈,电角度变化4圈。Workbench里极对数填错,角度查表出来的正余弦相位就会错乱,电机会表现为输出扭矩忽正忽负,静止时会抖,转起来像刹车。数值上核对一遍:编码器每圈计数N,极对数P,那么电角度循环一次在编码器上对应的计数应该是N/(2P)还是N/P,取决于软件是按“一圈电角度=360/N”还是“一圈机械角=N/P”来换算。最容易直接验证的方法是用手匀速盘车,看Workbench Monitor里估算的电角度是不是在0到360度之间循环了P次。
4. 协同控制策略:霍尔粗角度与编码器细角度的融合逻辑
4.1 一个简单可靠的融合状态机
融合策略我建议做得越简单越好,不用一上来就上卡尔曼。我这里用一种在工程上验证过多次的分级状态机:上电后先进入“霍尔定向模式”,读三路霍尔状态直接推出转子所在扇区;速度给定大于阈值后进入“霍尔换相+编码器跟踪模式”,霍尔继续负责换相,编码器开始累计角度并校正霍尔扇区内的插值;当转速稳定超过阈值并持续一段时间,进入“编码器闭环模式”,速度环和电流环完全以编码器角度作为电角度参考,霍尔降级为监控信号,用于在堵转或编码器异常时兜底。
切换点要加滞回,比如进入编码器闭环的阈值是300rpm,退出阈值设在260rpm。不加滞回的话,电机在阈值附近忽上忽下,状态机会在两种模式之间来回抖,电流波形出现明显的台阶。
4.2 角度同步与锁相环的实际作用
霍尔角度和编码器角度之间的换算必须严格对齐。理想情况下,同一个转子位置,霍尔推算出来的电角度与编码器换算出来的电角度应该相同。实际由于霍尔安装偏差、编码器零点偏移,两者之间总存在一个基本固定的角度差。处理办法是在编码器闭环首次稳定运行后,做一次在线校准:读取霍尔扇区跳变瞬间编码器的计数,把这个计数值作为电角度零点偏移补偿记录下来,存到EEPROM或Flash里。
至于锁相环,很多工程师把它理解为一个滤波器,其实它在融合里还有更深的用处。霍尔角度是一个60度一跳的阶梯波,直接微分出来的速度噪声极大;编码器角度是连续变化的,但容易混入丢步噪声。把两者同时送入一个角度锁相环,环路的相位输入可以来自霍尔粗角度校正后的平滑估计,频率输入则来自编码器的速度估算,输出就是一段连续、平滑且方向一致的电角度。ST的MC SDK里常见的SO(状态观测器)功能,本质上也是在做类似的事,只是它依托电机模型来估计反电势和角度。霍尔和编码器融合时,观测器的权重可以调低,但保留它对角度偏移的实时校正能力,会让整个速度环的手感好很多。
4.3 速度估算的M法、T法与M/T法
融合之后,速度环反馈到底用谁的速度,也需要讲清楚。编码器测速主要分三种:M法是在固定时间窗口里数脉冲,转速越高分辨率越好;T法是测两个脉冲之间的时间间隔,转速越低分辨率越好;M/T法把两者结合,低速时用T法、高速时用M法,中间做切换。霍尔测速因为脉冲数太少,直接用M法在低速时分辨率惨不忍睹,但霍尔有连续六扇区跳变,测量相邻跳变的时间间隔在低速时反而很准。
所以一个很自然的结合就是:低速用霍尔T法测速,中高速用编码器M法或M/T法测速,切换点由编码器每速度环周期产生的脉冲数决定。比如编码器每圈500线,四倍频后2000个计数,速度环周期1kHz,1000rpm时每个周期约33个计数,精度足够;而低于100rpm时每个周期只有3个计数,量化误差大,这时退回霍尔扇区时间测速更稳。
5. ST-MC-Workbench实操:从工程配置到波形验收
5.1 建工程与传感器选择
以STM32系列为例,先在STM32CubeMX里配置好时钟和定时器资源,再打开ST-MC-Workbench新建电机控制工程。Workbench里的速度传感器选项一般有无感、霍尔、编码器等,如果你用的MC SDK版本没有直接提供“霍尔+编码器同时选”的模板,也别慌,我的做法是:先按“霍尔启动+无感运行”模板生成工程,然后在代码层挂一个编码器定时器中断,把编码器计数换算成机械角度和速度,再通过内部变量去替换无感观测器输出的角度。这样既保留了Workbench生成的电流环、速度环、换相状态机,又能在不破坏自动生成代码的前提下做融合改造。
这里有个实操细节:STM32F103RCT6这类带编码器接口的芯片,定时器可以工作在编码器模式,比如TIM2/TIM3/TIM4,PC6/PC7或者PA0/PA1这些引脚映射到对应通道。编码器模式下,定时器硬件自己处理A/B正交信号的加减计数,MCU不需要在中断里做方向判断,这个特性大幅降低了CPU负载,也减少了软件误判方向的可能。
5.2 霍尔定标操作的完整步骤
霍尔定标我建议在电机离线状态下做。先把电机负载脱开,能自由盘车最好。Workbench里执行霍尔校准前,确认母线电压、额定电流、极对数都填对了。校准开始后,驱动逻辑会给电机施加一系列短促的电流矢量,把转子拉向不同的已知角度,同时记录霍尔状态。整个流程走完后,Workbench会给出每扇区的霍尔状态和对应的电角度偏移值。
我强烈建议在拿到固定工具箱时,不要直接信任默认值。把三路霍尔输出接到逻辑分析仪上,让电机低速开环运行,比对Workbench生成的霍尔状态表和实际抓到的电角度。如果发现某一扇区偏差超过15度以上,多半是霍尔安装位置本身不对称,或者传感器芯片受磁场干扰产生迟滞。偏差过大时,可以考虑在软件里加霍尔扇区角度插值,用上一个状态和下一个状态之间的时间把角度从阶梯波改成斜坡,能显著降低低速运行时的扭矩脉动。
5.3 编码器参数与速度环验证
编码器配置页里常见参数是编码器线数、极对数、计数方向、速度计算周期。填入PPR后,可以在Workbench的“速度反馈”页面选择用定时器计数直接计算还是用编码器测速(有些版本叫“Sensorless/Encoder”切换)。测速周期一般跟速度环周期一致,1kHz比较稳妥,太快了分辨率不够,太慢了相位滞后大。
填完参数先不要急着挂负载,做一个空载阶跃响应测试:给定一个中等速度参考,比如额定转速的30%,观察速度环的响应曲线。如果出现持续振荡,先把速度环Kp降一半,Ki跟着降一点,等响应曲线不再有等幅振荡再逐步回升。编码器反馈下速度环增益可以比霍尔反馈时做得更高,因为角度噪声小了很多,但也要避免把反馈滤波的时间常数设太长,否则你看到的“稳”其实是滤波滤出来的假象,负载突变时马上现出原形。
5.4 融合切换的验证方法
融合策略最怕的是模式切换瞬间角度跳变。在Workbench的实时监视工具里,可以同时观察估算电角度、编码器电角度、霍尔电角度和速度环输出。从零速加速到额定转速,记录切换点前后的角度误差。如果切换瞬间出现超过30度电角度的跳变,速度环一定会拉出一个电流尖峰,严重时会造成编码器计数器受干扰丢步。
我在实践中的做法是把切换过程拆成两步:先在内部把速度环的反馈源从霍尔切换到编码器,但电流环的电角度仍沿用霍尔;等两者角度差收敛到5度以内,再把电流环电角度一并切过去。这样即使调试参数不完美,最坏情况也只是扭矩有轻微波动,不会出现剧烈失步。
6. 我在实际调试中踩过的坑和快速判断法
6.1 启动抖动:先查霍尔定标而不是编码器
症状是上电后电机原地哆嗦,转不起来,电流波形乱成一团。我一开始以为是编码器方向反了,查了半天,最后用示波器看霍尔状态,发现三路霍尔中有一路电平在某个扇区反复跳变。原因是霍尔线缆靠近功率线,电机转动后功率线上的高dv/dt耦合进来,把霍尔信号拉毛了。处理办法是霍尔线套磁环、远离功率线走线,同时把霍尔输入引脚配置为内部上拉,并在软件里做10微秒级的去抖滤波。定标数据再正,信号被干扰成这样也白搭。
6.2 高速速度环振荡:编码器测速分辨率与反馈滤波
症状是转速超过1200rpm后,速度环开始有轻微啸叫,电流波形出现高频纹波。分析下来是编码器四倍频后的脉冲频率变高,加上线缆较长,A/B信号边沿不陡,定时器计数时偶发漏计数,导致速度反馈偶发跳变。解决方式是给编码器的A/B/Z信号加上差分接收器和施密特整形,或者干脆换用带差分输出的编码器。软件层面,我把速度反馈滤波从一阶低通改成带截止频率的IIR滤波,并把速度环带宽适当降到与机械系统谐振频率错开。
6.3 编码器丢步与累计误差
增量式编码器最怕的是A/B干扰引起的方向误判。举个实际案例:电机反转瞬间,电流切换产生的干扰让A相被毛刺多计了一个脉冲,方向判断又因为信号毛刺短暂反转,编码器计数值就会凭空多出几十个。位置环如果以此为准,机械定位精度直接完蛋。我的经验是,如果现场无法改善硬件布线,至少在软件里加一个简单的合理性校验:编码器计数值的变化率不能超过电机最高转速对应的上限,超过就认为本次读数无效,沿用上一次的值。这在ST的定时器编码器模式下尤其重要,因为硬件自动加减计数不会替你做合理性判断。
6.4 反电势波形与霍尔相位偏移的终极对齐法
最后给一个我常用的通杀方法。在电机开环转速很低(比如额定转速的5%)的情况下,用示波器同时抓A相反电势和霍尔A的输出。把反电势过零点的时间找出来,再找霍尔A跳变沿的时间。两者时间差乘以当前电角速度,就是霍尔相对反电势的相位偏移。把偏移量记下来,代入Workbench的霍尔补偿角设置,整套系统的换相噪声能明显降一档。这个偏移量不仅仅取决于霍尔片安装位置,还受霍尔芯片比较器迟滞和电机磁路饱和度影响,所以最好在额定负载附近再校一次。
我在实际项目里发现,大多数霍尔+编码器融合方案的最终问题,都不是算法太复杂,而是基础信号没对齐:霍尔相位没校好,编码器零点没找正,方向设置反了。传感器融合的前提是每个传感器本身的数据都干净、可靠、语义明确,否则融合只是在把错误信号变得更平滑而已。所以遇到问题先回到波形,把霍尔和编码器各自的信号质量确认到位,再谈融合策略。把这件事做好,ST-MC-Workbench这套工具链在无刷电机项目里会顺很多。