☰
FOC位置闭环原地抖动排查:8个关键点从根因到调试
2026/9/28 20:52:55 网站建设 项目流程

一直不信FOC位置闭环这种系统能把我难住,直到那天电机在桌面上原地抖了起来——转速反馈清零,目标位置固定,可电流波形在示波器上像锯齿一样来回撞,声音还带着一种沉闷的高频"嗡嗡"声。那会儿我手边就是一块STM32F103RCT6的板子、一个带编码器的无刷电机、一台DS138示波器,外加一堆调了一半的FOC代码。说实话,FOC位置闭环的"原地抖动"几乎人人都能遇到,但真正能从现象一路追到根因、一次调明白的人并不多。这篇文章就把我当时排查的完整思路整理出来,围绕8个关键点展开,附带我实测时的波形特征和参数调整逻辑。如果你也在调无刷电机FOC位置闭环、手头有示波器和串口调参工具,这篇应该能帮你少走不少弯路。

1. 先把问题定性:是"电抖"还是"机械抖",再动手改参数

很多第一次调位置闭环的人,遇到抖动第一反应就是"PID参数没调好",然后开始一顿乱拧。这个方向不能说错,但十有八九会越调越乱。因为原地抖动的原因不只在控制环里,机械结构、编码器反馈、供电能力都可能成为抖动源。你先花十分钟把问题定性,后面调整才不会抓瞎。

1.1 现场现象:上电回零不到一秒钟,电机开始原地抖起来

我那次调试的硬件组成其实很普通:STM32F103RCT6做主控,Timer1产生PWM,驱动板是常见的三相全桥,电机是带1000线光电编码器的无刷直流电机(也可以按PMSM处理),电流采样用的是双电阻方案,FOC算法跑在定时器中断里,PWM频率10kHz,电流环中断频率10kHz,速度环和位置环降到1kHz跑。

上电流程是先做转子初始位置检测,然后使能电流环、速度环、位置环。现象是:电机归零后大概0.5秒,轴开始在一个很小的角度范围内来回晃,晃动的幅度大约3到5度,频率大概4Hz左右,同时明显能听到一种"咯咯咯"的声音。示波器接在Iq指令和Iq反馈两个测试点上,可以看到Iq指令在正负1A之间来回跳,波形有点像三角波,而Iq反馈波形比指令滞后了明显一截,并且在每次换向时有一串毛刺。

这个现象很容易被误判成"位置环超调"。实际上,等我断开位置环、只给速度环一个零速指令,电机照样抖,只是抖动幅度小了一点。所以第一个结论是:这不是单纯的位置环超调,而是从速度环往下的某层已经在振荡了。

1.2 快速定性方法:断电、手捏、看电流三步走

在拆解8个关键点之前,我先分享三招常用的定性方法,这些方法不需要改代码,一条条试过去就能把范围缩小很多:

  • 第一招:断电自由滑动。把驱动器功率部分禁用,用手去转电机轴,感受阻力是否均匀。如果某个位置有明显卡滞,说明机械装配有问题,比如电机轴和负载不同心、减速箱齿轮咬合过紧。卡滞带来的扰动力矩会让位置环不停地修正,最终表现为抖动。

  • 第二招:手捏轴看声音变化。电机通电抖动时,用手轻轻捏住电机轴,或者给轴加点阻尼。如果抖动明显减弱、声音变闷,说明振荡是控制环与机械负载之间相互作用的结果,多半和机械谐振或者负载惯量比过大有关。如果手捏后抖得更厉害,那说明控制环增益已经过高,处于临界稳定状态。

  • 第三招:强制开环看电流波形。在代码里屏蔽位置环和速度环,直接给定一个固定的q轴电压,比如0.5V,然后观察三相电流波形。如果开环情况下电流波形都不干净、有毛刺或明显波动,那问题在电流采样或功率级,而不是位置环参数。

