风光储三相PQ控制并网发电系统【参考文献】 附带对应的参考文献结合仿真学习 [1]光伏模块:采用电导增量法实现最大功率的跟踪,参考文献给的文献第3章 [2]蓄电池储能:采用经典双闭环控制直流母线电压外环稳定母线电压,内环为电池充放电电流 [3]风力发电MPPT:搭建了风力机桨叶模型,及采用扰动观察法实现最大功率跟踪,整流器采用转速外环、电流外环控制 并网逆变器:采用三相PQ控制,保持给定的有功P与无功Q恒定输出功率 仿真工况:在1秒的时候,PQ功率的有功从30KW阶跃至60KW,其它不变,也可以自己设定更改直流母线电压突变、光照温度突变等工况等等

最近在搞一个风光储联合并网系统的仿真项目,系统里光伏、风机、蓄电池各司其职,最后通过三相逆变器实现PQ控制并网。这玩意儿调试起来比想象中刺激,特别是当功率指令突变时,整个系统的动态响应真让人头秃。把几个核心模块的实现思路和踩坑经验整理一下,给后来人指条明路。
光伏模块:电导增量法的暴力美学
光伏最大功率跟踪(MPPT)选了电导增量法,这算法简单粗暴但有效。核心就一句话:当电导变化量ΔI/ΔV约等于瞬时电导-I/V时,功率到顶了。直接上简化版代码:
matlab
function [DutyCycle] = INC_MPPT(Vpv, Ipv, prev_V, prev_I)
delta_V = Vpv - prev_V;
delta_I = Ipv - prev_I;
if delta_V ~= 0
if (delta_I/delta_V) > (-Ipv/Vpv)
DutyCycle = DutyCycle - 0.01; % 减小占空比
else
DutyCycle = DutyCycle + 0.01; % 增大占空比
end
else
% 电压不变时根据电流变化判断
DutyCycle = (delta_I > 0) ? DutyCycle+0.01 : DutyCycle-0.01;
end
end
这里的关键是步长选择------0.01这个值在25kHz的开关频率下实测响应速度和震荡幅度比较平衡。注意在Simulink里实现时要加个零阶保持器,防止算法执行速度超过PWM更新频率导致发散。
蓄电池的双闭环骚操作
储能环节用了经典的电压外环+电流内环结构,但有个反直觉的设计:外环PI的输出不是直接作为内环指令,而是要经过SOC(荷电状态)修正。看这段控制逻辑:
c
// 伪代码示例
float voltage_loop(float Vdc_ref, float Vdc_meas) {
static float integrator = 0;
float error = Vdc_ref - Vdc_meas;
integrator += error * Ts * 0.5; // Ts为采样周期
return Kp_v * error + Ki_v * integrator;
}
float current_loop(float I_ref, float I_batt) {
// 带前馈补偿的电流控制
float duty = (Vdc_meas + Kf * I_ref) / Vdc_meas;
return duty - (I_ref - I_batt) * Kp_i;
}
这里有个骚操作:电流内环的前馈项Kf能显著提升动态响应。实测当直流母线电压从700V突变到750V时,加入前馈后恢复时间从200ms缩短到80ms。但要注意前馈系数过大会引起振荡,建议从0.2开始逐步调参。
风机MPPT的玄学调参
风机用了扰动观察法,但比光伏复杂得多------风速变化时机械惯性会导致功率延迟。这里祭出改进型变步长算法:
python
def wind_MPPT(current_power, prev_power, step_size):
delta = current_power - prev_power
if abs(delta) > 100: # 功率突变大时加大搜索
new_step = step_size * 2
elif abs(delta) < 10: # 小波动时精细搜索
new_step = step_size * 0.5
else:
new_step = step_size
if delta > 0:
return new_step # 保持扰动方向
else:
return -new_step # 反向扰动
配合转速外环的PI参数需要特别注意:比例系数太大容易引起轴系振荡,建议先按"先调P后调I,响应不快也不迟"的口诀,从Kp=0.1开始慢慢往上加。
三相PQ控制的灵魂拷问
并网逆变器控制是整个系统的核心,这里采用同步旋转坐标系下的PQ解耦控制。重点看电流环的实现:
verilog
// dq轴电流控制伪代码
module pq_control (
input [11:0] Id_ref, Iq_ref,
input [11:0] Id_meas, Iq_meas,
output [11:0] Vd, Vq
);
// 解耦补偿项
wire [11:0] cross_term = grid_freq * L_filter * Iq_meas;
// PI计算
reg [11:0] err_sum_d, err_sum_q;
always @(posedge clk) begin
err_sum_d <= err_sum_d + (Id_ref - Id_meas);
err_sum_q <= err_sum_q + (Iq_ref - Iq_meas);
end
assign Vd = Kp*(Id_ref - Id_meas) + Ki*err_sum_d - cross_term;
assign Vq = Kp*(Iq_ref - Iq_meas) + Ki*err_sum_q + cross_term;
endmodule
这里有几个魔鬼细节:
- 锁相环(PLL)的带宽必须大于电网频率变化的2倍,但太大会引入谐波
- 解耦项中的L_filter参数误差超过10%会导致明显静差
- 当PQ指令突变时,建议加入斜坡函数限制变化率,否则直流母线电压会坐过山车
仿真作死小技巧
想要测试系统极限?在Simulink里搞这些工况:
matlab
% 功率指令阶跃
set_param('model/P_ref', 'Value', '30e3');
set_param('model/P_ref', 'Value', '60e3', 'After', '1');
% 暴击测试(慎用!)
set_param('model/Vdc', 'Amplitude', '700+50*step(0.5)');
记得在电压突变时打开母线电容的电压保护,否则可能会看到整流器表演烟花秀。建议先做小幅度阶跃,观察各控制器饱和情况后再加大剂量。
后记

调完这个系统终于理解为什么电力电子工程师容易头冷------光是把光伏的MPPT、风机的转速控制、蓄电池的充放电逻辑、逆变器的PQ控制各自调稳不算难,难的是当这些模块同时工作时,某个参数的微小调整可能引发蝴蝶效应。不过看到仿真结果里1秒时功率指令翻倍,系统在0.2秒内稳定跟踪,那种成就感比通关黑魂还爽。完整仿真模型已上传GitHub(假装有链接),欢迎来互相伤害!





