☰
感应电动机起动仿真:基于三相坐标系状态方程的Matlab实现
2026/10/2 10:07:36 网站建设 项目流程

做感应电动机起动仿真,大多数人一上来就用dq坐标系。但实际上三相坐标系状态方程才是理解问题本质的起点。这篇东西不讲教科书上的泛泛推导,直接给你能从物理模型走到Matlab代码的完整路线,顺带把我调试这个模型时踩过的坑、试错出来的经验都放在里面。

先明确这篇内容解决什么问题:你想知道一台鼠笼式感应电动机从静止直接合闸起动,定子电流、电磁转矩、转速到底怎么随时间变化。用三相坐标系下的六阶状态方程,在Matlab里数值积分,就能把这些动态过程完整算出来。这个过程没有坐标变换,没有实虚部分离,所有物理量都是绕组里真实存在的相电压、相电流。适合刚接触电机动态建模的研究生、搞电机控制的工程师,以及任何想弄清楚“书本上的电压方程和磁链方程到底怎么变成一条起动电流曲线”的人。

1. 为什么选三相坐标系:建模思路的一次取舍

1.1 三相坐标系和dq坐标系的本质差异

感应电动机的动态模型有两条经典路线。一条是三相坐标系abc下的自然模型,另一条是经过Park变换的dq旋转坐标系模型。两条路都能算,但算出来的东西侧重点完全不同。

dq坐标系的思路是“把交流变成直流”。定子三相绕组在空间上相差120度,通入三相交流电后产生旋转磁场,各相电压电流都是随时间变化的交流量。通过坐标变换,把三相绕组等效成两个相互垂直的绕组(d轴和q轴),这两个绕组随磁场同步旋转。变换之后,稳态工况下d、q轴分量变成直流量,这就大大简化了控制算法的设计。矢量控制、直接转矩控制全部建立在dq模型之上。代价是:坐标变换背后的数学关系要有一定基础才能理解,而且变换之后,相绕组里真实的不对称信息被抹掉了。

三相坐标系模型是另一条路,思路是“照着电机的物理结构硬算”。定子有A、B、C三个绕组,转子等效成A、B、C三个绕组,总共六个绕组。把每个绕组的电压方程、磁链方程全部写出来,联立成一个六阶微分方程组,然后直接用数值积分方法求解。不搞坐标变换,不搞解耦,就是实打实地算每一相绕组里的电压、电流、磁链。

这两种思路可以类比成拍照:dq坐标系相当于一台能自动追焦的云台相机,画面干净稳定,适合精细操作;三相坐标系相当于一台固定机位的普通相机,画面包含全部原始信息,虽然处理起来笨重些,但每一帧都能看到完整现场。

1.2 三相模型能做什么,不能做什么

三相坐标系模型的第一个优势,是保留了全部不对称信息。dq变换成立的前提是三相对称工况。如果电源电压不平衡、某一相断线、或者发生单相短路,三相电流不再满足空间对称条件,dq模型里某些参数就会变成时变量,算出来的结果并不直观。而abc三相模型天然包含每一相的独立状态,直接就能看到哪一相电流大、哪一相电流畸变,不需要做任何额外处理。

第二个优势是物理概念直观。对初学者来说,“A相绕组电压等于电阻压降加上磁链变化率”比“d轴磁链等于什么什么”更容易建立物理图景。调试模型的时候,如果某相电流曲线走势怪异,你可以直接回头查这一相的电压方程和磁链表达式,定位问题的链条更短。

第三个优势是方便扩展故障模型。想在起动动态计算的基础上再叠加断相、匝间短路、电源跌落等工况,只需要把对应相的方程改一改,或者把电感矩阵里某个元素调整一下,不需要推倒重来。

代价也很明显。六阶微分方程组的数值积分比三阶dq模型计算量大得多,尤其在需要高精度长时间仿真时差距更明显。另外,三相坐标系下的电感矩阵是时变的,因为定转子相对位置在不断变化,每一积分步都需要重新计算电感矩阵,这就对程序实现提出了更高要求。