我当时这三步做完,判断是"电气侧和控制环发出来的抖动",但也保留了对机械谐振的怀疑。带着这个结论,我才开始进入8个关键点的逐一排查。

2. 八个关键点中的信号链部分:位置检测与电流环

FOC位置闭环是一个级联结构:位置环输出速度指令,速度环输出电流指令,电流环输出PWM占空比。信号从位置反馈、电流反馈到PWM输出,经过的每一个环节都可能把噪声或误差放大成抖动。这4个关键点全部集中在信号链上,是排查抖动时优先级最高的区域。

2.1 关键点一:转子初始位置检测偏差

先说明一点:位置闭环里说的"位置"是机械角度,而FOC控制的电流矢量需要的是电角度。如果初始位置检测给出的电角度和真实电角度之间存在偏差,那么所谓的iq、id就不是真正的交轴、直轴电流,一部分电流会被映射到错误的轴上,转矩输出和指令完全对不上。

常见的初始位置检测有两种做法:一种是对齐法,直接给一个固定的电压矢量把转子拉到已知位置;另一种是高频注入法,利用电机的凸极效应或饱和特性解算位置。我调试时用的是带编码器的系统,相对简单,但踩了一个坑:每次上电都对齐到一个位置,可这个位置并不是真实的编码器零位,导致电角度零位和编码器零位始终有个固定偏差。

这个偏差会造成什么现象?当位置环把机械位置稳定在目标点附近时,电角度误差始终存在。比如误差20度,那么q轴电流产生的力矩会有一部分变成d轴分量,实际输出力矩变小,位置环发现问题后又加大电流指令,结果电机就在目标点附近反复过冲、回调,形成低频抖动。在示波器上看,Iq反馈波形会有一个明显的偏置,而且你给再大的位置环P,电机依然在一个小范围内晃。

处理办法有两个:第一,在正式跑位置闭环之前,做一次完整的电角度-编码器零位校准,把校准偏移量存进Flash,而不是每次上电都依赖对齐法。第二,如果必须用对齐法,至少做三次不同方向的强制对齐,取平均值或交叉验证,避免转子摩擦力和负载导致的停位不一致。

提示:如果项目里用的是无感FOC,零速初始位置检测会更麻烦,反电动势观测器在零速时没有有效信号,通常需要高频注入或I/F强拖启动。那种情况下的"原地抖动"根因会更深,建议单独做一轮排查,别和带编码器的调试混在一起。

2.2 关键点二:电流环带宽与采样时序

电流环是FOC整个系统的最内环,它的性能直接影响速度和位置环能调多高。电流环带宽不够,速度环和位置环的增益一上去就会振荡;电流环自身参数过高,也会直接让电机高频颤抖。

先说容易踩的采样时序问题。很多新手在单电阻或双电阻采样时,没有注意ADC采样时刻和PWM中心的关系。FOC电流采样有个原则:要在PWM周期的中点、也就是上下桥臂都导通的时间窗口内采样,才能采到真实的相电流平均值。如果采样点落在开关边沿附近,采到的电流包含大量开关噪声,电流反馈波形又脏又毛,电流环PI为了追这个脏信号,输出自然也是抖动的。

我当时用示波器看相电流波形,发现每个PWM周期都有高频毛刺,幅度甚至超过正弦基波幅度的10%。后来把ADC采样时刻配置到TIM1的TRGO事件、也就是PWM周期中点,毛刺立刻小了很多。

再一个就是电流环带宽的取值。工程上有个粗略的经验:电流环带宽大致取PWM频率的1/10到1/20。10kHz的PWM,电流环带宽做到500Hz到1kHz是合理的。对应的PI参数可以用如下方式估算:

  • 对于表贴式PMSM,d轴和q轴电感近似相等,设相电阻为R,相电感为L,期望电流环带宽为ωb(rad/s),那么比例增益Kp ≈ L × ωb,积分增益Ki ≈ R × ωb。

