lcl 三相并网逆变器控制,simulink 仿真 包含 dq 变换,锁相环,全状态反馈,LQR (线性二次控制),LQG(高斯二次控制)和卡尔曼观测器的建立,仿真和控制都是在连续域下进行,控制器还用 sfunction 函数进行编写,并网电流可以任意调节,
玩过并网逆变器的朋友都知道,同步坐标系下的控制才是王道。今天咱们撸起袖子搞个硬核仿真,从锁相环到LQG一条龙打通,顺便手撕几个S函数代码。先说清楚啊,这个仿真全程在连续域操作,搞的就是真实物理系统的味道。
先看锁相环这货,江湖人称电网同步的定海神针。在Simulink里用二阶广义积分器搭了个增强型结构,核心代码长这样:
function [theta, sin_theta] = PLL(v_abc) omega_n = 314*2; % 电网频率的2倍频 k = 1.414; % 阻尼系数 % 状态方程实现部分 persistent x; if isempty(x) x = zeros(2,1); end v_alpha = (2/3)*(v_abc(1) - 0.5*v_abc(2) - 0.5*v_abc(3)); dx = [x(2); -omega_n^2*x(1) - 2*k*omega_n*x(2) + omega_n^2*v_alpha]; x = x + dx*Ts; % 注意这里虽然是连续系统,仿真步长还是要处理 theta = atan2(x(2), x(1)); sin_theta = sin(theta); end重点看那个二阶微分方程,这玩意儿实际上模拟了带阻尼的振荡器特性。参数k要是调小了,锁相环能给你表演个相位震荡的街舞。
坐标变换这块大家应该都熟,不过咱们的dq变换矩阵有点讲究——直接挂在锁相环输出的theta角上动态旋转。Matlab Function里这么玩的:
function [id, iq] = abc2dq(i_abc, theta) clarke = 2/3*[1, -0.5, -0.5; 0, sqrt(3)/2, -sqrt(3)/2]; park = [cos(theta), sin(theta); -sin(theta), cos(theta)]; i_dq = park * clarke * i_abc'; id = i_dq(1); iq = i_dq(2); end注意这里的Clarke变换没取幅值不变型,而是功率不变型,这样后续控制器设计时物理量纲更直观。
lcl 三相并网逆变器控制,simulink 仿真 包含 dq 变换,锁相环,全状态反馈,LQR (线性二次控制),LQG(高斯二次控制)和卡尔曼观测器的建立,仿真和控制都是在连续域下进行,控制器还用 sfunction 函数进行编写,并网电流可以任意调节,
重头戏来了——全状态反馈+LQR设计。先建状态方程:
dx/dt = A*x + B*u y = C*x逆变器的LC滤波器状态变量选电感电流和电容电压,扩个积分类防静差。用care函数解Riccati方程得最优增益:
A = [0, -1/L; 1/C, -1/(R*C)]; B = [1/L; 0]; Q = diag([1e5, 1e3, 1e4]); % 电流、电压、积分项的权重 R = 1e-2; [K,~,~] = care(A,B,Q,R);这里有个坑:Q矩阵第一个元素对应电流权重,要是太小了并网电流就跟得了软骨病似的抖个不停。
LQG部分得配合卡尔曼观测器,这里直接上S函数实现:
#define S_FUNCTION_NAME KalmanFilter static void mdlInitializeSizes(...){ ssSetNumContStates(S, 2); // 两个状态量 ssSetNumDiscStates(S, 0); ... } static void mdlDerivatives(...){ real_T *dx = ssGetdX(S); // 状态方程实现 dx[0] = -R/L*x[0] - x[1]/L + u[0]/L; dx[1] = x[0]/C - x[1]/(R*C); } static void mdlOutputs(...){ y[0] = x[0] + Vn; // 叠加测量噪声 }注意虽然说是连续域,但实际仿真时S-function内部还是要处理微分方程的数值积分。观测器增益用kalman函数计算时记得把过程噪声和测量噪声协方差调准了,别让滤波器变成摆设。
最后说说并网电流调节的骚操作——直接在q轴给电流指令就能实现有功无功解耦控制。想要调电流大小?改个参考值的事:
function iref = generate_ref(t) persistent freq; if isempty(freq) freq = 50 + 0.1*randn(); // 模拟电网频率波动 end iref_d = 10*(1 + 0.2*sin(2*pi*0.5*t)); // 带低频脉动的直轴分量 iref_q = 5*(1 - 0.1*cos(2*pi*0.8*t)); // 交轴分量加扰动 end这么搞出来的参考信号能让控制器充分表演抗扰动能力。仿真时看到电流波形紧紧咬着参考线跑,那成就感比通关魂系游戏还带劲。
跑完仿真别急着收工,掏出Powergui做谐波分析。THD要是低于3%,记得给自己加鸡腿——这说明咱们的LQG+卡尔曼滤波组合拳打得漂亮,把电网电压畸变和测量噪声都治得服服帖帖。