所以模型选型的关键逻辑是:如果只是做稳态特性分析或者控制系统设计,dq模型效率高得多;如果要做起动动态、不对称工况、故障暂态这类问题,三相坐标系模型才是正确选择。我见过有人硬用dq模型做断相仿真,结果波形解释起来非常费劲,这就是选型出了问题。

2. 感应电动机六阶状态方程的建立过程

2.1 先从物理绕组说起

一台鼠笼式感应电动机,定子是三相绕组,转子是鼠笼导条。做理论分析时,把鼠笼转子等效成星形连接的三相绕组,这就是“转子绕组折算”的物理基础。折算之后,定子有A、B、C三相绕组,转子有a、b、c三相绕组(有些教材写成A、B、C对应定子,用另外的字母表示转子)。

建立模型前要明确方向约定。本文采用电动机惯例:电压正方向与电流正方向一致,正值电流产生正值磁链。按照这个约定,每一相绕组的电压方程写出来就是:

u = R·i + dψ/dt

也就是说,外加相电压一部分降在绕组电阻上(R·i),另一部分用来克服磁链的变化(dψ/dt)。这个式子很简单,但它就是整个动态模型的骨架。六个绕组就有六条这样的方程,矩阵化之后就是:

u_abc = R_s·i_abc + dψ_abc/dt
u_ABC = R_r·i_ABC + dψ_ABC/dt

定子和转子的下标分开写。值得强调的是,转子侧绕组在物理上是短路的,也就是说转子电压向量等于零。这是感应电动机区别于双馈电机的关键点:转子侧没有外加激励,全靠电磁感应产生电流。

磁链方程比电压方程复杂。六个绕组的磁链不仅取决于本绕组电流,还取决于所有其他绕组的电流。把磁链写成矩阵形式:

ψ = L·i

其中ψ和i都是六维向量,L是6×6的电感矩阵。这个电感矩阵就是三相坐标系模型的灵魂,搞懂它,整个模型就通了。

2.2 电感矩阵的组装:自感、互感、转子位置角

电感矩阵L里面,对角元素是各绕组自感,非对角元素是绕组间互感。把这些元素分块来看:

定子三相绕组结构相同,空间互差120度。定子每相自感L_ss是常数,定子绕组之间的互感也是常数。因为三相绕组空间位置对称,任意两相之间的互感都等于−L_ms/2。这里的负号来自120度空间夹角,磁通方向相反,所以互感为负。下标ms对应主磁通对应的互感幅值。

转子折算后的三相绕组也有相同的自感L_rr和互耦−L_mr/2。对于均匀气隙的感应电动机,定子自感和转子自感存在折算关系,后面的参数表会给出具体数值。

难点在于定子与转子之间的互感。转子在旋转,定子A相绕组和转子a相绕组之间的夹角在不断变化,所以定转子互感是转子位置角θ的周期函数。具体来说:

L_Aa = L_ms·cos(θ)
L_Ab = L_ms·cos(θ + 2π/3)
L_Ac = L_ms·cos(θ − 2π/3)

每对定转子绕组之间的互感都等于L_ms乘以它们空间夹角的余弦。θ是转子a相绕组轴线领先定子A相绕组轴线的电角度。这样整个6×6电感矩阵可以写成如下分块形式:

L = [ L_ss L_sr(θ)
L_rs(θ) L_rr ]

其中L_ss和L_rr是常数矩阵,L_sr(θ)是转子位置角的函数矩阵,L_rs(θ)是L_sr(θ)的转置。电角度θ与转子机械角速度ω之间满足:

dθ/dt = p·ω

p是极对数。这一步关系把电磁方程和运动方程连接起来了。

电感矩阵随θ变化,这是三相坐标模型时变性的根源。dq坐标变换之所以被广泛使用,正是因为它能把这种时变性消除掉。但在三相坐标模型里,我们直接面对时变电感矩阵,用数值方法处理它。