这个公式基于一阶惯性系统零极点对消,算出来之后还要用示波器看阶跃响应。如果电流反馈出现几次振荡再稳定,说明带宽估高了,适当减小Kp;如果上升太慢,再加大。不要指望一次计算就完美,电机参数本身就随温度变化,留30%的裕量比较稳妥。

还有一个细节:电流反馈上的RC滤波电容不能太大。有些电路为了把PWM噪声滤干净,在采样运放输出端加了一个100nF甚至1μF的电容,结果电流环带宽被电容限制,相位裕度下降,位置环一加增益就振荡。

2.3 关键点三:位置环PID里的积分项是抖动重灾区

我见过太多人在位置环里照搬PID三段式,把积分项也加进去,然后开始纠结为什么电机总在目标位置附近来回走。这个问题几乎可以算作FOC位置闭环调试里最常见的一个认知盲区。

位置环的输出是什么?对伺服系统来说,位置环的输出是速度指令。速度是由速度环去跟踪的,速度环的积分项已经能消除稳态误差。如果你在位置环再加一个积分项,相当于在一个本身带宽相对较低的环路上引入滞后,位置误差一旦积累,积分输出就会继续推着速度指令往前走,等到了目标位置又因为积分还顶着,直接冲出目标,冲出去之后误差反号,积分又开始反向积累。最后的结果就是极限环振荡,电机在目标点附近来回穿越,误差波形看着像三角波,频率在几Hz到十几Hz之间。

我当时把位置环的I项清零,抖动立刻减弱了大半。正确的级联做法是:位置环只用P,最多加一点微分D作为阻尼,位置环输出的速度指令进入速度环,由速度环的PI来保证稳定跟随。位置环P的工程起步值可以这样算:如果位置环输出是角速度指令(单位rad/s),输入是位置误差(单位rad),那么Kp的单位就是1/s。位置环带宽通常取速度环带宽的1/5到1/10,比如速度环带宽做到20Hz,位置环P可以先取 2π×4 ≈ 25左右,再根据响应调整。

D项要非常克制。很多编码器分辨率有限,1000线的编码器一个计数的角度就是0.09度,位置误差微分出来的速度噪声非常大。D项稍微加多,你会发现电机不抖了,但换成一个极高频的微颤,那就只是把低频抖动转化成了高频噪声。

2.4 关键点四:速度前馈别急着加

前馈这个问题,严格来说不是"抖动源",但它是很多人越调越乱的元凶之一。网上很多调试教程都喜欢讲"加前馈可以减小跟随误差",于是有人一看到位置波形有跟随误差就开始加前馈,结果发现原地抖动更明显了。

原因很简单:前馈是基于位置指令的差分来计算速度前馈量的,而差分操作对编码器噪声和位置指令噪声极其敏感。如果位置指令本身是固定值,原地抖动时根本不存在跟随误差,加前馈完全没有意义;如果是小幅正弦运动,差分出来的速度信号带噪声,乘以前馈系数灌进速度环,反而引入激励。

正确的顺序是:先把纯反馈系统调稳定,电机在目标位置稳稳停住,再考虑前馈。前馈系数也要从0慢慢往上加,同时观察曲线误差。如果加到0.3附近发现速度环开始有高频噪声,先停下来,要么降低前馈系数,要么在速度反馈上加一个合适带宽的低通滤波。前馈是用来提升连续运动跟随性能的,不是用来治抖动的。

3. 八个关键点中的机械与系统部分:编码器、负载与电源

很多嵌入式工程师习惯把所有问题归结到代码和参数上,忽略了一个事实:电机轴连着的物理世界,从来不按照理想模型运行。编码器装偏了、负载晃了、电源软了,这些看起来不相关的因素,最终都会在示波器上变成抖动的波形。下面4个关键点,就是专门排查这些"电路板之外"的问题。

3.1 关键点五:编码器零位和安装偏心的组合影响

