简介:《低速大扭矩永磁同步电机矢量控制技术》是一篇面向无人水下航行器电推进领域的技术文献,适合从事电力电子、电机控制与同步电机矢量控制研究的工程师、研究生阅读。文章在传统磁场定向矢量控制基础上,讨论转速滤波控制、电流耦合控制与负id弱磁控制等改进策略,并以100kW、200r/min的低速大扭矩电机功率实验验证其可行性,对理解低速大扭矩工况下的转矩稳定、电流解耦和弱磁扩速问题具有参考价值。资源包为单个PDF文件,大小约845KB,内容为期刊论文全文,包含摘要、引言、控制策略分析、实验验证与结论等部分,便于直接查阅公式推导、控制框图和实验数据。目前已有461人学习,适合作为UUV推进电机控制方案设计、论文写作和实验对照的案头资料。
1. 从一台 200 r/min 的电机说起:为什么标准 FOC 在这里不够用
200 r/min、4775 N·m,一台 100 kW 的低速大扭矩永磁同步电机在台架上空载能转得很漂亮,可是一旦挂上负载、母线电压又掉了三四十伏,相电流就开始抖,d 轴电流甚至反号。这类工况下,标准的低速大扭矩永磁同步电机矢量控制往往撑不住:转速靠旋变角度差分算出来、电流环 d 轴和 q 轴各管各的、id 一路钉死在 0,这三个默认前提在低速大扭矩场合同时失效。这份资料给出的方案,就是在传统磁场定向控制主链路上插三处补偿——转速滤波、电流交叉耦合、负 id 弱磁,把一台 100 kW/200 r/min 样机从“能转”做到“带载稳定转”。它适合正在做电机控制方向毕设或课设的人,也适合手上有一台低速直驱电机、参数死活调不出来的工程人员:结构不复杂,但每一处补偿都对着一个具体的失效现象。
2. 总体方案:双闭环 FOC 主链路与三处补偿的插入位置
先得把主链路摆平。低速大扭矩电机不是把通用伺服参数抄一遍就能跑,它的电气时间常数大、机械时间常数更大,电流环和转速环的带宽差了将近两个数量级,任何一个环节的噪声都会被后面的积分器放大成看得见的抖动。所以这套方案的做法是:主链路严格按教科书搭,不加花活;所有改进都做成“可插拔的补偿块”,插在明确的位置上,出问题时能单独关掉定位。下面把六个环节和三处插口逐一拆开,先把结构定死,再谈参数。
2.1 主链路的六个环节:从相电流采样到 SVPWM
从控制器往外看,一个电流环周期内要完成的事情是固定的六步。第一步采样两相相电流 ia、ib,第三相由 ic = -ia - ib 重构;第二步 Clarke 变换到静止 αβ 坐标系,iα = ia,iβ = (ia + 2ib)/√3;第三步用转子电角度 θe 做 Park 变换,得到 id = iα·cosθe + iβ·sinθe、iq = -iα·sinθe + iβ·cosθe;第四步两个电流 PI 算出 ud0、uq0;第五步反 Park 变换回 αβ 后送 SVPWM;第六步逆变器输出作用到电机上。外环再加一个转速 PI,输出就是 iq 的给定值。
电角度这一环是整套控制的地基。旋变(RVDT)输出的是机械角 θm,电角度 θe = p·θm - θ0,p = 12 是极对数,θ0 是旋变机械零位与转子 d 轴的夹角偏置。这个 θ0 必须实测标定,不能靠装的时候“看着差不多”——偏 10° 电角度,同样 iq 下出力就掉 1.5%,空载电流还偏大,很多人以为是 PI 参数没调好,其实根子在零位。
用一个具体的数感受一下时间尺度:额定 200 r/min、12 对极,电频率 fe = p·n/60 = 40 Hz,一个电周期 25 ms;开关频率取 10 kHz,意味着每个电周期有 250 个 PWM 周期可用。这个余量是够的,但也仅够——所以下面每个补偿块都必须足够轻,不能塞进迭代求解。
2.2 三处补偿插在哪:转速环前、电流环内、给定值上
三处补偿的位置是这套方案的骨架,位置错了,补偿本身做得再好也没用。
- 转速滤波:插在“角度差分”之后、“转速 PI 的反馈入口”之前。它只改反馈量,不改给定,所以可以随时旁路做对比实验。
- 交叉耦合补偿:插在“电流 PI 输出”之后、“反 Park 变换”之前。它输出的是电压前馈量,和 PI 输出相加,不改变 PI 本身的结构。
- 负 id 弱磁:插在 id 的给定通道上,把原来恒为 0 的 id* 换成随转速和母线电压变化的函数。
一个 PWM 周期内的执行顺序大致是这样,注意补偿块的相对位置:
/* 10 kHz 电流环中断服务程序,执行顺序即控制链路的物理顺序 */ void current_loop_isr(void) { float ia, ib, theta_m, theta_e, we; float id, iq, ud0, uq0, ud, uq; /* 1. 采样:ADC 在 PWM 中心点触发,拿到的是开关噪声最小的时刻 */ ia = adc_read(PHASE_A); ib = adc_read(PHASE_B); theta_m = rvdt_read(); /* 机械角,rad */ /* 2. 转速估计 + 低通滤波(第一处补偿,见第 3 章) */ we = speed_estimate(theta_m) * POLE_PAIR; /* 3. 外环:转速 PI 每 10 个电流周期跑一次,输出 iq 给定 */ if (++speed_div >= 10) { speed_div = 0; iq_ref = pi_speed_calc(w_ref, we / POLE_PAIR); } /* 4. 弱磁给定(第三处补偿,见 4.3/4.4),id_ref 不再恒为 0 */ id_ref = id_ref_weaken(we, iq_ref, udc_measured); /* 5. 坐标变换 + 电流 PI */ theta_e = wrap_2pi(POLE_PAIR * theta_m - theta_offset); clarke_park(ia, ib, theta_e, &id, &iq); ud0 = pi_d_calc(id_ref - id); uq0 = pi_q_calc(iq_ref - iq); /* 6. 交叉耦合补偿 + 电压圆限幅(第二处补偿,见 4.2) */ decouple_and_limit(id, iq, we, udc_measured, &ud0, &uq0, &ud, &uq); /* 7. 反 Park + SVPWM 占空比计算 */ svpwm_update(ud, uq, theta_e); }这段代码要说明三点。POLE_PAIR就是极对数 12,theta_offset是 2.1 节说的机械零位偏置,必须是标定出来的常量而不是宏定义的猜测值。转速环降频到 1 kHz 执行是为了让机械时间常数和采样周期匹配,10 kHz 跑速度环只会把电流噪声灌进积分器。decouple_and_limit把解耦和限幅放在同一个函数里,是因为限幅必须发生在解耦之后——先限幅再叠加前馈,等于前馈量把限幅绕过去了,母线电压跌落时照样饱和。
2.3 100 kW / 200 r/min 样机的参数基线
方案里的所有系数都依赖一组明确的基线参数,脱离这组数谈 τ 取多少、限幅取多少没有意义。下表是按额定点推出来的,其中额定转矩和电频率是算出来的,不是抄的:
| 参数 | 数值 | 来源或换算 |
|---|---|---|
| 额定功率 P | 100 kW | 样机铭牌 |
| 额定转速 n | 200 r/min | 样机铭牌 |
| 额定转矩 T | 4775 N·m | T = 9550·P/n |
| 额定线电压 U | 380 V | 样机铭牌 |
| 极对数 p | 12 | 样机铭牌 |
| 额定电频率 fe | 40 Hz | fe = p·n/60 |
| 开关频率 fsw | 10 kHz | 控制周期 100 μs |
| 直流母线 Udc | 约 540 V | 380 V 三相不控整流 |
| 线性调制区相电压峰值 | 约 312 V | umax = Udc/√3 |
| 额定相电流 | 约 180 A | 按效率 0.95、功率因数 0.9 反推 |
最后两行值得多说一句。umax = Udc/√3 是 SVPWM 线性调制区的理论上限,实际必须打折,因为死区、开关管压降、母线电压纹波都会吃掉几个百分点,工程上取 0.92~0.95 倍比较稳妥。额定电流 180 A 是按 P = √3·U·I·cosφ·η 反推的估算值,用来定电流限幅 imax 的量级(通常取 1.5~2 倍额定),真正写进代码前必须实测。
有了这组基线,弱磁的临界点就能提前算出来。额定点电角速度 ωe = 2π×40 ≈ 251 rad/s,若转子磁链 ψf 在 0.85 Wb 量级,反电动势 ωe·ψf ≈ 214 V,相对 312 V 的电压上限还剩约 30% 的余量;母线电压一旦跌到 85%,umax 只剩 265 V,这个余量迅速被吃光,必须靠负 id 把 d 轴磁路压下去——这正是第 4 章要解决的问题。把这条数算清楚,答辩时被问“为什么这台电机需要弱磁”就能直接答上来。
3. 转速滤波控制:把旋变差分出来的转速变成可用反馈
转速环是整个系统里最容易出现不稳定现象的反馈环节,因为它既是控制量,又是被差分放大过的噪声。低速大扭矩电机对转速精度敏感——转速差 1%,转矩就差 1%,而负载端往往是直驱结构,没有减速比来掩盖误差。这一章从噪声源算起,给出可复现的离散实现和系数整定方法。
3.1 差分转速的噪声从哪来,为什么低速下最致命
旋变输出的是角度,转速只能靠差分得到:ω(k) = K1·[θ(k) - θ(k-1)],其中 K1 与采样周期和角度单位有关,若 θ 用弧度、采样周期 T = 100 μs,则 K1 = 1/T。问题在于差分对噪声的放大倍数是 1/T,也就是一万倍。角度上一点点量化台阶,除以 100 μs 之后就会变成一个跳变的速度值。
算个具体的数:假设角度分辨率 12 位,一个 LSB 对应 2π/4096 ≈ 0.00153 rad,除以 100 μs 得到 15.3 rad/s 的电角速度噪声,再除以极对数 12,机械角速度噪声约 1.28 rad/s,换算成转速约 12 r/min。对一个额定转速只有 200 r/min 的电机,这是 6% 的转速抖动。速度 PI 把这个抖动当真实反馈去积分,输出的 iq 给定就会同频抖动,电流跟着抖,转矩跟着抖,最后变成听得见的电磁噪声。低速大扭矩场合之所以特别吃亏,就是因为额定转速低,同样的绝对噪声占的比例大得多。
除了量化,还有两个来源:一是旋变解码芯片本身的输出更新率有限,两次采样之间角度没变,差分为零,下一次又跳一大格;二是水下推进这类场景里变频器与电机长距离共缆,旋变信号线上耦合的共模干扰会直接反映到角度上。这三种噪声在频谱上都是宽带,没法靠提高采样率消除,只能滤波。
提示:先确认角度差分用的是机械角而不是电角度。若用 θe 差分再除以极对数,量化台阶也被同比例放大,等效噪声不变;但若先由 θe 反推机械角再差分,相当于把分辨率提高了 p 倍,实现上更划算。
3.2 一阶低通的离散化实现
工程上最省事也最够用的是把转速当成一阶惯性环节去滤,连续域传函 ω*/ω = 1/(1 + τs),用后向差分离散之后得到一个只需要两个乘法的递推式:
/* 转速估计 + 一阶低通,运行在 10 kHz 电流环中断里 */ #define TS (1.0e-4f) /* 采样周期 100 us */ #define TAU (5.0e-3f) /* 时间常数 5 ms,截止约 31.8 Hz */ #define K2 (TAU / (TS + TAU)) /* 0.9804,历史项权重 */ #define K3 (1.0f - K2) /* 0.0196,新息权重 */ static float theta_prev = 0.0f; /* 上一拍机械角,rad */ static float w_filt = 0.0f; /* 滤波后机械角速度,rad/s */ float speed_estimate(float theta_now) { float dtheta = theta_now - theta_prev; /* 角度在 0 / 2pi 处回绕,差分必须补一个整周期,否则每转一圈出一个尖峰 */ if (dtheta > PI_F) dtheta -= TWO_PI_F; if (dtheta < -PI_F) dtheta += TWO_PI_F; theta_prev = theta_now; float w_raw = dtheta / TS; /* 差分转速,噪声被 1/TS 放大一万倍 */ w_filt = K2 * w_filt + K3 * w_raw; /* ω*(k) = K2·ω*(k-1) + K3·ω(k) */ return w_filt; /* 返回机械角速度,乘极对数得电角速度 */ }参数逐个解释。TS必须和中断实际周期严格一致,写成 1e-4 而中断因为其他任务超时到 120 μs,滤波的截止频率就整体偏了 20%,转速环带宽跟着漂。TAU是唯一需要依据台架整定的量,下面 3.3 节给方法。K2和K3之和恒为 1,这是稳态无差的必要条件,写死成 0.98 和 0.02 看似差不多,长期积分下来会有 0.2% 的稳态偏差。回绕判断那两个if是最容易被删掉的两行,删了之后示波器上每转一圈出现一个尖锐脉冲,很多人会误判成电流采样干扰,折腾半天。
PI_F和TWO_PI_F用宏而不是每拍调M_PI,是因为这个函数在 10 kHz 中断里跑,浮点库的三角函数开销没必要。整段代码只有一次减法、一次除法、两次乘加,在 200 MHz 级的主控上占不到 1% 的 CPU,台架上实测对中断抖动没有可测影响。
3.3 时间常数 τ 怎么定:和转速环带宽挂钩
τ 不是拍脑袋定的,它受两个约束夹击:太小滤不干净,太大会把转速环拖慢甚至拖到振荡。
先看下限。要压住 3.1 节算出来的 12 r/min 量级的量化噪声,低通截止频率 fc = 1/(2πτ) 至少要低于噪声主瓣的十分之一。而差分噪声的频谱是白噪声被差分整形过的,绝大部分能量集中在 fs/2 附近(5 kHz 量级),所以 τ 取 1 ms 就能把噪声压到 1.5 r/min 以下。
再看上限。一阶低通在转速环穿越频率 ωc 处的相位滞后是 arctan(ωc·τ),这个滞后会直接吃掉转速环的相位裕度。低速大扭矩直驱系统的机械时间常数大,转速环带宽一般取 5~20 Hz,按 10 Hz(ωc = 62.8 rad/s)算,τ = 5 ms 时滞后 17.4°,τ = 10 ms 时滞后 32°——后者已经把相位裕度从 60° 压到 28°,电机一带载就超调。经验做法是把 τ 限制在 1/(5·ωc) 到 1/(10·ωc) 之间,对应 10 Hz 带宽就是 1.6~3.2 ms。
我一般会在这两者之间取一个折中:先从 1/(10·ωc) 起步,用示波器同时抓转速给定阶跃和实际转速,看超调量;超调超过 10% 就把 τ 往回减,抖得厉害就往上加。5 ms 这个值对应的截止频率是 31.8 Hz,介于噪声主瓣和转速环带宽之间,对这台 200 r/min 的样机是在台架上试出来的一个能兼顾两者的点,换一台电机必须重来一遍。
注意:τ 一旦定下来就别再随手改。它是转速环 PI 整定的前置条件,先改 τ 不改 PI,之前调好的增益全部失效,表现出来是“本来好好的,动了个滤波参数就振荡”,排查时会抓错方向。
3.4 滤波带来的相位滞后怎么补
滤波器一定带来滞后,这就需要处理。三种做法,按投入从低到高排。
最省事的做法是接受滞后,把转速环 PI 的比例增益适当放大来补偿相位损失。代价是增益的噪声敏感度上升,本质上是把滤波省下来的噪声又放回去一部分,只适合带宽要求不高的场合。
第二种做法是加给定前馈。转速给定阶跃时,把给定的微分乘一个系数直接叠到 iq 给定上,实际转速就不用靠误差积分去追,相位滞后对动态过程的影响被前馈绕过去了。实现只需要在转速给定变化时算一次差分,代价是对给定的突变敏感,给定本身有阶跃噪声时要把前馈通道也滤一遍。
第三种是把一阶滤波换成带状态观测的估计器,用“角度 + 电流”双输入估计转速,把相位滞后做进观测器的极点配置里。对毕设或课设级别的方案,第二种就够了;真机上如果转速环带宽要求上到 30 Hz 以上,再考虑第三种。
还有一条容易忽略的:滤波后的转速必须同步用于显示和保护,不能“控制用滤波值、过速保护用原始值”。原始值上有 12 r/min 的噪声,过速阈值设在 210 r/min 时,实际转速 198 r/min 就会误触发保护停机,现场排查会怀疑是硬件问题。
4. 电流环补偿:交叉耦合解耦与负 id 弱磁的联合工作
电流环是响应最快的一环,也是补偿收益最直接的一环。传统做法是两个 PI 各调各的,d 轴管 id、q 轴管 iq,两者互不知情。这在小电流、id 恒为 0 的时候没问题,但在低速大扭矩场合,两个前提都不成立:一是动态过程中 id 并不为零(弱磁时长期为负),二是大电流下电感饱和,耦合项的量级会变。这一章把耦合项写清楚,给出解耦实现,再把弱磁叠加进去。
4.1 交叉耦合从哪来:d/q 轴电压方程里的两个交叉项
同步旋转坐标系下的定子电压方程是这样的:
ud = Rs·id + Ld·did/dt - ωe·Lq·iq uq = Rs·iq + Lq·diq/dt + ωe·Ld·id + ωe·ψf
前两项是电阻压降和电感动态项,各自独立,PI 能管。后两项就是耦合:d 轴电压里有一个 -ωe·Lq·iq,来自 q 轴电流在 d 轴电感上产生的旋转反电动势;q 轴电压里有一个 +ωe·Ld·id,来自 d 轴电流的对应作用,再加上磁链项 ωe·ψf。
id = 0 的控制模式下,ωe·Ld·id 这一项恒为零,看起来耦合只影响 d 轴,而 d 轴又不参与转矩输出,所以很多人干脆不管。问题出在两个时刻:一是 id 给定的阶跃瞬间(从 0 切到弱磁负值),ωe·Ld·id 突然出现,q 轴电压被“顶”一下,iq 跟着掉,转矩凹一个坑;二是母线电压跌落、uq 逼近限幅时,本来该由 PI 补的耦合量补不出来,uq 饱和,电流跟踪直接失控,表现出来就是相电流波形削顶、d 轴电流振荡。原始方案里记录的就是这个现象:电池电压低的时候 PI 调节器饱和,d 轴电流出现振荡,加了补偿之后电流跟踪才恢复。
补偿的思路很直接:既然耦合项是可以通过 iq、id、ωe 算出来的已知量,那就前馈抵消掉,让 PI 只管自己那一轴。
ud = ud0 - ωe·Lq·iq uq = uq0 + ωe·Ld·id + ωe·ψf
ud0、uq0 是 PI 的输出。这样处理后,PI 面对的等效对象变成了两个独立的 RL 环节,参数整定可以按单轴来做。
4.2 交叉耦合补偿器的实现与参数来源
/* 电流环解耦 + 电压圆限幅,100 us 中断内调用 */ #define RS (0.012f) /* 定子电阻,Ohm,实测 */ #define LD (3.5e-4f) /* d 轴电感,H,离线辨识 */ #define LQ (6.0e-4f) /* q 轴电感,H,离线辨识 */ #define PSI_F (0.85f) /* 转子磁链,Wb,由反电动势实测反推 */ #define UMAX_K (0.95f) /* SVPWM 线性区打折系数,扣死区和管压降 */ void decouple_and_limit(float id, float iq, float we, float udc, float *ud0, float *uq0, float *ud, float *uq) { /* 1. 耦合前馈:抵消 d/q 轴之间的电感交叉项 */ float ud_ff = -we * LQ * iq; float uq_ff = we * LD * id + we * PSI_F; /* 2. 与 PI 输出相加,得到期望电压 */ float u_d = *ud0 + ud_ff; float u_q = *uq0 + uq_ff; /* 3. 电压圆限幅:超限时按比例缩放,保持电压矢量方向不变 */ float umax = UMAX_K * udc * 0.57735f; /* 0.57735 = 1/sqrt(3) */ float mag = sqrtf(u_d * u_d + u_q * u_q); if (mag > umax) { float k = umax / mag; u_d *= k; u_q *= k; /* 限幅发生时冻结两个电流 PI 的积分,防止饱和后恢复缓慢 */ pi_d_freeze(); pi_q_freeze(); } *ud = u_d; *uq = u_q; }先说参数。RS、LD、LQ、PSI_F四个值必须实测或离线辨识,不能套用同功率等级电机的典型值。表贴式电机的 Ld 和 Lq 接近,内嵌式(凸极)电机的 Lq 通常是 Ld 的 1.5~2 倍,上面给的 3.5e-4 和 6.0e-4 就是按一台凸极率 1.7 的样机给的量级。ψf 最方便的测法是在额定转速下反拖电机测线反电动势峰值,ψf = E_peak/(ωe)。这几个数错 20%,解耦就从不完全变成过补偿,后者比不补还糟。
再说限幅。UMAX_K取 0.95 是给死区和管子压降留余量,这个系数直接决定弱磁提前还是滞后。按比例缩放而不是“保 uq 弃 ud”,是为了让电压矢量的方向不变——电压圆上的最优点本来就该沿径向缩,单独砍一个轴等于人为改变了电压角度,电流会跑偏。
pi_freeze()那两行是抗积分饱和的核心。限幅期间电压已经给不出来了,再让误差继续积分,退出限幅时要花好几个毫秒把积分量卸掉,这几毫秒里电流完全失控。冻结比“积分钳位到输出限幅”更彻底,代价是退出时可能有一个小台阶,台架上实测这个台阶对转矩的影响小于 1%。
4.3 负 id 弱磁:两个限制圆与运行轨迹
弱磁的几何解释很直观。电机运行时,定子电流受逆变器输出能力约束,id² + iq² ≤ imax²,这是一个以原点为圆心的电流限制圆。同时电压受母线电压约束,忽略定子电阻时
(Ld·id + ψf)² + (Lq·iq)² ≤ (umax/ωe)²
这是一个以 (-ψf/Ld, 0) 为圆心的椭圆,随着转速升高,椭圆的长短轴按 1/ωe 收缩。工作点必须同时在圆内和椭圆内,两者的交集就是可行域。
低速、轻载时工作点在可行域内部(图中的 A 点),id = 0 控制完全够用。转速或负载增加,工作点向外移动,到达椭圆边界(B 点),此时电压已经用满,再增大 iq 就会突破电压限制。要继续增载,只能沿椭圆向左移动,id 被迫变负,这就是弱磁。继续增载直到椭圆和圆的交点(Q 点),这是极限,再往上没有可行解。
对这台 100 kW/200 r/min 的样机,200 r/min 时椭圆还没缩到那么小,额定点可以靠 id = 0 跑;但母线电压从 540 V 跌到 460 V,umax 从 312 V 降到 265 V,椭圆收缩 15%,工作点立刻逼近边界,这正对应原始方案的说法:电池供电后期电压不足,ud、uq 达到饱和,必须进入弱磁区。
需要注意的是,弱磁是有代价的。id 为负意味着同样的转矩需要更大的总电流 is = √(id² + iq²),铜耗上升,效率下降。所以弱磁不是越早越好,得卡在电压限制真正生效之后再进,早进就是白白发热。
4.4 弱磁给定值的在线计算
给定值有在线计算和离线查表两条路。在线计算的好处是能实时跟踪母线电压变化,代码也短:从电压椭圆方程里把 id 解出来。
/* 由转速、iq 给定和实测母线电压反算 id 弱磁给定 */ float id_ref_weaken(float we, float iq_ref, float udc_measured) { #define IMAX (300.0f) /* 电流限幅,A,按 1.6 倍额定取 */ float umax = 0.95f * udc_measured * 0.57735f; float denom = we * LD; /* 低速区椭圆很大,不需要弱磁,直接钉 0,避免小信号抖动误入弱磁 */ if (denom < 1.0f) return 0.0f; /* (Ld·id + ψf)^2 + (Lq·iq)^2 = (umax/ωe)^2,解出 id */ float a = umax / denom; /* = umax / (ωe·Ld) */ float b = (LQ * iq_ref) / LD; float rad = a * a - b * b; if (rad <= 0.0f) return -IMAX; /* 电压不够,退到电流极限 */ float id_w = -PSI_F / LD + sqrtf(rad); if (id_w > 0.0f) id_w = 0.0f; /* 不需要弱磁时不允许正 id */ if (id_w < -IMAX) id_w = -IMAX; return id_w; }几个细节要说明。denom < 1.0f这个判断是低速死区,ωe 很小时 a 会算出一个巨大的数,虽然结果会被后面的钳位拉回 0,但中间过程可能溢出,直接短路掉更安全。rad <= 0说明电压椭圆已经缩到装不下当前的 iq 了,这时候返回 -IMAX 是一种保护性退化,实际会触发转矩限幅,让转速上不去而不是过流跳闸。
udc_measured必须用实测值而不是额定值。这是这套方案里最容易翻车的一点:用额定母线电压算出 umax,弱磁永远滞后,母线一跌就饱和振荡;用实测值,弱磁跟着电压走,电压跌多少 id 就负多少。
在线计算每次要一个开方,10 kHz 中断里跑一次大概占几十个时钟周期,对主控没压力。但如果主控还要跑别的任务、或者需要记录弱磁轨迹做分析,可以改成离线二维表:横轴按母线电压分 8 档(400~560 V),纵轴按电角速度分 16 档,离线用同样的公式算出 id 填表,在线做双线性插值。表格大小 128 个 float,占不到 1 kB,查表比开方快一个数量级,而且弱磁曲线在表里看得见,调试时能直接判断工作点走到哪了。
还有一个联合工作的问题:弱磁输出的 id* 是负的,而 4.2 节的解耦项里有 ωe·Ld·id,id 变负会让 q 轴前馈量减小。这两处必须同时生效,只开弱磁不开解耦,q 轴电压会突然少一块,转矩掉一个台阶;只开解耦不开弱磁,id 恒为 0,解耦项里的 ωe·Ld·id 是零,等于白算。所以这两个补偿块在方案里是绑定的,不能拆开单独评估效果。
5. 避坑与排查:低速大扭矩台架上最容易翻车的五个点
方案写得再顺,台架上照样会撞问题。下面五条是我在类似项目里反复见到的,按“现象 → 原因 → 解决”写,症状描述尽量具体到能在示波器上认出来。
5.1 电角度零位没标定,误判成 PI 参数问题
现象:空载运行相电流明显偏大,同样的 iq 给定出力偏小,正转和反转的转矩不对称,正转效率比反转低好几个百分点。很多人第一反应是电流环带宽不够,把 PI 比例一路往上加,加到开始振荡也没改善。
原因:旋变装到电机轴上时,机械零位和转子 d 轴之间有个随机夹角 θ0,没标定就直接当 0 用。θe 整体偏了一个固定角度,Park 变换解出来的 id、iq 就不再是真实的 d/q 轴分量,转矩方程 Te = 1.5p[ψf·iq + (Ld-Lq)·id·iq] 里的 iq 变小了,剩下那部分电流全跑到 id 上,白发热不出力。
解决:直流定位法。给 d 轴通一个不大的直流电流(比如 20% 额定),转子会被吸到 d 轴与定子磁场对齐的位置,此时读取旋变输出,这个角度就是 θ0。正反各做一次取平均,消除摩擦和齿槽的影响。标定完再跑空载,相电流应该明显下降,如果没降说明标定过程本身有问题,检查通电相序。
5.2 转速差分不做回绕处理,每转一圈一个尖峰
现象:转速反馈波形上每隔固定时间出现一个尖锐脉冲,脉冲宽度和 PWM 周期同量级,周期正好等于机械转一圈的时间。低速时这个尖峰尤其明显,转速 PI 输出跟着跳一下。
原因:角度在 0 和 2π 之间回绕,θ(k) - θ(k-1) 在回绕那一拍算出来接近 -2π 而不是一个小的正值,差分出一个巨大的负速度,滤波器只压幅度不改变位置,尖峰照样穿过去。
解决:3.2 节代码里那两个if判断,差分之后检查绝对值是否超过 π,超过就补一个整周期。另外优先用机械角差分再乘极对数,而不是电角度差分,前者分辨率等效提高 p 倍,噪声更小。
5.3 电流采样点没对齐 PWM 中心,THD 降不下来
现象:相电流波形上有明显毛刺,做 FFT 看 5 次、7 次谐波偏高,调制比低的时候毛刺更严重,调制比高的时候反而好转。
原因:ADC 采样时刻与开关动作撞在一起,开关瞬间的 dv/dt 通过寄生电容耦合进采样回路。另外 A/D 转换结果未经处理直接进 Clarke 变换,把开关噪声原样喂给了电流环。原始方案里也明确点出这一点:相电流是正弦周期变量,易受外界电磁环境干扰,A/D 结果直接参与 Clarke 变换容易引起 PI 失效。
解决:ADC 触发源改成 PWM 中心对齐模式,在三角波谷(或峰)触发,这个时刻三相下桥臂同时导通或同时关断,共模干扰最小;采样窗口要避开死区时间。硬件上采样电阻或霍尔传感器的输出加一级 RC 低通,截止频率取开关频率的 1/10 到 1/5。软件上对采样值做 2~4 点的滑动平均,注意滑动平均会引入额外相位滞后,电流环带宽高的时候要把它算进总滞后里。
5.4 解耦用固定电感,大电流下一补偿就过
现象:小电流时解耦效果很好,电流波形干净;负载一加大,uq 反而更容易饱和,相电流开始削顶,比不解耦还差。
原因:Ld、Lq 随电流饱和下降,大电流下实际电感可能只有小信号值的 60%~70%。用固定电感算前馈,补偿量偏大,过补偿会在 d/q 轴之间引入反向耦合,效果比不补更糟。
解决:做电感-电流二维表。用 LCR 表在不同直流偏置下测 Ld、Lq,或者用离线辨识(给定不同的 id、iq 阶跃,从电压响应反推),按 id、iq 各分 8 档填表,在线双线性插值。凸极电机还要注意 Ld 和 Lq 的饱和速度不一样,交叉饱和(iq 影响 Ld)在凸极率大的电机上不能忽略,必要时做二维交叉表。
5.5 没有抗积分饱和,母线电压一跌就振荡
现象:母线电压正常时运行平稳,电压跌 10% 以上后 d 轴电流开始低频振荡,频率在几赫兹到十几赫兹,振幅越来越大,严重时过流保护动作。振荡起来之后即使电压恢复,也要好几秒才能稳住。
原因:电压达到限幅后,PI 的误差还在,积分项继续累积,实际输出电压给不出来但积分器以为给出来了。退出限幅的瞬间,积分项里存着大量“欠账”,输出电压远超需求,系统反向冲过头,形成极限环。原始方案记录的现象就是这个:传统控制策略在电池电压较低时 PI 调节器达到饱和,d 轴电流出现振荡。
解决:三层防护。一是 4.2 节的电压圆限幅 + 限幅时冻结积分;二是积分项单独钳位,上限取电压限幅值的 1.1 倍;三是弱磁提前介入,让电压在饱和之前就通过负 id 腾出余量,从源头减少饱和发生的概率。三层里第一层是必须的,后两层按台架情况加。
6. 验收与答辩:用三组波形和一张指标表把方案讲圆
方案做完,怎么证明它成立?不是跑起来不炸就行,得有一组能对比的实验。我一般会准备三组波形和一张指标表,覆盖“器件正常、传统方案失效、改进方案生效”三个层次。
第一组是逆变器不接电机时的三相输出电压波形,用来验证 SVPWM、死区设置和母线电压是否正常。这组波形是基础,出现任何畸变,后面的实验数据都不可信。第二组是不开三处补偿、按传统 id = 0 控制跑出来的相电流波形,重点抓母线电压跌落时的 d 轴电流振荡——这是方案要解决的靶子,没有这组对照,改进效果无从谈起。第三组是开全部补偿后的相电流波形,理想状态下应该是平滑的正弦,跌压过程中也不削顶、不振荡。三组放在一起,答辩时不用多解释,评委自己就能看出差别。
指标表按下面这些项准备,每一项都要写清测试条件,避免“在不同工况下比数字”这种说不清的事:
| 验收项 | 测试条件 | 合格判据 |
|---|---|---|
| 转速稳态 |
本文还有配套的精品资源,点击获取