2.3 从磁链方程到状态方程

有了电压方程和磁链方程,接下来要变成适合数值积分的形式。这里有两种路径,核心区别在于选择什么量作为状态变量。

路径一:以磁链为状态变量。
把磁链方程ψ = L·i改写成i = L⁻¹·ψ,代入电压方程得到:

dψ/dt = u − R·L⁻¹·ψ

状态变量是六个磁链分量,每个积分步需要计算一次L⁻¹(因为是时变矩阵),然后解出电流,进而算转矩。这个形式的好处是方程右端非常紧凑,不需要处理电感对时间的导数。

路径二:以电流为状态变量。
把磁链方程代入电压方程后,由于电感矩阵是时变的,求导会产生额外项:

u = R·i + L·(di/dt) + (dL/dθ)·ω·i

整理成标准状态方程形式:

di/dt = L⁻¹·(u − R·i − (dL/dθ)·ω·i)

这个形式看起来复杂一些,需要计算dL/dθ,但好处是状态变量直接就是电流,后处理时不需要再做一次矩阵求逆。

两种路径数学上完全等价,但我在实际编程中推荐路径一。原因很直接:dL/dθ的解析表达式容易写错,而且程序越长越容易出低级错误。用磁链做状态变量,方程形式统一,求逆矩阵交给Matlab处理,逻辑清晰得多。代价只是每个积分步多一次L⁻¹计算,对于起动仿真这种秒级时间跨度来说完全可接受。

电磁转矩的表达式。三相坐标系下转矩可以从磁场储能对机械角位移的偏导推出,实用表达式是:

T_e = p · L_ms · [ i_A·i_a·sin(θ) + i_A·i_b·sin(θ+2π/3) + i_A·i_c·sin(θ−2π/3)

  • i_B·i_a·sin(θ−2π/3) + i_B·i_b·sin(θ) + i_B·i_c·sin(θ+2π/3)
  • i_C·i_a·sin(θ+2π/3) + i_C·i_b·sin(θ−2π/3) + i_C·i_c·sin(θ) ]

看起来一大串,其实就是逐项对应定转子绕组间互感随θ的变化率乘以对应电流乘积。程序里用三重循环或直接按矩阵运算写都可以。

运动方程:

J·(dω/dt) = T_e − T_L

J是转动惯量,T_L是负载转矩。把电角度θ和机械角速度ω纳入状态向量,整个系统就是八阶状态方程:六个磁链分量加上ω和θ。不过通常θ不直接出现在电磁方程右端,而通过sin和cos出现,所以状态向量可以压缩成七个变量,但为了程序可读性,我习惯保留八个分量。

3. Matlab代码实现:从参数录入到曲线输出

3.1 电机参数录入与单位陷阱

先给一组典型的小型鼠笼感应电动机参数。这里用标幺值,便于验证结果的合理性。实际电机铭牌参数需要折算到电路模型,折算过程本身就是一门学问,这里不做展开。

参数数值说明
额定线电压U_n380V三相电源线电压有效值
额定频率f50Hz电网频率
极对数p2四极电机
定子电阻R_s0.435Ω折算到定子侧
转子电阻R_r0.816Ω折算到定子侧
定子自感L_ss0.0713H含漏感
转子自感L_rr0.0713H折算后与定子侧相等
定转子互感L_ms0.0693H主磁通对应互感
转动惯量J0.089kg·m²电机本体加负载折算
负载转矩T_L0N·m空载起动,后续可改

这里有一个最容易踩的陷阱,我专门拿出来说。电压必须换算成相电压峰值。电源线电压380V有效值,对应相电压有效值380/√3≈220V,峰值220×√2≈311V。如果直接把311V当成幅值往正弦函数里代,对不起,你算出来的起动电流直接大一倍。我最初调试时波形怎么都对不上,查了半天发现是这里的问题。

