
经常遇到这种情况从开源例程里抄来一套FOC代码电机能转但转得很难受。给定转速从1000rpm跳到2000rpm速度环要么颤悠悠地爬半天要么直接冲过头然后来回震荡电流稍微大一点过流保护就跳闸整得人以为硬件哪里焊短路了。于是开始调PI参数今天加Kp明天减Ki调来调去全靠猜最后把某组“看起来还行”的参数焊死在代码里换个环境换个电机又翻车。实际上永磁同步电机FOC里的PI整定是有章法的。无论是电流环还是速度环参数初值都可以根据电机本身的电气参数、机械参数和期望响应带宽直接算出来。算完初值之后再上电微调整个调参工作量能减少一大半。这篇文章就把这套思路完整拆开从三个环的关系、电流环和速度环各自的PI初值公式到实测波形怎么判断、离线参数辨识怎么做再到现场里最容易翻车的几个细节按现场调试的顺序讲清楚。1. 先把三个环的关系理清后面调参才有方向1.1 电流环真正去“拧”电磁转矩的那只手FOC最内层是电流环。它负责让实际d轴、q轴电流快速跟随给定值其中q轴电流决定电磁转矩d轴电流在表贴式永磁同步电机里通常给0。电流环的执行频率是三个环里最高的。频率高不是费电图热闹而是要尽快压制反电动势扰动。电机一转起来反电动势就随着转速抬升如果电流环响应慢q轴电流会被反电动势拽下去转矩就发不出来。所以电流环必须“贴身紧逼”电流指令。电流环的控制对象是什么说到底就是定子绕组的电阻和电感这俩串联成一个一阶惯性环节。电阻决定稳态电压分压电感决定电流变化的快慢。拿生活里的事类比调速就是一个“水流量调节”问题水管有惯性阀门开小了流量半天上不来阀门关猛了又容易水锤。电流环PI要解决的就是让流量电流快速、平稳地抵达目标。1.2 速度环一个只发指令、不直接动手的调节器速度环在电流环外面它不直接生成PWM而是输出q轴电流指令给电流环。也就是说速度环发现转速低了就向电流环多要点扭矩电流转速高了就少要点。很多人一上来就把速度环当成“主控制器”死命调结果越调越乱。原因在于速度环看的“世界”是机械对象的转动惯量、摩擦、负载转矩这些物理量本身就很慢。机械系统的带宽通常只有几赫兹到几十赫兹比电流环慢一个数量级以上。速度环再着急电流环追不上它也白搭。1.3 带宽分配为什么电流环必须比速度环快5到10倍整定PI参数时“带宽”是最核心的概念。带宽可以粗略理解成系统能有效响应的频率范围。速度环需要30Hz的响应能力电流环就要有150Hz以上的带宽甚至更高。内环带宽比外环带宽高5到10倍是FOC整定的基本法则。如果电流环带宽不够速度环加大增益时电流环的相位滞后就会把速度环的相位裕度全部吃光结果就是速度环怎么调都振。反过来电流环带宽太高也不现实它会逼近PWM开关频率采样延迟和数字控制延迟会把系统推向不稳定。工程经验上电流环带宽一般取开关频率的1/10到1/5。开关频率10kHz时电流环带宽可以做到几百赫兹到1kHz开关频率20kHz时有余量做更高。2. 电流环PI初值公式用自己的电机参数算出起点2.1 从电压方程到一阶对象表贴式永磁同步电机在转子旋转坐标系下的q轴电压方程可以写成u_q R_s·i_q L_s·di_q/dt e_q其中e_q是反电动势和交叉耦合项在电流环设计阶段可以当作外部扰动。把这个扰动先放一边电流环的被控对象就是典型的RL一阶惯性环节传递函数是1/(L_s·s R_s)。意思很直白控制量是q轴电压被控量是q轴电流。这个环节有一个一阶极点位于s -R_s/L_s。R_s/L_s的倒数就是电气时间常数T_e L_s/R_s通常在几毫秒量级。电流环的PI参数本质就是围绕这个时间常数做文章。2.2 极点对消让PI零点咬住电气时间常数PI控制器的传递函数是Kp Ki/s Kp·(s Ki/Kp)/s。它有一个零点位置由Ki/Kp决定。如果让PI的零点正好压在电机电气对象的极点上也就是令Ki/Kp R_s/L_s那么极点对消后电流环的开环传递函数就变成了一个纯积分环节G_open Kp/L_s · 1/s纯积分环节在穿越频率处的相位滞后是固定的90度。采样延迟和PWM延迟会再贡献一部分相位滞后但总体还能保住五六十度的相位裕度系统稳定、响应也快。这就是电流环PI整定最经典的极点对消法。假设期望的电流环闭环带宽是ω_bw单位rad/sω_bw 2π·f_bw那么Kp的取值就是Kp_cur ω_bw · L_s积分系数由极点对消条件推出Ki_cur ω_bw · R_s这两个公式就是电流环参数初值的全部秘密。注意单位Kp_cur是V/AKi_cur是V/(A·s)。2.3 用一台电机算一遍500Hz带宽下的Kp/Ki拿一台常见的表贴式永磁同步电机举例参数如下参数数值定子电阻 R_s0.8 Ω定子电感 L_s0.9 mH极对数 p4转子磁链 ψ_f0.04 Wb额定相电流5 A额定转速3000 rpmPWM/电流采样频率10 kHz如果期望电流环带宽500Hz那么ω_bw 2π×500 ≈ 3141.6 rad/s。Kp_cur 3141.6 × 0.0009 ≈ 2.83 V/AKi_cur 3141.6 × 0.8 ≈ 2513 V/(A·s)这套初值对应的物理含义是电流误差1A时比例项输出约2.83V电压积分项以每秒钟2513V/(A·s)的速度累计。用这个初值上电大概率系统能稳定再根据实际波形微调。2.4 数字化时要小心积分系数单位公式给出来的是连续域积分系数但单片机里做的是离散积分。这里有个特别容易踩的坑不同代码里积分项写法不一样积分系数换算差一个数量级参数直接废掉。最常见的两种PI代码写法写法一积分器累加误差原始值integral err; out kp * err ki_dig * integral;这种写法下ki_dig必须把连续域Ki乘以电流环执行周期Ts。比如10kHz执行Ts0.0001s那么ki_dig 2513 × 0.0001 ≈ 0.2513。写法二积分器累加err×dtintegral err * Ts; out kp * err ki_dig * integral;这种写法下ki_dig直接取连续域的值2513即可。如果没搞清楚自己代码是哪种写法就乱代入公式参数偏差会非常大。我见过很多“公式算出来没用”的吐槽十有八九是栽在这一步。3. 电流环实测整定别急着掰参数3.1 调前准备电流采样对齐、输出限幅、保护阈值电流环PI初值算好之后先别急着满功率跑。上电前把几个基础问题确认清楚否则后面波形有一点异常你无法判断是参数问题还是采样问题。第一电流采样时刻必须和PWM载波同步。我习惯在PWM下溢中断或中央对齐点触发ADC采样这样采到的是每个PWM周期内的平均电流而不是开关噪声尖峰。采样点不对时dq轴电流看起来会有一圈一圈的毛刺PI再漂亮也没用。第二确认Clarke/Park变换的正负方向。很多时候电机能转但电流反馈方向反了电流环输出会变成正反馈一加给定就直接过流跳保护。先给小电流验证一下方向再谈整定。第三设置输出限幅和电流保护。调制比先限制在0.95以内电流限幅先设成额定值的50%等确认系统稳定再放开。安全永远在性能前面。3.2 用阶跃和正弦跟踪判断响应质量初值带入后给q轴电流一个20%额定值的小阶跃观察实际q轴电流波形。理想状态是电流在1到3个中断周期内跟上指令几乎没有超调。如果实际波形冲过头再回落比例增益偏高或者采样/计算链路延迟偏大。此时把Kp先降20%看看。如果电流到达稳态特别慢像个老牛拉车一样拖拖拉拉说明实际带宽比预期低可以把Kp适当加大。有信号发生器的话可以给电流指令加不同频率的正弦信号测量闭环幅值和相位。输出幅值掉到0.707倍时的频率就是实际闭环带宽。没有信号发生器也没关系方波阶跃的上升时间、超调量和振荡次数足够判断。3.3 什么样的波形才算“电流环调好了”依我个人经验电流环调好的标准是“稳、快、不让驱动背锅”阶跃响应没有明显超调或者超调不超过5%稳态电流纹波小没有高频振铃成分低速或堵转状态下相电流过零点平滑没有明显的台阶和畸变突加反电动势扰动时比如负载突变电流能在几个毫秒内恢复。如果一加载电流就掉一截慢悠悠复位多半是Ki不足或没做反电动势前馈。可以先把Ki按公式值拉满观察有没有低频振荡如果还差再考虑在速度环或电流环前馈里补反电动势。3.4 温度与饱和对电流环的实际影响这里就得说一个很多人忽视的问题参数会漂移。电机常温下Rs0.8Ω跑到热态后绕组温度可能从25℃升到85℃铜的电阻温度系数大约是0.4%/K换算下来Rs要增大20%以上。电感虽然随饱和略有下降但热态下电机会“变参数”。所以正式量产或长期运行的设备PI初值最好按热态参数计算或者留足余量。Kp和Ki取理论计算值的0.7到0.9倍也能稳定不必追求极限。极限参数在冷态下测着好看热态下可能就直接振荡给你看。4. 速度环PI初值公式让机械惯量说了算4.1 电流环支撑下的速度环模型速度环设计的前提是电流环已经整定得足够快。在这个前提下可以把电流环看成一个“跟随指令极快”的环节q轴电流指令等于实际q轴电流。于是速度环面对的被控对象就简化成了机械转动方程T_e - T_L J·dω_m/dt其中J是折算到电机轴的总转动惯量T_L是负载转矩ω_m是机械角速度。电磁转矩T_e与q轴电流的关系是T_e Kt·i_q。对表贴式永磁同步电机Kt 1.5·p·ψ_f。被控对象从电流指令到转速本质上是一个积分环节再串联一个增益Kt/J。积分环节本身相位滞后就是90度如果速度环PI参数塞得太猛很容易振荡。4.2 Kp_speed、Ki_speed的工程算法设期望速度环带宽为ω_bw_speed单位rad/s那么速度环比例系数可以按下式估算Kp_speed J·ω_bw_speed / Kt分子J越大达到同样角加速度需要的力矩越大电流指令就得给得越足所以Kp和J成正比。分母Kt表示每安培电流能产生多少转矩Kt越大同样电流指令能产生更大的转矩Kp反而可以小一些。继续用上面那台电机算一下。已知p4ψ_f0.04Wb则Kt 1.5×4×0.04 0.24 N·m/A。假设负载折算到电机轴的总惯量J1e-4 kg·m²期望速度环带宽20Hz即ω_bw_speed2π×20≈125.66 rad/s。Kp_speed 1e-4×125.66 / 0.24 ≈ 0.0524 A/(rad/s)意思是转速误差1rad/s时速度环输出约0.0524A的q轴电流指令。积分时间常数可以取期望带宽附近的一个值常用做法是Ti_speed 4 / ω_bw_speed这样速度环零点落在期望带宽的1/4处不会贡献过多相位超前又保留积分消除静差的能力。按20Hz带宽来算Ti_speed≈0.0318s连续域积分系数Ki_speed_cont Kp_speed / Ti_speed ≈ 1.65 A/(rad·s)。离散化换算和电流环一样速度环执行周期要是1kHz、积分器用“integral err”的写法数字积分系数就是1.65×0.0010.00165。4.3 惯量比是速度环上限的隐形天花板速度环的带宽上限往往不是PI参数决定的而是机械系统的谐振频率决定的。联轴器、皮带、齿轮、负载本身都自带弹性会在某个频率附近形成一个或几个机械谐振峰。速度环带宽一旦覆盖到这个谐振峰系统就会在该频率附近发出高频啸叫或抖动。所以在选型阶段要控制一个叫“惯量比”的指标。负载惯量与电机转子惯量的比值如果超过3到5倍机械系统能承受的速度环带宽就会显著下降。现场遇到“速度环再怎么调都振”的情况先别怪PI拿惯量比和机械连接方式出来看。皮带传动的张紧轮松一下、联轴器刚度换高一点往往比调PI有效得多。5. 速度环实测整定从空载阶跃到负载突变5.1 空载速度阶跃找超调与振荡边界速度环初值算好后先把积分系数降到0只保留Kp做一次小幅度速度阶跃比如从0转到额定转速的5%到10%。观察转速反馈。逐次增加Kp直到转速出现振荡或明显超调然后把Kp退回到振荡点的60%到70%。这一步是在寻找当前机械系统能接受的“最野比例”。之后再把Ki从0慢慢往上加。每次加完给个小阶跃观察稳态转速误差和低速下的表现。Ki加到低速时出现一拱一拱的爬行现象就退回当前值的80%。这套“先P后I”的流程虽然土但在各种现场都很好用。5.2 突加负载看静态速降与恢复时间空载调完不代表完事。很多系统空载时稳如老狗一加载就暴露真面目。这时候给电机突加一个额定转矩50%的负载观察转速跌落量和恢复时间。如果转速掉下去很久才爬回来静态速降大说明速度环积分力度不够适当增加Ki。如果恢复过程中转速冲过设定值来回震荡几次才稳定说明Kp带来的阻尼不够适当降低Kp或者给速度反馈加一点低通滤波。速降恢复时间能做进一两百毫秒以内超调控制在15%以内对大多数通用伺服和传动场景就够用了。不必追求极致的快稳定才是第一位的。5.3 齿轮、联轴器、皮带负载的特别提醒不同机械负载对速度环参数的敏感度差异很大。齿轮传动会带来齿隙低速时速度环输出在齿隙附近跳动产生明显的顿挫感。这种情况靠加大Ki反而会放大顿挫正确做法是降低速度环带宽并考虑齿隙补偿算法。皮带传动的弹性变数很大。皮带张紧度变化一点点机械谐振频率就会移动原本稳定的PI参数可能隔几天就变得不稳定。现场处理皮带负载时速度环带宽宁可保守一点给机械参数漂移留些余量。大惯量负载启动时还要注意积分饱和。速度误差长期很大积分器瞬间冲到顶转速会直接冲过头。解决办法是给速度环输出加限幅并且积分器在限幅处做钳位或者采用条件积分。6. 没有铭牌数据先花半小时做一次离线参数辨识6.1 定子电阻R的测量与换算PI初值公式全建立在Rs和Ls之上但很多手里的电机根本没有完整参数表。不用慌半小时内可以离线测出来。定子电阻的测法最简单给电机任意两相之间通一个低压直流恒流等电流稳定后记录电压算出线电阻R_ll。星形接法的相电阻是线电阻的一半即R_ph R_ll/2三角形接法的相电阻是线电阻的1.5倍即R_ph 1.5×R_ll。通电时间要短电流别超过额定值否则绕组发热后电阻值就不准了。6.2 定子电感L的测量方法电感测量可以利用FOC本身来完成。先将转子定位到已知角度然后在d轴方向施加一个电压阶跃记录d轴电流的上升曲线。转子静止时反电动势为零d轴电流上升斜率主要由L_d决定于是L_d ≈ u_d / (di_d/dt)锁住电机不动在q轴施加电压阶跃可以得到L_q。表贴式电机两个电感近似相等都可以当作L_s使用。测量时电流幅值控制在额定值附近偏小脉冲宽度控制在几毫秒以内防止长时间通电发热。6.3 反电动势系数Ke与磁链ψ_f的求法速度环公式需要KtKt又需要ψ_f。测ψ_f最靠谱的办法是拖转法用一台外部电机或人力方式让被测电机以某个已知机械转速旋转用示波器测量线间反电动势的峰值。对于星形接法线反电动势峰值除以√3得到相电压峰值近似等于ψ_f乘以电角速度。即ψ_f ≈ U_phase_peak / ω_e其中ω_e p×ω_m。之后Kt 1.5·p·ψ_f。注意测量时保证转速稳定、转速测量准确反电动势波形最好接近正弦否则波形畸变会带入误差。6.4 在线辨识值得投入吗既然PI参数同电机温度和饱和状态相关那能不能在运行中在线实时辨识参数然后自动修正PI可以但要看投入产出比。对量产伺服驱动器或电动车控制器这类宽工况设备在线辨识加增益调度确实能提升性能。但对大多数项目离线辨识加固定PI参数再加抗饱和与限幅保护已经能覆盖绝大多数工况。在线辨识参数本身也会引入实时性、稳定性和计算资源的问题调试周期会拉长不少。如果只是在做小批量设备花半小时做离线辨识之后按热态参数留余量远比追热门算法划算。7. 反复翻车的现场细节死区、飞车、爬行与温度漂移7.1 电流振铃先怀疑死区与采样时刻有时候电流环参数看起来完全正常但相电流还是会在过零点附近出现明显的“毛刺”甚至整个电流波形像锯齿一样跳动。这种振铃十有八九不是PI参数的问题而是逆变器死区时间过大或者电流采样点没落在正确的PWM位置。死区时间会阻断相电流过零时的换流路径让电流波形在过零点出现平台dq轴电流随之出现脉冲扰动。先做死区补偿或者把死区时间尽量调小再回来看电流波形。采样时刻问题也一样AD触发点不对会让采样值混入开关噪声PI会把噪声当真实电流去抑制最终放大成振铃。7.2 一启动就飞车或过流先查转子初始位置很多准备调PI的板子第一次上电就原地爆炸过流保护瞬间触发。这类问题往往出现在转子初始角度不对而不是PI参数不行。FOC有一个铁律坐标变换角度必须和实际转子磁场位置对准。转子初始位置检测有偏差时给定的d轴电流有一部分被投影成了q轴那一刻电磁转矩方向就错了电流环再努力也是在错误方向上使劲。有编码器的系统可以用磁定位法先在d轴方向通一个固定电流脉冲把转子拉到已知角度再把这个角度作为坐标变换的初始零点。无感系统则要用高频注入或预定位加状态观测器确保启动时转子位置误差在可接受范围内。这一步不做好后面PI调得再漂亮都是空中楼阁。7.3 速度环低频爬行不是Kp不够速度环在低速运行时出现一抖一抖的爬行现象容易被误导成“比例不够、积分不够”。实际上更常见的原因是速度反馈分辨率太低或者速度测量噪声太大。编码器线数不够时低速段速度差分信号就是一个个量化台阶速度环把这些台阶误当成真实的速度波动去纠正于是输出电流也一拱一拱。此时加大Ki反而会放大这个问题。正确的处理是提高速度反馈质量换更高线数的编码器或者用锁相环式速度观测器取代纯差分。如果条件受限就给速度反馈加低通滤波同时把速度环带宽适当降下来保证稳定。7.4 遇到温度漂移把初值余量留足前面在电流环部分提过温度对Rs的影响这其实是整套PI整定里最容易被低估的一个干扰源。冷态调好的参数往往在电机跑热后出现或多或少的响应变化。更稳妥的做法是在整定阶段就按热态参数算初值或者干脆把Kp、Ki按照理论计算值的0.7到0.8倍落地。别因为冷态下波形漂亮就把参数顶到极限留出温度漂移和参数辨识误差的余量长期运行反而更可靠。让我再分享一个压箱底的习惯FOC调试真正花时间的往往不是PI参数本身而是“地基”。电流采样时序、转子初始角度、死区补偿、速度反馈质量、限幅保护这些环节任何一个出了偏差后续整定都会变成玄学。先把地基夯实再按公式算出初值、按波形微调整个调试过程会顺畅得多。