先说零位。编码器零位和电机电角度零位如果没有严格对齐,那么整个电角度周期内,你给的电流矢量都不会在真正的q轴上。位置闭环控制的是机械角度,这个偏差不像初始位置检测只影响启动,它会影响全行程的力矩输出,导致在某些机械角度下力矩偏大,某些角度下力矩偏小,电机转动时就会有一阵一阵的转矩脉动。如果位置环增益又比较高,这种转矩脉动会被环路直接放大成抖动。

校准方法不复杂:在电机开环状态下,给一个固定电流矢量,让转子转到一个电角度对齐位置,记录此时编码器的值,这个值就是电角度零位对应的机械角偏移。把偏移量补偿到每次的角度读取里,或者补偿到Park变换的角度输入里。

再说安装偏心。我调试时曾经遇到一个问题:电机空载电流波形总会叠加一个正弦波包络,抖动频率和转速完全同步,转速300rpm时抖动频率就是5Hz。后来把编码器拆下来重新装,才发现码盘中心孔和转轴之间有大约0.2mm的偏心。对半径15mm的码盘来说,这个偏心带来的角度误差大约是0.2/15 ≈ 0.013弧度,也就是0.76度。这个误差看起来不大,但乘以位置环增益映射成速度指令后,足够让电机出现肉眼可见的转速波动。如果是磁编码器,偏心对角度误差的影响类似,而且磁铁位置不正还会引入二次谐波误差。

检查方法:用示波器同时抓A相和B相编码器信号,低速匀速转电机,观察两路占空比是否都在50%附近,正交相位是否接近90度。如果占空比明显不对称,或者相位偏移随转速改变,优先怀疑安装问题。

3.2 关键点六:机械谐振和减速箱回差

机械谐振是我这次调试里绕得最久的一个坑。位置环和速度环参数都已经收敛得很好了,但电机带到某个速度区间时还是会尖叫,而且电流波形上叠加了一个频率很高的振荡分量。用示波器FFT功能测Iq电流波形,能看到在600Hz左右有一个很尖的峰。这个频率既不等于PWM频率,也不等于电流环振荡频率,最后确认是电机转子通过联轴器驱动负载时的扭转谐振点。

原理可以想象成一根弹簧连着两个质量块:电机转子和负载之间存在弹性,控制带宽一旦覆盖到弹簧-质量系统的谐振频率,闭环就形成正反馈,表现为持续的高频振动。机械谐振的典型特征是:电流波形上的振荡频率相对稳定,和转速关系不大;用手捏住负载,振荡频率会变化甚至消失。

最简单的验证方法是用示波器FFT直接找峰值频率,然后在速度环输出后面加一个陷波器(Notch Filter),陷波频率设置到峰值频率,Q值先取1左右,再做微调。如果代码里不方便加陷波器,另一个办法是降低速度环带宽,让控制环路不去激发这个谐振点,代价是动态性能变差。

减速箱回差是另一种情况。带齿轮减速箱的电机,齿轮间隙会导致负载端和电机转子之间有"空行程"。位置闭环中,电机先停在一个啮合面,误差不为零,它就越过间隙去推负载,推到另一边又过冲,然后再次往回推,形成固定幅度的极限环振荡。这种抖动的特点是:幅度很小,频率不高,而且改变位置环P往往没什么用。处理思路是增加反向间隙补偿,在检测到速度方向变化时额外补偿一个固定角度,或者适当降低位置环增益,牺牲一点刚度来避免反复敲击。

3.3 关键点七:母线电压跌落与供电余量

这个关键点最容易被忽略,因为它不属于"控制代码"的范畴,但一旦出问题,所有环路参数都会变得不可理喻。我当时有一次把位置环、速度环、电流环都调得挺顺,给电机加了一点负载后,突然开始低频抖动,而且声音发闷,像喘不上气一样。示波器接到母线电压测试点,发现加速瞬间母线电压从12V掉到了9V多,波形上有明显的一落一起。