程序开头建立电压函数。三相平衡电源电压:

function u = voltage_source(t) Um = 311; % 相电压峰值 f = 50; % 电源频率 omega = 2*pi*f; u = [Um*cos(omega*t); Um*cos(omega*t - 2*pi/3); Um*cos(omega*t + 2*pi/3); 0; 0; 0]; % 转子三相电压为零 end

注意转子侧三个分量是短路绕组,电压恒为零。这是感应电动机的基本特征。

3.2 状态方程函数与ode45调用

接下来写系统微分方程函数。状态向量x定义为六个磁链分量加电角速度ω和电角度θ,共八个分量:

function dxdt = motor_dynamics(t, x, param) % 状态向量分解 psi_s = x(1:3); % 定子磁链 psi_r = x(4:6); % 转子磁链 omega = x(7); % 机械角速度 theta = x(8); % 电角度 % 电感矩阵 Lss = param.Lss; Lrr = param.Lrr; Lms = param.Lms; Lsr = Lms * [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*eye(3) + Lms*[-0.5 -0.5; -0.5 -0.5; -0.5 -0.5] ... % 这里定子互感部分需要仔细写 ...]; % 具体矩阵略,按分块形式写清楚即可 end

电感矩阵的具体写法是容易出错的地方。我建议先把定子侧常数矩阵和转子侧常数矩阵单独算好,L_sr(θ)单独算,最后拼装。注意矩阵维度,6×6的L矩阵不能少任何一块。

电流由磁链反解:

i = L \ [psi_s; psi_r];

这里用矩阵左除而不是inv(),数值稳定性更好,代码也更简洁。

电磁转矩计算。按上一节的转矩公式,先把定转子电流拆出来,然后直接套用三重乘积求和。我习惯把转矩写成单独函数,方便复用。

Te = p * Lms * ( ... );

运动方程:

dxdt = zeros(8,1); dxdt(1:3) = u(1:3) - Rs * i_s; dxdt(4:6) = -Rr * i_r; % 转子电压为零 dxdt(7) = (Te - TL) / J; dxdt(8) = p * omega;

这里dxdt(1:3)对应定子磁链导数的电压方程:dψ/dt = u − R·i。转子侧因为电压为零,dψ/dt = −R·i。运动方程把机械角速度和电角度联系起来了。

主程序调用:

tspan = [0 1.5]; % 仿真总时长1.5秒 x0 = zeros(8,1); % 初始静止,磁链为零 options = odeset('RelTol', 1e-6, 'AbsTol', 1e-8); [t, x] = ode45(@(t,x) motor_dynamics(t,x,param), tspan, x0, options);

起动仿真从零状态开始,也就是说所有磁链、转速、角度全部初始化为零。这个零初始条件对应“电机静止且未通电”,合闸瞬间电压突然接入,正好模拟实际起动过程。

3.3 从状态变量到三相电流波形

仿真完成后,x矩阵里存的是磁链、转速、角度。要得到电流,还是需要逐点反解。把整个矩阵传进循环:

n = length(t); i_abc = zeros(n, 3); for k = 1:n psi = x(k,1:6)'; Lk = build_L(x(k,8)); % 按当前角度重建电感矩阵 ik = Lk \ psi; i_abc(k,:) = ik(1:3)'; % 取定子三相电流 end

这样一个循环后,i_abc就是定子三相电流的完整时域波形。转速直接从x(:,7)取,转矩用电磁转矩函数逐点算。

画图部分不复杂,但有一个关键点要提醒:起动第一周期内的电流波形包含显著的直流衰减分量。电机合闸瞬间,由于磁链不能突变,定子电流中会出现非周期分量,这个分量按定子时间常数衰减,同时叠加在交流分量上。实际启动波形看起来就是电流先剧烈振荡然后逐渐收缩到对称状态。如果你仿真出来的电流从第一个周期开始就是完美正弦,反而是不正常的。

