4. 同步旋转坐标系下的DFIG模型:dq轴解耦模型
说实话,刚接触双馈风机那会儿,我最头疼的就是这个dq变换。三相交流量来回变,控制起来跟抓泥鳅似的。后来老工程师跟我说了一句话,我到现在还记得——「把交流变成直流,你就赢了」。
嗯,dq变换干的就是这个事。
4.1 为什么要搞同步旋转坐标系?
咱们先想想,三相静止坐标系下的DFIG模型长什么样?
- 电压、电流、磁链都是时变的交流量
- 电感矩阵里全是转子位置角θ的函数
- 耦合严重,你动一个变量,其他跟着乱跳
说白了,就是没法直接设计控制器。你想想看,一个PI控制器面对50Hz的交流量,相位滞后、稳态误差全来了,根本玩不转。
我在项目里遇到过这种情况:现场调试时,用三相静止坐标系下的模型做电流环,调了三天三夜,电流波形还是歪的。后来换成dq坐标系,半天搞定。
核心思想: 通过坐标变换,把基波交流量变成直流量。直流量用PI控制,零稳态误差,完美。
4.2 坐标变换的数学基础
从三相静止abc坐标系到两相同步旋转dq坐标系,需要两步走:
- Clark变换:abc → αβ(两相静止坐标系)
- Park变换:αβ → dq(两相旋转坐标系)
我习惯把Clark变换叫做「降维打击」——把三个变量变成两个,但信息不丢。Park变换则是「跟着转」——让坐标系和转子磁场同步旋转。
变换矩阵长这样:
// Clark变换(等幅值变换)
[ f_α ] [ 1 -1/2 -1/2 ] [ f_a ]
[ f_β ] = [ 0 √3/2 -√3/2 ] [ f_b ]
[ f_0 ] [ 1/2 1/2 1/2 ] [ f_c ]
// Park变换
[ f_d ] [ cosθ sinθ ] [ f_α ]
[ f_q ] = [ -sinθ cosθ ] [ f_β ]
我的小习惯: 实际编程时,我从来不用矩阵形式,太占内存。直接写标量运算,速度能快30%。后面代码示例里我会展示。
4.3 DFIG在dq坐标系下的数学模型
好,现在咱们把DFIG的电压方程、磁链方程统统搬到dq坐标系下。记住一个前提:dq坐标系以同步速ω₁旋转,d轴定向在定子磁链方向上。
4.3.1 电压方程
| 绕组 | d轴方程 | q轴方程 |
|---|---|---|
| 定子 | usd = Rsisd + dψsd/dt - ω₁ψsq | usq = Rsisq + dψsq/dt + ω₁ψsd |
| 转子 | urd = Rrird + dψrd/dt - ωslipψrq | urq = Rrirq + dψrq/dt + ωslipψrd |
注意看,这里出现了ω₁和ωslip。ω₁是同步角速度,ωslip = ω₁ - ωr是转差角速度。这两个耦合项,就是后面解耦控制要处理的对象。
4.3.2 磁链方程
定子磁链:
ψsd = Ls·isd + Lm·ird
ψsq = Ls·isq + Lm·irq
转子磁链:
ψrd = Lr·ird + Lm·isd
ψrq = Lr·irq + Lm·isq
其中:
Ls = Lsσ + Lm (定子自感)
Lr = Lrσ + Lm (转子自感)
Lm = 3/2·Lms (互感)
这里有个关键点:互感Lm是原来的1.5倍。为什么?因为Clark变换时用了等幅值变换,把三相绕组的互感效应折算到两相了。我刚开始学的时候老忘这个系数,仿真结果对不上,查了三天才发现是这里的问题。
避坑指南: 我曾经在项目里直接用电机铭牌上的Lm值代入模型,结果转矩计算全错。记住,铭牌给的是三相静止坐标系下的值,进dq模型前要乘以1.5。除非你用等功率变换,那系数又不一样了。
4.4 dq轴解耦模型
现在咱们把电压方程和磁链方程联立,就能得到完整的dq解耦模型。我直接给最终形式:
定子电压(忽略定子磁链动态,即dψs/dt ≈ 0):
usd = Rs·isd - ω₁·(Ls·isq + Lm·irq)
usq = Rs·isq + ω₁·(Ls·isd + Lm·ird)
转子电压(保留动态):
urd = Rr·ird + (Lr·dird/dt) - ωslip·(Lr·irq + Lm·isq)
urq = Rr·irq + (Lr·dirq/dt) + ωslip·(Lr·ird + Lm·isd)
你仔细看,d轴和q轴之间是不是有交叉项?比如urd方程里出现了irq和isq,urq方程里出现了ird和isd。这就是耦合。
解耦的思路很简单:把交叉项当作前馈补偿掉。
解耦后的控制方程:
// 以转子电流控制为例
urd_ref = (Rr·ird + Lr·dird/dt) - ωslip·(Lr·irq + Lm·isq)
urq_ref = (Rr·irq + Lr·dirq/dt) + ωslip·(Lr·ird + Lm·isd)
// 括号内是PI控制器的输出,括号外是前馈补偿项
4.5 知识体系结构图
下面这张图,是我做培训时必画的。它把整个dq解耦模型的脉络理清楚了:
4.6 实际应用中的注意事项
模型搭好了,但实际用起来还有几个坑。我一个个说:
- 角度精度:Park变换需要的θ角,必须用锁相环(PLL)实时跟踪电网电压。角度差1度,控制精度就掉2%。我见过有人直接用编码器角度,结果并网时电流冲击巨大。
- 滤波器延时:采样回来的电压电流信号,过ADC和滤波器会有延时。这个延时在高转速下会引入相位误差。我的做法是在软件里做相位补偿,具体补偿量根据转速查表。
- 饱和处理:前馈补偿项算出来可能很大,超过变流器输出电压能力。一定要加限幅,不然PI积分器会饱和,动态响应变差。
调试小技巧: 刚开始调dq轴电流环时,先把前馈补偿项置零,只调PI参数。等电流能稳住跟踪了,再把前馈加上。这样出问题容易定位。我每次带新人都是这么教的。
4.7 代码实现片段
最后,给一段我实际项目里用的C代码。这是转子电流环的核心部分:
// 转子电流PI控制 + 前馈解耦
void rotor_current_control(float ird_ref, float irq_ref,
float ird, float irq,
float isd, float isq,
float wr, float *urd, float *urq)
{
// PI参数(工程整定法)
float Kp = 0.85;
float Ki = 12.5;
// 静态变量存储积分值
static float integral_d = 0.0f;
static float integral_q = 0.0f;
// 误差计算
float err_d = ird_ref - ird;
float err_q = irq_ref - irq;
// 积分限幅(防饱和)
integral_d += Ki * err_d * Ts;
integral_q += Ki * err_q * Ts;
if(integral_d > 150.0f) integral_d = 150.0f;
if(integral_d < -150.0f) integral_d = -150.0f;
if(integral_q > 150.0f) integral_q = 150.0f;
if(integral_q < -150.0f) integral_q = -150.0f;
// PI输出
float pi_d = Kp * err_d + integral_d;
float pi_q = Kp * err_q + integral_q;
// 前馈解耦项
float w_slip = 2.0f * PI * 50.0f - wr; // 同步速-转子速
float feedforward_d = -w_slip * (Lr * irq + Lm * isq);
float feedforward_q = w_slip * (Lr * ird + Lm * isd);
// 最终输出电压
*urd = pi_d + feedforward_d;
*urq = pi_q + feedforward_q;
// 输出电压限幅
float amp = sqrtf((*urd)*(*urd) + (*urq)*(*urq));
if(amp > VDC_MAX) {
*urd = *urd * VDC_MAX / amp;
*urq = *urq * VDC_MAX / amp;
}
}
这段代码我用了好几年,从2MW到5MW的机型都跑过。核心就两点:PI输出加前馈补偿,再加上积分和输出电压的双重限幅。做到这步,电流环基本就稳了。
好了,dq解耦模型就讲到这里。说白了,就是把三相交流量变成两个直流量,然后该用PI用PI,该前馈前馈。下一节咱们会基于这个模型,搭完整的矢量控制系统。到时候你会发现,前面这些数学推导,全都能变成一行行代码跑起来。