原因不外乎两点:电源能力不够,或者母线电容不足。实验室可调电源如果设置了限流,加速超过限流值后电压就会往下掉;电池供电的话,电池内阻和连接线电阻都会造成压降。母线电容的作用是给逆变桥提供一个低阻抗的瞬时能量源,如果电容容量不够,PWM开关产生的脉动电流全部压到电源线上,反馈电压出现周期性波动,电流环的电压指令就会跟着抖。

排查方法:示波器用10倍探头测母线电压,先用DC档看平均值是否稳定,再切到AC档看纹波。正常情况下纹波应当在0.1V量级甚至更低,如果纹波幅度超过0.5V,先检查母线电容和电源线。我当时的整改措施是在驱动板的母线输入端并联了一个470μF电解电容和一个0.1μF陶瓷电容,尽量靠近逆变桥引脚,电压跌落的问题立刻缓解。

还有一个关联检查点:电流环输出电压指令。在MCU里把ud和uq的值通过调试接口发出来,如果uq指令长时间接近母线电压的一半以上,说明电机运行点已经很接近电压极限了。位置闭环里,这意味着电流环没有足够的调节余量,转速或者电流一波动就会触碰电压饱和,环路自然容易失稳。

3.4 关键点八:示波器与调试工具的观测盲区

最后一个关键点其实不是"故障",而是方法论。我见过很多人调FOC位置闭环,观察对象只有两个:电机动不抖、串口打印的位置波形。这两个信号远远不够。位置闭环是多层嵌套系统,你改一个参数,不知道是哪一层先出问题,所以必须把中间变量暴露出来。

最实用的做法:用单片机的DAC、PWM+RC低通滤波,或者串口通信的方式,把位置误差、速度指令、Iq指令、Iq反馈这些变量实时输出到示波器上。比如用两个通道,一路显示目标位置和实际位置,一路显示Iq电流;也可以把速度指令用另一个通道输出,专门看位置环的行为。

这里要提醒一个隐藏问题:如果在Keil里开了高等级优化(比如-O2),你在调试助手或Watch窗口读取结构体变量时,看到的值可能是被优化后的、甚至完全不对的。调试阶段建议把优化等级调到-O0,或者用volatile修饰关键变量。结构体变量在Keil的Watch窗口里可以添加&motor.iq_fb这样的表达式来强制读取地址内容,但更省心的方式是把关键变量通过串口打印或DA输出。

示波器选型方面,像我用的DS138这种便携示波器,FFT功能比较基础,带宽也有限,但看几十赫兹到几百赫兹的控制环振荡完全够用。如果想看PWM开关频率附近的电流细节,至少需要100MHz带宽的示波器,探头接地线尽量短,否则测到的全是开关噪声,不是真实信号。

4. 完整排查链路:按这个顺序走一遍,多数抖动都能查出来

把8个关键点铺开讲完之后,我再把实际的调试顺序串一遍。调FOC位置闭环最忌讳跳步,你从第4层跳到第1层改参数,问题根本没法收敛。这个顺序我实践过很多次,每次基本都能定位到根因。

4.1 第1步:开环对齐,确认编码器和电角度零位正确

先关掉所有环路,只给一个固定的A相导通矢量,让转子强制对齐。连续做5次,记录每次对齐后的编码器读数。如果5次读数偏差小于2个脉冲,说明机械停止位稳定,然后把这个读数作为电角度零位偏移。如果5次读数差异很大,先查机械卡滞和对齐算法,再做下一步。

这个步骤是后面所有调试的地基。地基歪了,后面调出来的"稳定"都是假象,换一个负载角就全崩。

4.2 第2步:电流环闭环,用示波器看Iq阶跃响应

把速度环和位置环都禁用,只让电流环闭环工作。先给一个恒定的Iq指令,比如0.2A,观察Iq反馈波形是否平稳。然后给一个0.2A到0.5A的阶跃,看上升时间有无超调。理想情况是无超调或最多半个超调周期就稳定下来。如果Iq反馈发振,先降低Kp再看;如果出现低频波动,检查电流采样时序和滤波电容。