4. 仿真结果判读与验证

4.1 起动电流、起动转矩的合理范围

程序跑完只完成了第一步,更重要的是判断结果对不对。感应电动机直接起动有几个公认的经验数据,可以用于快速验证:

  • 起动电流倍数为额定电流的5到7倍。额定电流I_n = P_n/(√3·U_n·cosφ·η),小型电机一般在10A左右,所以起动电流峰值可能达到70A以上,仿真波形上一眼就能看到电流冲击。
  • 起动转矩倍数为额定转矩的0.8到2倍,四极电机通常接近1到1.5倍。如果计算出的电磁转矩长期远低于负载转矩,电机会堵转,转速永远起不来。
  • 空载起动稳态后,定子电流约为额定电流的20%到40%,对应空载励磁电流。转速接近同步转速(四极电机同步转速1500r/min),稍有转差。
  • 起动时间由转动惯量J和平均加速转矩决定,典型小型电机在0.5到2秒之间完成起动。如果1.5秒内转速还没接近同步转速,要么J设置太大,要么负载转矩过大。

这里有个直观判断仿真是否正确的技巧:看波形是否在合理时间尺度内收敛到稳态。正常起动过程,电流幅值从冲击值逐渐回落,转速从0平滑上升到接近同步转速,这个过程是单调的、平滑的,没有长时间振荡。如果电流衰减需要几十秒,或者转速大幅超调然后震荡,说明模型参数或数值设置有问题。

4.2 从波形细节里读物理过程

三相坐标系模型的一大优势是能够看到真实的相电流波形细节。起动初期磁链建立阶段,定子电流由交流分量和直流分量叠加。直流分量造成电流波形的“偏心”——正半周峰值与负半周峰值不对称,这在dq模型里不容易直接看到。随着直流分量衰减,电流波形逐渐对称化。

电磁转矩的波形更值得关注。起动初期转矩包含明显的2倍频脉动分量,这是定转子电流相互作用、磁场非同步旋转导致的结果。平均转矩等于脉动转矩在一个周期内的平均值,正是这个平均值驱动转子加速。起动转矩的脉动特性在实际电机中会造成噪音和机械冲击,仿真曲线上能看得非常清楚。

转速上升曲线也不是直线。起动初期转矩大,加速度大;随着转速升高进入转矩-转速特性曲线的下降段,加速变慢。从转速曲线上可以估算起动时间和加速过程的平稳性。如果转速曲线在某个区间出现平台甚至下降,要怀疑负载转矩是否已经超过了电机在该转速下的最大转矩。

4.3 负载起动与参数敏感性

把空载起动改成带负载起动很简单:把运动方程里的T_L设成恒定值或者转速的线性函数。比如风机水泵类负载,转矩与转速平方成正比:

TL = 3.5 * (omega/omega_n)^2; % 额定负载转矩按转速平方变化

这时起动时间显著变长,稳态转速下降,转差率增大。对比空载和满载起动曲线,你能直观感受到负载转矩对起动过程的影响。这种“参数怎么变,结果怎么变”的敏感性分析,正是三相坐标模型的好用之处——物理因果关系清晰,每一个参数在方程里都有明确位置。

5. 常见问题与调试经验实录

5.1 数值发散:原因与对策

模型写对但仿真发散,是初学者遇到最多的状况。数值发散通常表现为状态变量快速增长到天文数字,Matlab报错或曲线直接冲飞。常见原因按概率排:

**单位混乱。**这类问题最常见。SI单位制下电压是V,电流是A,电感是H,电阻是Ω。如果把kV直接当V代入,电流会大1000倍,不发散才怪。我建议所有参数全部统一到SI单位,仿真结束后再把结果转成好读的倍数值。

**初始条件与物理约束不符。**三相坐标模型要求初始磁链为零且电流为零。如果人为给了一个非零初始磁链,而转子又没转到对应位置,状态变量之间会有内部矛盾,数值上容易产生冲击。最安全的初始化是全部置零。

