一台三相异步电动机,直接合闸接上380V工频电网,会发生什么?大部分人知道"起动电流大、转速慢慢升",但"大"到底有多大,"慢慢"到底有多慢,电流和转矩在头几个周波里到底怎么振荡,这些问题不写方程是答不准的。这次我用三相坐标系状态方程把一整台感应电动机的起动过程完整算了一遍,代码用Matlab实现,把起动电流、电磁转矩、转速爬升曲线全部跑了出来。这篇文章就围绕这套模型展开:为什么选三相坐标系、方程怎么列、Matlab代码怎么写、结果怎么看、以及我踩过的几个坑。
这个实现适合正在做电机仿真、毕设涉及异步电机起动分析、或者想搞懂Simulink电机模块内部机理的读者。代码可以直接复制运行,参数我给的是一台4kW鼠笼电机,跑出来的结果和工程经验对得上:起动电流约6倍额定电流,转矩有强烈振荡,转速从零爬升到同步转速附近。下面一步步来。
1. 为什么用三相坐标系状态方程做起动计算
1.1 直接起动,算的到底是什么
全压直接起动是最简单的起动方式,合闸瞬间电网直接加到定子绕组上。这个过程的特殊性在于:起动瞬间转差率等于1,转子回路感应出很大的电流,定子电流瞬间冲到额定值的5到7倍;同时电磁转矩在最初几个周波里剧烈振荡,有时还会出现负转矩;转速从零逐渐上升,到达稳定转速的时间由机械时间常数决定,可能几百毫秒甚至几秒。
这些现象的本质是机电耦合的暂态过程,单靠稳态等效电路算不出来。稳态等效电路能算出额定工况下的电流、转矩、效率,但算不出合闸瞬间的电流冲击、转矩振荡、转速上升曲线。要算出这些动态量,必须建立电机的微分方程模型,对时间做数值积分。感应电动机在三相静止坐标系下的状态方程就是最直接的数学模型。
所谓"三相坐标系状态方程",就是直接以定子三相电流和转子三相电流(折算值)作为状态变量,加上转速和转子位置角,列写电压方程、磁链方程和机械运动方程,最终整理成dx/dt = f(x, u)的形式,然后交给Matlab做数值积分。这个思路非常透明,所有物理量都是abc三相的瞬时值,不需要坐标变换,适合一步一步看懂每一个量的来龙去脉。
1.2 三相坐标系的痛点:时变电感矩阵
三相坐标系模型最大的"麻烦"在于电感矩阵是时变的。定子绕组轴线在空间固定不动,转子绕组随转子旋转,定子某一相和转子某一相之间的互感,会随着转子位置角θ不断变化。转子转一圈,互感按余弦规律变化一次。所以电感矩阵L中有cosθ、cos(θ+120°)、cos(θ-120°)这样的项,每一步积分都要重新计算。
这也是为什么工程上更常用dq坐标变换:把三相量投影到与转子磁场同步旋转的坐标系里,电感矩阵变成常数矩阵,方程从时变变成时不变。但dq变换需要引入Park矩阵,物理过程被"藏"起来了。三相坐标系虽然矩阵时变,每一步要多算几次三角函数和矩阵求逆,但对Matlab来说这点计算量完全可接受。它的优势是没有任何抽象变换,定子电压、电流、磁链全部是真实物理量,特别适合学习、调试和验证概念。
我的建议是:如果初次接触电机动态模型,一定要先从三相坐标系版本走一遍。你亲眼看到电感矩阵随角度变化、看到电流波形和转矩波形如何被源头上的时变项影响,之后再去理解dq变换,会顺畅得多。如果你一上来就用dq模型,大概率只是套公式,不知道为什么要变换。
1.3 这套代码能做什么、适合谁
做这套模型的价值至少有三个方面。第一,它是所有感应电机暂态分析的基石,从直接起动到后来的降压起动、软起动、变频调速,模型框架完全一样,只是输入电压或电机接线方式不同。第二,它能让你"看见"三相模型和dq模型之间的关系,为后面学空间矢量、直接转矩控制、矢量控制打基础。第三,代码完全可控,你可以随时改参数、改负载、改合闸初相角,观察各类工况的变化。
如果你是在校学生,这套代码可以直接作为电机动态仿真的课程设计或毕设核心内容。如果你做工业应用,比如需要评估一台电机直接起动对电网的冲击、计算机械系统承受的最大转矩冲击,这个模型也能给出定量参考。文章后面所有代码我都整理成可直接运行的Matlab脚本,参数、函数、绘图一应俱全。
2. 状态方程推导与电机参数
2.1 六阶电气方程的基本框架
三相坐标系下的感应电动机电气部分,可以看成两个三相对称绕组:定子三相绕组和转子三相绕组(折算到定子侧)。每一相都满足电压平衡关系:外加电压等于电阻压降加磁链变化率。把所有六相合写成一个矩阵方程,就是
u = R i + d(L i) / dt
其中u是六维电压向量,i是六维电流向量,R是对角电阻矩阵,L是六阶电感矩阵。磁链向量ψ = L i,所以对时间求导时要用乘积法则,展开为
u = R i + L (di/dt) + (dL/dθ) i (dθ/dt)
如果把dθ/dt记为电角速度ω,整理成状态方程的标准形式:
di/dt = L⁻¹ [ u - R i - ω (∂L/∂θ) i ]
这个方程里三项的物理意义非常清楚:第一项是外加电压,第二项是电阻压降,第三项是旋转电动势(运动电动势)。旋转电动势来自电感随转子角度变化,它是电机将机械功率转化为电功率或反过来传递能量的关键项,也是转矩产生的根源。
2.2 电感矩阵长什么样
电感矩阵L由四块组成:
L = [ Lss, Lsr(θ); Lsr(θ)ᵀ, Lrr ]
其中Lss是定子三相自感和互感矩阵,Lrr是转子三相自感和互感矩阵,Lsr是定转子互感矩阵。因为转子参数已经折算到定子侧,定子主磁通电感Lm和转子主磁通电感取同一个值,这样Lsr和Lsr的转置对称出现,整个L矩阵保持对称。
定子侧矩阵的具体形式是:
Lss(i,i) = Lsσ + Lm,Lss(i,j) = -Lm/2,i≠j
为什么非对角线是负的Lm的一半?因为三相绕组在空间互差120°电角度,互感按cos(120°)折算,而正弦分布磁场下两互差120°绕组的互感正好是最大互感的负一半。转子侧结构相同,只要把Lsσ换成Lrσ'。
定转子互感矩阵是核心,它随转子位置角变化:
Lsr(θ) = Lm [ cosθ, cos(θ+2π/3), cos(θ-2π/3); cos(θ-2π/3), cosθ, cos(θ+2π/3); cos(θ+2π/3), cos(θ-2π/3), cosθ ]
这个矩阵的含义是:定子A相轴线在空间0°位置,转子a相轴线在θ位置,两者互感最大时为Lm,实际互感等于Lm乘以它们夹角余弦。转子b相、c相轴线分别超前a相120°和240°,所以和定子各相的夹角要相应加减120°。写代码时要注意,Lsr的转置一定要用Lsr.',不能遗漏。
2.3 电磁转矩与机械方程
转矩从哪里来?磁场储能对转子位置的偏导。整个系统的磁场储能为W = 0.5 iᵀ L i,对机械转角求偏导,经过极对数换算,得到电磁转矩:
Te = p · 0.5 · iᵀ · (∂L/∂θ) · i
这里p是极对数。因为θ是电角度,机械角是θ/p,磁场储能对机械角求导时就会多出一个p因子。电动机的机械运动方程为:
J · dΩ/dt = Te - TL
其中Ω是机械角速度,J是转动惯量,TL是负载转矩。如果把状态变量选为电角速度ω = pΩ,那么微分方程改写为:
dω/dt = p · (Te - TL) / J
这样整个系统的状态向量选择如下:六个电流状态(isa、isb、isc、ira、irb、irc),一个电角速度ω,再加一个转子电角度θ用来更新电感矩阵。共八个状态变量。所有电气量的单位都采用国际单位制,电压伏、电流安、电感亨、转矩牛米。
2.4 一台4kW电机的典型参数
为了让代码直接可跑,我采用一台常见4kW鼠笼电机的典型参数,额定电压380V(线电压,Y接),额定频率50Hz,极对数2,同步转速1500r/min,额定转速约1430r/min。参数表格如下。
| 参数 | 符号 | 数值 | 说明 |
|---|---|---|---|
| 定子电阻 | Rs | 1.405 Ω | 每相 |
| 折算转子电阻 | Rr' | 1.395 Ω | 已折算到定子侧 |
| 定子漏感 | Lsσ | 5.84×10⁻³ H | 每相 |
| 折算转子漏感 | Lrσ' | 4.05×10⁻³ H | 已折算 |
| 励磁电感 | Lm | 0.1722 H | 主磁通对应电感 |
| 转动惯量 | J | 0.0131 kg·m² | 机械系统折算值 |
| 极对数 | p | 2 | |
| 额定负载转矩 | TL_N | 26.7 N·m | 按额定功率和额定转速折算 |
额定电流可以粗略估算:4000W / (√3 × 380V × 0.85) ≈ 7.2A,所以起动电流冲到40到50A是符合经验的。额定转矩按T = P/Ω = 4000/(1430×2π/60) ≈ 26.7 N·m。
3. Matlab代码实现:从方程到可运行脚本
3.1 参数定义与初始状态
Matlab代码第一步是定义电机参数和初始状态。我把参数放进一个结构体P里,方便传递。初始状态设定为电机静止、全部电流为零。注意合闸初相角phi0是一个值得关注的可调参数,后面会专门分析它的影响。默认我取phi0 = -pi/2,即A相电压在t=0时刻过零,避免一上来就强行给A相加峰值电压。
% im_start_main.m % 三相坐标系状态方程感应电动机起动动态计算 clear; clc; close all; % 电机参数 P.Rs = 1.405; % 定子电阻, Ohm P.Rrp = 1.395; % 折算转子电阻, Ohm P.Lssg = 5.84e-3; % 定子漏感, H P.Lrsg = 4.05e-3; % 折算转子漏感, H P.Lm = 0.1722; % 励磁电感, H P.J = 0.0131; % 转动惯量, kg*m^2 P.p = 2; % 极对数 P.TL = 0; % 负载转矩, N*m(空载起动) % 电源参数 P.f = 50; % 频率, Hz P.Ul = 380; % 线电压有效值, V P.Um = P.Ul * sqrt(2/3); % 相电压峰值, V P.phi0 = -pi/2; % A相电压初相角,t=0时A相电压为0 % 初始状态: [isa isb isc ira irb irc omega theta] x0 = zeros(8,1);这里有一个小细节:Y接380V系统,相电压有效值是380/√3≈220V,相电压峰值是220×√2≈311V,所以P.Um = 380*sqrt(2/3)是对的,比380√2要小,别写错。
3.2 状态方程导数函数的完整实现
核心部分是状态方程导数函数im_start_dynamics.m。这个函数先根据当前转子角度θ重新计算电感矩阵,再算电流导数、电磁转矩和转速导数。需要注意:矩阵L是对称的,但求逆时用左除反斜杠,不要显式写inv(L),数值稳定性更好。
function [dx, Te] = im_start_dynamics(t, x, P) % 三相坐标系感应电动机状态方程导数函数 % x = [isa isb isc ira irb irc omega theta]^T % 输出dx为状态导数,Te为电磁转矩 i = x(1:6); omega = x(7); theta = x(8); % 定子/转子电感矩阵 Lss = (P.Lssg + P.Lm) * eye(3) + (-P.Lm/2) * (ones(3) - eye(3)); Lrr = (P.Lrsg + P.Lm) * eye(3) + (-P.Lm/2) * (ones(3) - eye(3)); Lsr = P.Lm * [ cos(theta), cos(theta + 2*pi/3), cos(theta - 2*pi/3); cos(theta - 2*pi/3), cos(theta), cos(theta + 2*pi/3); cos(theta + 2*pi/3), cos(theta - 2*pi/3), cos(theta) ]; L = [Lss, Lsr; Lsr.', Lrr]; % 电感对电角度的偏导数 dLsr = -P.Lm * [ sin(theta), sin(theta + 2*pi/3), sin(theta - 2*pi/3); sin(theta - 2*pi/3), sin(theta), sin(theta + 2*pi/3); sin(theta + 2*pi/3), sin(theta - 2*pi/3), sin(theta) ]; dLdtheta = zeros(6); dLdtheta(1:3, 4:6) = dLsr; dLdtheta(4:6, 1:3) = dLsr.'; % 注意转置,保持对称 % 三相电压源 wt = 2*pi*P.f * t + P.phi0; u = [P.Um*cos(wt); P.Um*cos(wt - 2*pi/3); P.Um*cos(wt + 2*pi/3); 0;0;0]; % 电阻矩阵 R = blkdiag(P.Rs*eye(3), P.Rrp*eye(3)); % 电流状态导数 didt = L \ (u - R*i - omega * (dLdtheta * i)); % 电磁转矩 Te = P.p * 0.5 * i.' * dLdtheta * i; % 机械方程,omega为电角速度 domega = P.p * (Te - P.TL) / P.J; dtheta = omega; dx = [didt; domega; dtheta]; end这个函数返回两个输出,第一个是状态导数,供ode45使用;第二个是电磁转矩,供后处理绘图使用。Matlab调用ode45时只取第一个输出,不会报错,这是合法的函数设计。后处理时单独调用一次函数,用[~, Te] = ...取出转矩即可。
3.3 主脚本:求解、后处理与绘图
求解部分我直接用ode45。注意容差设置:电流通道省量级在几十安,如果绝对容差设得太严,比如1e-5,求解器会疯狂缩小步长,仿真变得很慢;设得太松又看不到波形细节。我的经验是电流通道绝对容差给1e-3,转速和角度通道给1e-2,相对容差给1e-4,速度和精度比较平衡。
% 求解起动过程,仿真1.2秒 tspan = [0 1.2]; opts = odeset('RelTol', 1e-4, 'AbsTol', [1e-3*ones(1,6), 1e-2, 1e-2]); [t, X] = ode45(@(t,x) im_start_dynamics(t, x, P), tspan, x0, opts); % 后处理:计算每个时刻的电磁转矩 Te = zeros(size(t)); for k = 1:numel(t) [~, Te(k)] = im_start_dynamics(t(k), X(k,:).', P); end % 转速换算为 r/min n = X(:,7) / (2*pi*P.p) * 60; % 绘图 figure('Position',[100 100 800 900]); subplot(3,1,1); plot(t, X(:,1), 'r', t, X(:,2), 'g', t, X(:,3), 'b', 'LineWidth', 1); xlabel('t (s)'); ylabel('定子电流 (A)'); legend('i_{sa}','i_{sb}','i_{sc}','Location','EastOutside'); title('三相坐标系感应电动机起动电流动态'); grid on; xlim(tspan); subplot(3,1,2); plot(t, Te, 'LineWidth', 1); xlabel('t (s)'); ylabel('电磁转矩 (N·m)'); title('电磁转矩动态'); grid on; xlim(tspan); subplot(3,1,3); plot(t, n, 'LineWidth', 1.5); xlabel('t (s)'); ylabel('转速 (r/min)'); title('转速爬升过程'); grid on; xlim(tspan);如果你只想快速看结果,这一段就够了。运行时间在普通笔记本上也就几秒钟,取决于ode45的步数。如果要遍历多个初相角或多组参数,建议自己写固定步长RK4,否则ode45的变步长会让每个工况计算时间有波动。
3.4 ode45和自写RK4怎么选
对这套模型,ode45完全够用,代码最省事。但ode45也有两个小问题:一是变步长会让每个工况的计算步数不可控,做参数扫描时总时间不好预估;二是个别极端初相角下ode45可能报"步长降到最小值",这时需要降低容差或换求解器。
自己写四阶RK4也很简单,固定步长比如dt=1e-4秒,仿真1.2秒就是1.2万步,每步调用一次导数函数。RK4的好处是逻辑完全透明,方便在循环里输出中间量,也方便后续改造成实时仿真的离散模型。坏处是固定步长下精度不如ode45的自适应步长,步长要取得足够小。对于这个模型,两个物理时间尺度要同时满足:工频周期20ms,定子瞬态时间常数约7ms左右,转子时间常数约80ms。要看到电流波形细节,步长取0.1ms(1e-4s)够了;如果只看包络线和转速,步长取0.5ms也可以。建议按1e-4设置,别省这点计算量。
4. 起动过程结果怎么读
4.1 起动电流的"双指数"冲击特征
跑出来的电流波形非常典型:起动瞬间,A相和另外两相电流先出现一个很大的冲击,峰值轻松超过40A,相当于额定电流的5到6倍。仔细看在最初几个周波里,电流波形不是对称正弦,而是叠了一个明显衰减的直流分量,这就是所谓的非周期分量。它来自合闸瞬间磁链不能突变的约束:稳态磁链和初始零磁链之间必须有一个衰减直流分量来"补偿"。
这个直流分量的衰减快慢由定子瞬态时间常数决定,大约几十毫秒。之后电流波形逐渐变成对称正弦,但包络仍然在一个较高水平,因为此时转速还没上去,转子电流很大。随着转速升高、转差率减小,电流逐步回落,整个起动电流包络呈现一种"先衰减、再缓降"的双指数特征。前一个衰减快,对应直流分量消失;后一个衰减慢,对应机械转速上升、转差率下降。
运行你会发现,观察不同相的电流峰值并不完全对称,这是因为合闸初相角使各相初始磁链条件不同,直流分量大小不一样。这是三相模型才能看到的细节,dq模型把所有量变换到同步坐标后,这种不对称信息反而被抹掉了。
4.2 转矩振荡与转速爬升的物理含义
电磁转矩曲线在起动初始阶段非常"狂暴":正负交替,峰值可能冲到额定转矩的2到3倍以上,最低还会出现负转矩。负转矩意味着电机短暂地处于"发电"状态,对机械系统来说就是周期性冲击。这种振荡频率和转差频率有关,起动瞬间转差频率高,转矩振荡频率也高;随着转速上升,转差频率下降,转矩振荡频率跟着变低,振荡幅度也逐渐减小。
转速曲线是最直观的:在约0到0.3秒区间,转速快速上升;0.3秒后接近同步转速,进入一个较平缓的爬升段;最终稳定在接近1500r/min的位置。空载起动时,由于模型里没有铁耗和机械损耗,转速几乎能到同步转速附近,只有很小的转差来维持励磁电流。如果带上额定负载,最终稳定转速约1430r/min,更接近实际铭牌值。
要注意的是,转速上升的时间主要由机械系统的转动惯量J决定。J越大,转速爬升越慢,起动过程越长,电动机需要承受大电流的时间也越长。这对工程上选择起动方式很重要:大惯量负载直接起动可能造成电机过热或电网电压骤降。
4.3 合闸初相角不是小事
代码里的P.phi0参数可以模拟在不同时刻合闸的效果。默认取-π/2,A相电压过零时合闸。你可以改成0,让A相在电压峰值瞬间合闸,观察起动电流有什么变化。实测下来,不同初相角下第一周波的电流峰值能差出好几个安培,同时各相直流分量分配比例完全不同。
原因是这样的:电机是感性负载,稳态时磁链滞后电压90°。如果合闸瞬间电压正好是峰值,稳态磁链恰好为零,和初始零磁链一致,直流分量理论上最小,电流冲击相对温和。如果合闸瞬间电压过零,稳态磁链反而接近峰值,初始零磁链需要建立一个很大的直流分量来补偿,冲击更大。当然这是单相理想化解释,三相耦合起来更复杂,但趋势一致。工业上异步电机直接起动时的合闸相角是随机的,所以最恶劣情况下的电流冲击必须留足裕量。
4.4 转动惯量和负载怎么影响动态
把P.J从0.0131改成0.05,你会看到电流大电流持续时间明显变长,转速上升变慢,转矩振荡的衰减也变慢。把P.TL从0改成额定负载26.7N·m,稳定转速会回落到1430r/min附近,稳态电磁转矩等于负载转矩,起动段转矩曲线整体抬升。这两个参数对设计很有参考价值:如果机械负载惯量大,起动时间长了,热积累严重;如果负载转矩在起动过程里还有变化,比如风机泵类负载转矩随转速平方上升,那就不能只看恒定负载的结果。
我把这几组对比整理成一张速查表。
| 参数变化 | 电流冲击 | 转速过渡时间 | 稳定转速 | 转矩振荡 |
|---|---|---|---|---|
| J增大 | 大电流时间变长 | 明显变长 | 基本不变 | 衰减变慢 |
| TL增大 | 略有增大 | 略变短 | 降低(转差增大) | 稳态值抬升 |
| 初相角变化 | 峰值可差数安 | 几乎不变 | 不变 | 首波形态改变 |
| 电源电压升高 | 峰值按比例增大 | 略缩短 | 提高 | 峰值增大 |
5. 常见问题与调参避坑实录
5.1 我踩过的几个坑
第一个坑是电感矩阵的转置搞错。我把Lsr写好后,底部左块直接用了Lsr,结果整个L矩阵不对称,仿真出来的电流波形肉眼可见地"歪",转速也异常。检查方式是打印任意时刻的L矩阵,对比右上和左下是否互为转置。记住一行代码:L = [Lss, Lsr; Lsr.', Lrr],后面别忘了写点转置。
第二个坑是电磁转矩符号反了。一开始我把dLdtheta的符号定义反了,导致Te算出来几乎全是负值,转速从一开始就往下掉,完全不符合起动物理过程。这个问题的排查方法是做稳态检查:空载起动末段Te应该趋近于0,带负载起动末段Te应该趋近于TL。如果符号错了,这两个检查点一定过不了。
第三个坑是ode45步长卡死。在某个初相角下,ode45直接报错,说步长已经小于允许最小值。原因是电流通道绝对容差设得太严,求解器为了达到精度疯狂缩步长。解决办法是把AbsTol适当放宽,比如1e-3,或者改用固定步长RK4。电流这种幅值几十安培的变量,绝对容差给到1e-4以下完全没必要。
第四个坑是转子漏感和定子漏感参数写反。参数表里Lrσ'=4.05mH,有人会把它当成转子端漏感,忘了已经折算到定子侧。如果没折算,转子回路电感差一个数量级,起动电流和稳态转速都会偏。凡是碰到"折算"两字,一定要确认值代入的是哪个量。
5.2 正确性验证的三个检查点
模型跑通了不代表结果对,我每次改完参数都会过三个检查点。
第一个检查点是空载稳态。空载起动结束后,转速应该停在1500r/min附近,电流是一个很小的对称正弦,幅值大概是额定电流的30%左右,电磁转矩在0附近小幅波动。如果转速明显低于同步转速,先看转子电阻是否折算正确。
第二个检查点是额定负载稳态。带上26.7N·m负载,稳态转速应该在1430r/min附近,电磁转矩平均值约等于负载转矩,定子电流约等于额定电流7A左右。如果转速偏差超过50r/min,检查励磁电感Lm和转子电阻。
第三个检查点是起动电流倍率。直接起动峰值电流应该在额定电流的5到7倍,40到50A不等。如果峰值只有两倍额定,多半是电感矩阵偏大或者电压峰值算错了;如果峰值超过10倍,多半是漏感给太小了。漏感决定起动电流的上限,主磁通电感决定运行电流和转矩水平,两者作用完全不一样。
5.3 可以继续扩展的方向
这套三相坐标系模型改一改就能做不少工程仿真。第一个方向是星三角降压起动。只需要在前几秒给电机加380V,等转速上来了再切换成三角形接法,把定子侧电压或接线结构改一下就行,不用动模型主体。第二个方向是软起动器仿真,通过控制晶闸管导通角逐步升高定子电压,可以直接用这套模型观察软起动对电流冲击的抑制效果。第三个方向是砸开dq模型的神秘面纱,把三相模型算出来的电流、磁链做Park变换,和dq模型结果对比,你会非常直观地理解坐标变换的意义。
数据结果还可以继续分析:比如统计起动过程电流的有效值,评估对电网的冲击;把转矩曲线作为机械系统的激励,做传动链扭转振动分析;或者把电机模型封装成Matlab函数,配合simscape搭建完整机电系统。三相坐标模型最宝贵的地方在于所有变量都是原始物理量,你可以直接拿去做各种后处理,不需要担心坐标变换的还原。
跑完这套模型,我最大的体会是:电机动态模型的核心不在Matlab代码本身,而在搞清楚电感矩阵、旋转电动势和转矩表达式之间的逻辑链条。代码只是把公式翻译成数字,公式背后的物理图像才是真正有用的东西。如果你也是第一次写电机模型,我建议把L矩阵和dLdθ矩阵打印出来,盯着看几遍,再对照电流和转矩波形去理解,收获会比直接跑通大得多。这个三相模型跑顺之后,再去碰矢量控制、直接转矩控制这些更复杂的主题,心里就有底了。