
如果你玩FOC大概率遇到过这种场面代码烧进去电机一上电就开始吱吱作响轻则像指甲刮黑板重则整个调试台都在共振同事还以为你在搞什么金属加工。我作为一个刚接触电机控制不到一年的“小白”最近刚好把一块无刷电机驱动板从“尖叫”调到了“安静”。这篇笔记就把FOC电流环PI参数从零开始调参的完整过程记录下来重点对比了两种方法一种是从电机模型推公式的“计算法”另一种是边看波形边听声音的“经验法”。两种方法我都实际跑过踩了不少坑也总结出了一些心得希望能给正在被电机噪音折磨的人一点参考。这篇文章适合谁如果你刚开始玩FOC、手里有一块STM32或者类似主控的驱动板电机转起来有噪音、力矩不稳或者你只是想搞明白Kp和Ki到底该怎么给这篇内容应该对你有用。我会尽量把原理和实操串起来讲避免只贴公式或者只给结论。1. 先把问题说清楚尖叫从哪来电流环在FOC里干了什么1.1 一套FOC驱动系统里电流环到底处在什么位置FOCField-Oriented Control磁场定向控制说白了就是把三相电机的定子电流从静止的ABC坐标系变换到一个跟随转子旋转的dq坐标系里。变换之后原本耦合的三相正弦电流变成了两个相对独立的直流分量一个叫直轴电流id控制磁通一个叫交轴电流iq控制转矩。这样电机控制就被简化成“控制电流”而电流环就是这个控制系统里最靠内的一个闭环。完整的FOC链路一般是这样的位置环或速度环在最外面输出转矩指令转矩指令再换算成iq电流指令电流环在中间负责让实际电流快速准确地跟踪这个指令最里面是PWM和逆变器通过SVPWM算法把电流环输出的d轴电压和q轴电压还原成三相占空比。如果电流环跟不上指令外面再好的速度环也白搭。所以电流环PI参数的本质就是决定电流跟踪速度和质量的那组Kp、Ki。调好了电流波形干净、电机安静、转矩平滑。调崩了电流振荡、电机尖叫、发热严重甚至直接把MOS管烧掉。电流环是整个FOC系统里最基础也最关键的一环。1.2 电机“尖叫”的几种典型来源很多人一听到电机响就以为是PI参数不对其实不一定。我调试过程中遇到的“尖叫”按频率和音色可以大概分成几类高频尖锐声几千赫兹通常是电流环带宽过高PI增益偏大PWM输出被噪声激励绕组里产生了高频纹波电流。这种声音和开关频率附近的内容关系很大。中频嗡嗡声几百赫兹常见于积分系数太大造成电流环低频振荡或者速度环和电流环之间耦合共振。尖锐啸叫伴随着电流波形毛刺可能不是PI问题而是电流采样时机不对采到了MOS管开关瞬间的尖峰噪声。咔哒声或周期性顿挫可能是电角度不对、换相错误或者编码器校准偏了电流环再怎么调都救不回来。这说明一个问题调参之前先得确保硬件和角度这两块是干净的否则后面所有操作都是在错误的地基上盖楼。1.3 我的调试平台与准备工作我这次用的平台比较“平民”但很能说明问题主控STM32F103RCT672MHz主频12位ADC。这个芯片算力不算强跑FOC电流环10kHz到20kHz开关频率完全够用。驱动三相全桥MOS管6路PWM互补输出带硬件死区死区时间大约500ns。电流采样双电阻采样通过外部运放放大后送ADC在PWM中心对齐的计数值处触发采样。电机某宝常见的2212无刷电机额定电压12V相电阻大约0.15Ω相电感大约12μH极对数为7。带霍尔传感器这样可以先不管无感观测器的问题专心调电流环。工具示波器带宽100MHz带两个电流探头没有电流探头也可以用采样电阻放大后测量、串口上位机用来实时读写参数、一个可调负载我用了磁粉制动器没有的话用手捏住电机也行只是不太优雅。在开始调电流环之前我先做了两件特别重要的事确认了霍尔角度和PWM输出顺序的对应关系。如果这个不对电流环会直接失控我见过有人在这一步浪费了两天。标定了电流采样增益。我通过给电机通已知大小的直流电流在运放输出端量电压确定了ADC数值和实际电流的换算系数。这一步不做好后面计算法给出的Kp、Ki和实际代码里的数值会对不上。2. 计算法从电机模型推出一组能用的初值2.1 电流环的数学模型从哪来永磁同步电机PMSM在dq旋转坐标系下的电压方程大致是这样ud R*id Ld*did/dt - ωe*Lq*iq uq R*iq Lq*diq/dt ωe*(ψf Ld*id)其中R是相电阻Ld和Lq是直轴和交轴电感ψf是永磁体磁链ωe是电角速度。对于表贴式电机Ld≈Lq≈L并且只关注电流动态时反电动势项ωe*ψf可以看作一个外部扰动。电流环要控制的,其实是阻感负载上的电流。所以电流环的被控对象可以近似成一个一阶惯性环节G(s) 1 / (R L*s)这就是计算法的全部出发点。把电流环当成一个一阶系统来设计PI控制器用零极点对消法就能直接算出Kp和Ki。2.2 零极点对消法推PI参数PI控制器的传递函数写成C(s) Kp Ki/s Kp*(s Ki/Kp)/sPI控制器引入了一个零点也就是s -Ki/Kp。我们希望这个零点正好抵消掉被控对象的极点s -R/L于是令Ki / Kp R / L对消之后整个电流环的开环传函就变成G_open(s) ≈ Kp / (L*s)这样一来电流环的闭环带宽就由Kp决定。闭环带宽ωc的意思直观理解就是电流指令发生阶跃变化时实际电流能以多快的速度跟上。近似关系是ωc ≈ Kp / L所以最终的计算公式就是Kp L * ωc Ki R * ωc或者写成Ki Kp * (R / L)这两个公式就是计算法的核心。2.3 带宽ωc怎么选电流环带宽不是越大越好。带宽越高电流响应越快但同时对采样噪声和PWM死区带来的谐波也会越敏感。而且数字控制系统有延迟一拍延迟加PWM保持实际物理系统还有零阶保持器效应带宽设太高很容易把系统推向不稳定。工程上一般把电流环带宽取在开关频率的1/10到1/20之间。我这次PWM开关频率是20kHz所以目标带宽取1kHz左右换算成角频率就是ωc 2π * 1000 ≈ 6283 rad/s这里提醒一句选带宽的时候要考虑采样频率。电流环带宽再高也不会超过采样频率的1/6左右否则数字延迟很容易让系统失稳。1kHz这个值在20kHz开关频率下是比较稳妥的起点。2.4 实操测量电机参数和计算实例计算法需要电机参数主要是相电阻R和相电感L。我用的方法很简单测电阻用可调直流电源给电机两相之间通入一个小电流比如1A测量端电压算出一相电阻。因为电机内部是星形连接线电阻等于2倍相电阻。我实测两相间电阻0.30Ω所以相电阻R0.15Ω。这里有个坑通电测电阻时电流方向不同测出来的数值会有微小差别因为里面可能有接触电势和电化学效应。我取了正反两次测量的平均值减小误差。测电感电感用LCR表最方便没有的话可以用阶跃法给电机绕组通一个阶跃电压用示波器看电流上升斜率。电感等于电压除以电流变化率L V / (di/dt)。我用LCR表在1kHz频率下测相电感是12μH。带着这两个参数放进前面的公式Kp L * ωc 12e-6 * 6283 ≈ 0.0754单位V/A Ki R * ωc 0.15 * 6283 ≈ 942.5单位V/(A·s)按代码实现习惯我一般把Ki按照整数积分系数去写也就是Ki Kp * R / L 0.0754 * (0.15 / 12e-6) ≈ 942.5。算出来的这组数值就是我第一轮的初始参数。注意这里Kp和Ki的单位跟数学推导一致。但在实际代码里电流值是ADC采样转换出来的数字量电压指令是PWM占空比之间还要乘上采样增益和母线电压系数。也就是说最终写进代码里的Kp、Ki数字跟理论计算值之间差一个换算系数。我习惯先把理论值算出来再根据代码的标定系数换算。2.5 计算法的优缺点项目优点缺点计算法起点合理不会离目标太远有理论依据方便批量复制忽略了PWM延迟、死区、采样滤波等非线性因素电机参数会随温度变化电阻电感并非恒定值经验法直接面对真实系统能处理模型误差调出来的参数更贴合实际依赖调试经验和判读能力参数可解释性差换一台电机可能要重新来一遍所以我的结论是计算法负责给出一个“不会让系统当场炸掉”的初值经验法负责在这个初值附近找到“好听好用”的终值。3. 经验法边听边看把参数调到“安静”3.1 经验法核心从保守值开始观察响应计算法给出的初值即使模型不完全准确通常也在一个可用的范围内。但让我直接拿Kp0.075、Ki942去跑我是不敢的——万一电机参数测量偏差大这个增益可能已经导致振荡。经验法的第一步是先把计算值打一个折我用的是计算值的1/5左右。Kp先取0.015Ki先取50。这个状态下电流环带宽足够低系统基本不会振荡但响应很慢电机转动时会感觉有“肉感”就是指令变化后电流要慢慢爬。然后根据观察结果逐步加参数。加参数的核心原则是先只加KpKp稳定了再加Ki。绝对不能两个同时飞快往上加不然出了问题都不知道是哪个参数惹的祸。3.2 没有电流探头怎么观察电流波形经验法必须能看到电流的实际变化。如果手头没有电流探头有个替代办法直接测量电流采样运放的输出端。运放输出信号就是三相电流经过缩小的复制品虽然幅值小、有直流偏置但波形形状能反映真实电流。我调试时一般把示波器探头接在W相电流采样运放的输出端同时把q轴电流指令和实际反馈波形通过DAC输出或者用串口按一定频率打出来。观察要点有三个静止或低速转动时相电流波形应该是光滑的正弦波没有毛刺、没有高频抖动。给q轴电流一个阶跃指令比如从1A跳到2A实际电流应该在几个毫秒内跟上没有明显超调也没有持续振荡。高速空转时电流包络保持平滑没有周期性突变。如果这些状态都正常基本可以判断电流环调得不错。3.3 经验法调参的具体操作流程我整理了一套可以照做的流程全部做完大概需要一两个小时电机堵转或轻载状态禁用速度环直接给q轴电流一个固定指令比如方波幅值1A周期0.5Hzd轴电流给0。Kp从0开始每次增加10%~30%。每加一次观察阶跃响应和噪音。如果出现高频振荡或尖锐叫声立刻把Kp降回去记录下现在的值。Kp稳定后开始加Ki每次增加20%~50%。观察稳态误差如果给定1A但实际电流只有0.9A说明Ki不够要加。如果电流出现低频摆动说明Ki偏大要减。反复微调Kp和Ki直到阶跃响应没有超调或轻微超调、静差消失、电机没有异常噪音。最后做一组不同转速、不同负载下的验证。注意这时候速度环还没开需要手动给定速度指令并通过电流指令间接转动电机或者先只开电流环用手缓慢旋转电机检查。整个过程中我把每次修改的参数和现象都记录在表格里。别嫌麻烦调试完之后回看这些记录能帮你快速定位“是哪个参数在什么情况下引起了什么现象”。3.4 两组参数的对比实测我把计算法初值组和经验法调整后的参数组做了对比结果很有意思。参数组KpKi现象计算法初值0.075942阶跃响应有轻微超调约8%高速时有高频哨声电流波形有轻微抖动经验法调后0.045500阶跃响应无超调静差小于1%高低速均无明显噪音电流波形干净为什么经验法调后的参数比计算法小因为计算法模型里没考虑数字控制延迟、PWM死区和电流采样滤波。这些因素相当于在电流环里引入了额外的滞后等效于系统实际带宽比理论值低。为了让系统稳定实际Kp只能比理论计算值小一些。这说明一个非常重要的道理计算法告诉你的不是“正确参数”而是“参数的下界附近”。真正的合适参数要靠实验确认。4. 调试过程实录从尖叫到安静的完整记录4.1 第一轮拿着公式上场被现实打脸我第一次按计算法把Kp0.075、Ki942写进代码上电那一刻电机发出刺耳的高频叫声电流波形乱成一团上面全是指针粗细的尖峰根本看不出正弦形状。我当时第一反应是“参数算错了”后来排查了半小时发现问题根本不是PI参数而是电角度偏置没有校准。因为我是用霍尔传感器做转子位置检测的霍尔安装角和电机绕组的对应关系如果没有对准dq坐标系的变换就会错位。实际表现就是你发给电机的q轴电流指令在物理上可能分解出了一个负的d轴电流力矩反而变小电流环反馈紊乱系统就进入了一种“强行追位置”的振荡状态。这件事给我的教训就是调电流环之前必须先确保角度信息是准确且连续的。如果角度都错了后面所有的调参都是白费。校准完电角度之后我用计算法初值重新上电电机能转了但高速时依然有那种哨声。这时候我确定问题真的在PI参数上开始进入经验法微调。4.2 第二轮经验法微调从保守到接近理想第二轮我先把参数降到Kp0.015、Ki50确认系统完全稳定、没有噪音然后开始逐步加Kp。每次加0.005大约相当于当前值的30%观察q轴阶跃响应和声音。加到Kp0.04的时候阶跃响应已经非常漂亮无超调电流上升时间大约1ms比之前快了很多。此时Ki还是很小我发现一个现象稳态时实际电流略小于指令电流大概0.98A对1.00A。这就是积分系数不够稳态误差消不掉。于是我开始加Ki每次加100从50加到500。加到500的时候静差基本消失电流波形依然干净。再往上加到700左右出现了一个新的现象低频振动电机开始“嗡嗡”响电流波形上能看到大约20Hz的包络波动。这是典型的积分系数过大导致积分饱和和低频振荡。我把Ki退回550左右再配合Kp微调到0.045整个系统终于达到了我想要的“安静”状态。4.3 第三轮带负载和变工况验证参数定下来之后我没有立刻收工而是做了几组工况验证低速空载100rpm电流波形平滑无噪音。中速空载300rpm一切正常。高速带载600rpm用磁粉制动器加载到额定转矩的80%电流波形开始有一点纹波增大但没出现振荡声音也还算安静。正反转切换从300rpm正转快速切到300rpm反转电流环没有出现明显超调和振荡系统稳定。我还特意测试了参数在过温条件下的表现——用手摸电机外壳发热后相电阻会上升理论上电流环带宽会略微下降但只要原参数留了裕量系统依然稳定。这也是为什么我不建议把Kp调到刚好压线的位置要给温度留点余量。4.4 参数固化与工程化建议调完参数我把参数组写进了Flash的配置文件里并在代码启动时先做一次自检测量电机相电阻、电感用计算法算出一组初值然后直接把经验法的终值覆盖上去。这样既能在换了电机后快速生成初始参数也能保证量产时每台机器用同一套调好的参数不会因为芯片差异产生问题。如果你要批量调试多套板子我建议把调试好的参数换算成标幺值也就是相对某个基准电流和电压的比例系数。这样即使电机参数不同也能快速套用同一种调参逻辑不需要每台都从头开始。5. 常见现象与排查思路调试速查表现象最可能原因检查方向尖锐高频哨声Kp过大采样噪声被放大死区时间不匹配调小Kp检查采样点位置调整死区配置低频嗡嗡振动Ki过大速度环耦合形成振荡调小Ki检查速度环带宽是否远低于电流环电流波形毛刺多采样时机不对采到了MOS开关噪声地线回路噪声把采样点移到PWM中心优化PCB地线布局电机能转但力矩小电流采样增益标定错误电角度偏置不对重新标定采样系数检查角度校准高速时容易失步电流环带宽不够母线电压利用率不够反电动势补偿缺失适当提高电流环带宽增加电压前馈补偿低速时顿挫电流采样信噪比太低PI参数过于保守提高采样点数或加滤波适当提高Kp再补充几个实战中比较隐蔽的坑第一电流采样点一定要对齐到PWM中心。开关管导通瞬间续流二极管换流会产生很严重的开关噪声尖峰如果ADC在这个时刻采样采回来的电流大概率是错的。我用的STM32F103是中心对齐PWM模式下把ADC启动事件配在周期计数的中心点实际测试下来波形干净了很多。第二PI输出要加限幅而且限幅值不能超过SVPWM的线性调制范围。超过之后会出现过调制输出电压波形畸变电流环的反惯量就会变大表现出来就是电流波形“塌陷”。我在代码里把电压指令限幅到母线电压的0.866倍预留了一点裕量。第三积分器要防饱和。我在q轴电流误差很大时先不开启积分等到电流接近目标值比如误差小于5%再引入积分作用这样可以避免阶跃启动时的大超调。也可以用积分分离或者积分限幅来实现。第四如果电机换了一台参数必须重新调。不同电机的电阻、电感、极对数、磁链都不一样照抄参数大概率不适用。至少要重新测一遍相电阻、相电感用计算法重新生成初值再做一遍经验法微调。调试这台电机前后花了我大约两个周末的时间。回过头看真正让我从“尖叫”走到“安静”的不是某一个参数的灵光一现而是一套清晰的流程先把角度和采样弄对再用计算法搭好起点最后用经验法做精细调整。如果你正在被一台尖叫的电机折磨不妨按这个顺序走一遍大概率能找到问题所在。我个人还有一个习惯每调完一组参数我都会录一段电机运转的视频从尖叫到安静录成一整条存档对比。下次遇到类似问题翻出来看看声音特征能帮你更快判断是哪一类问题。毕竟电机的声音本身就是它最直接的“诊断报告”。