**方程刚性。**感应电机模型的电感数值通常较小,而机械时间常数较大,状态变量既有快变分量又有慢变分量,ode45的误差控制可能失效。如果ode45报错或者步长缩小到异常程度,换成ode15s或ode23t这类刚性求解器通常就能解决。

**开关突变太剧烈。**合同瞬间电压从0跳到311V,对数值积分是个强烈的激励。如果步长控制不好,第一小步的误差就会传到后面。把RelTol收紧到1e-6、AbsTol到1e-8,通常可以改善。

5.2 三相坐标模型独有的几个坑

**电感矩阵奇异风险。**从理论上讲,6×6电感矩阵是正定的,不会奇异。但如果参数之间不自洽(比如定子自感和互感搭配不合理),矩阵条件数会很大,逆矩阵计算误差剧增。参数录入后先做一次eig(L)检查特征值,确认矩阵正定是值得养成的习惯。

**相电压和线电压的换算。**前面强调过,仿真模型里用的是相电压峰值,不是线电压有效值。这个错误不会导致发散,但会导致所有电流幅值系统性偏大,而且波形看起来依然“正常”——最坑人的错误类型。

**转子折算参数的理解。**转子电阻和自感必须是折算到定子侧的数值。有些人从电机设计软件直接拿到转子原始参数就放进去,电感量级差了十倍,转矩计算完全失真。确认参数来源,或者通过空载和堵转实验数据反推参数,是建模前的必要步骤。

5.3 调试顺序和提速技巧

我建议的调试顺序是先做最简化验证:把转动惯量设得极大(等效转子几乎不动),此时模型退化成静止状态下的三相变压器,转矩曲线的脉动频率应等于电源频率的两倍。这个结果跟解析解能明确对上,验证通过后再恢复真实惯量,看转速上升过程。

提速方面,ode45对整个仿真时间内的步长控制有大量冗余。如果仿真只需要看起动过程的前0.5秒,就把tspan设成[0 0.5],别把时间延长到稳态,能省不少计算时间。另外,把电感矩阵的计算函数用向量化写法,避免在循环里逐元素赋值,也能显著提升速度。

6. 模型扩展方向与实际应用

三相坐标系状态方程建好后,扩展能力强得惊人。这里列几个我实测过的方向,每个都是在这个模型上小改动就能实现的功能。

**不对称电源电压起动。**把电压函数里三相幅值改为不同的常数,比如A相311V、B相300V、C相280V,就能仿真电压不平衡下的起动过程。你会看到三相电流显著不平衡,转矩脉动加剧,转速曲线出现低频振荡。这种工况在dq模型里要额外引入正负序分解,复杂很多。

**断相起动。**把某一相电压置零,模拟缺相起动。结果非常直观:电机无法从静止状态正常起动,电流中流过很大的堵转电流,转速可能长期低速振荡。这种分析对现场故障诊断有直接参考价值。

**负载转矩突变。**在运动方程里加入时间逻辑,比如t大于某个值后T_L从0跳到额定值,模拟突加负载工况。转速会瞬间跌落然后重新恢复,电流冲击明显可见。

我个人的体会是,三相坐标系模型虽然计算量不如dq模型经济,但作为理解电机动态过程的基石,价值远超那点计算开销。**当你把电机真正当成三个空间上相差120度的绕组,而不是一个抽象的旋转坐标系,很多控制策略和故障现象的本质都能看得更通透。**先把这个模型吃透,再去看dq变换、矢量控制,理解的深度完全不同。

最后分享一个小技巧:所有参数录入前,先手动算一遍稳态空载电流和起动电流的粗略值,跟仿真结果对比。如果量级对不上,别急着调求解器,回头检查参数录入和电压换算问题。我调试那么多模型,发现绝大多数“模型跑不出结果”的问题,根源都在参数没进对,而不是方程写错了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询