这一步用的时间不要超过半小时。电流环调不好,后面全是白搭。调试时记得把Iq反馈波形和Iq指令波形叠在一起看,相位差太大也说明电流环带宽不足。

4.3 第3步:速度环闭环,用零速指令检查静音

电流环稳定后,使能速度环,先给零速指令。这时电机应该基本静音,轴用手转起来会有明显的阻力,但松开后不会自己抖动。如果零速指令下就抖动,说明速度环PI参数过强或速度反馈噪声太大。处理办法:先降速度环Kp,再看编码器速度计算是否用了滤波,必要时在速度反馈上加低通滤波,但滤波器截止频率不要低于速度环带宽的5倍。然后给一个低速阶跃,比如60rpm,观察速度响应是否平滑。

4.4 第4步:位置环闭环,从小到大加P,严禁加I

速度环稳定后,启用位置环。这时位置环P从极小值开始,比如从1(1/s)开始,给定一个固定位置目标,观察位置误差波形。如果电机在目标位置附近低频振荡,先把P降一半;如果位置误差收敛很慢,再逐步加倍。位置环P每加一档,都要重新看一遍速度指令波形,如果速度指令已经开始高频颤抖,说明已经到了速度环能承受的上限。记住一个原则:位置环不加I,位置环只输出速度指令。

4.5 第5步:加前馈与抗谐振,最后再优化动态性能

基础静态定位已经稳定后,再做连续运动测试。这时再考虑速度前馈、加速度前馈。每个前馈系数从0开始,每次加0.1,观察跟随误差变化。如果加某个系数时跟随误差没变小反而出现高频噪声,退回去,在这个环节前面加滤波或者陷波器。机械谐振的确认和陷波器也放在这一步做:用示波器FFT测Iq波形,找出频谱中的尖峰,加陷波器,然后用阶跃响应确认系统仍然稳定。

下面是这8个关键点的速查表,我在调试时是打印出来贴在工位上的:

关键点典型现象根因方向优先排查项
转子初始位置检测上电启动就往一边偏,伴随抖动对齐法停位不稳、电角度零位偏差多次对齐一致性、零位偏移保存
电流环带宽/采样高频毛刺,几百Hz电流发振采样时序不对、带宽过高ADC触发时刻、PI带宽估算
位置环积分项目标点附近几Hz极限环振荡位置环带I项引发超调去掉位置环I,位置环只用P(PD)
速度前馈跟随误差调不好,越加越抖差分噪声被前馈放大前馈系数从0慢加,检查噪声
编码器零位/偏心转速同步的转矩脉动零位未校准、码盘偏心零位补偿、A/B相占空比检查
机械谐振/回差高分贝尖叫、间隙敲击传动链弹性、齿轮间隙FFT找峰、陷波器、间隙补偿
母线电压跌落带载后低频喘振电源限流、母线电容不足示波器AC档测纹波、并电容
观测手段不足参数越调越懵看不到中间变量DA/串口输出pos_err、speed_ref、Iq

说实话,这套流程跑完,绝大多数"原地抖动"问题都能有一个明确的答案。我自己调过很多次这种位置闭环,最后发现超过一半的抖动不是单纯PID参数的问题,而是初始位置检测、编码器零位、电流采样时序这些"地基性质"的东西没做好。很多人在第4步反复纠结位置环参数,其实应该多花点时间回到第1步和第2步,把示波器夹好,一层一层看波形,而不是凭手感猜。

最后分享一个小技巧:我每次调完一套参数,都会把示波器截图的波形和当时的参数、现象一起记在调试笔记里,包括环境温度、母线电压、负载状态。这样下次再遇到类似的抖动,翻笔记就能很快定位,不用从头再踩一遍。做电机控制,调试记录和生产代码一样重要。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询