经常遇到这种情况:从开源例程里抄来一套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/A,Ki_cur是V/(A·s)。
2.3 用一台电机算一遍:500Hz带宽下的Kp/Ki
拿一台常见的表贴式永磁同步电机举例,参数如下:
| 参数 | 数值 |
|---|---|
| 定子电阻 R_s | 0.8 Ω |
| 定子电感 L_s | 0.9 mH |
| 极对数 p | 4 |
| 转子磁链 ψ_f | 0.04 Wb |
| 额定相电流 | 5 A |
| 额定转速 | 3000 rpm |
| PWM/电流采样频率 | 10 kHz |
如果期望电流环带宽500Hz,那么ω_bw = 2π×500 ≈ 3141.6 rad/s。
Kp_cur = 3141.6 × 0.0009 ≈ 2.83 V/A
Ki_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执行,Ts=0.0001s,那么ki_dig = 2513 × 0.0001 ≈ 0.2513。
写法二:积分器累加err×dt
integral += 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 温度与饱和对电流环的实际影响
这里就得说一个很多人忽视的问题:参数会漂移。电机常温下Rs=0.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反而可以小一些。
继续用上面那台电机算一下。已知p=4,ψ_f=0.04Wb,则Kt = 1.5×4×0.04 = 0.24 N·m/A。假设负载折算到电机轴的总惯量J=1e-4 kg·m²,期望速度环带宽20Hz,即ω_bw_speed=2π×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.001=0.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的求法
速度环公式需要Kt,Kt又需要ψ_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参数本身,而是“地基”。电流采样时序、转子初始角度、死区补偿、速度反馈质量、限幅保护,这些环节任何一个出了偏差,后续整定都会变成玄学。先把地基夯实,再按公式算出初值、按波形微调,整个调试过程会顺畅得多。