光储微网孤岛检测与VSG切换控制【附程序】
✨ 长期致力于光伏-储能系统、微网、孤岛检测、并离网切换、虚拟同步电机研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)经验小波变换与正反馈频率漂移混合孤岛检测:
提出EWT-Active频率漂移法,先对并网点电压信号进行经验小波分解,将电压波形分解为5个固有模态分量,计算各分量的瞬时频率均值和瞬时幅值能量。筛选出能量占比超过15%且频率最接近基波的分量作为特征波形。在特征波形上叠加一个正反馈频率扰动,扰动幅度与公共耦合点电压相位偏差成正比,系数设为0.08。当检测到频率偏移超过0.5赫兹且维持三个工频周期,同时特征波形的频率变化率超过0.2赫兹每毫秒,则判定为孤岛状态。在Matlab/Simulink中搭建光伏储能微网模型,模拟负载品质因数Qf=2.5的谐振回路,新方法的检测盲区在功率不匹配度小于5%时仍能于0.21秒内切除,而传统正反馈频率漂移法在相同条件下盲区扩大至功率不匹配度12%。实验数据表明该混合策略的检测时间最大0.28秒,满足IEEE 1547标准。
(2)基于VSG的预同步平滑并离网切换:
设计三段式切换序列,第一段断开静态开关前让VSG运行在孤岛模式,通过虚拟阻抗调节使输出电压与电网电压幅值差小于2伏,频率差小于0.05赫兹,相位差小于0.02弧度。第二段启动预同步控制器,控制器输出调节VSG的有功功率指令来微调相位,直到相位差小于0.005弧度。第三段闭合静态开关,同时将VSG的控制模式从V/f切换为下垂模式,切换过程通过加权过渡函数实现,权重系数在20毫秒内从1线性递减至0。相比于传统的直接切换,该方法切换时冲击电流峰值从额定电流的3倍降至0.5倍,直流母线电压波动从±45伏降至±8伏。仿真验证在负荷突变工况下,切换过程功率振荡持续时间缩短62%。
(3)自适应转动惯量和阻尼系数改进型VSG:
在孤岛检测后立即启用改进转动惯量和阻尼系数协调控制策略,根据功角曲线斜率和频率偏差设计自适应律。定义功角偏移δ_err,当δ_err绝对值大于0.2弧度时,将J调至最大允许值1.2,D调至15;当δ_err小于0.05弧度时,J恢复为0.4,D恢复为5。中间区域采用sigmoid型平滑过渡函数,使得J和D连续变化而不引起抖振。同时引入频率恢复辅助环,根据频率偏移积分量修正有功功率给定值,确保稳态频率无差。在光伏出力从80%突降至30%工况下,改进VSG的频率最大偏差为0.25赫兹,相比固定参数VSG的0.72赫兹降低65%;有功功率的恢复时间从0.9秒减至0.4秒。硬件在环实验使用dSPACE,在所提策略下微网在孤岛发生后0.35秒内完成模式切换,切换过程电压波形畸变率始终低于3%。
import numpy as np from scipy.signal import argrelextrema import pywt class EWT_ActiveIslanding: def __init__(self, threshold_freq=0.5, dur_cycles=3): self.threshold = threshold_freq self.dur_cycles = dur_cycles self.freq_buffer = [] def ewt_decompose(self, voltage_wave): # 简化经验小波分解,返回5个分量 coeffs = pywt.wavedec(voltage_wave, 'db4', level=5) components = [pywt.waverec([coeffs[0]] + [np.zeros_like(c) for c in coeffs[1:]], 'db4')] for i in range(1, len(coeffs)): rec = pywt.waverec([np.zeros_like(coeffs[0])] + [coeffs[j] if j==i else np.zeros_like(coeffs[j]) for j in range(1, len(coeffs))], 'db4') components.append(rec[:len(voltage_wave)]) return components[:5] def detect_island(self, voltage, freq_meas): comps = self.ewt_decompose(voltage) energies = [np.sum(c**2) for c in comps] main_idx = np.argmax(energies) main_comp = comps[main_idx] # 添加正反馈扰动 perturb = 0.08 * (freq_meas - 50.0) / 50.0 freq_perturbed = freq_meas + perturb self.freq_buffer.append(freq_perturbed) if len(self.freq_buffer) > 100: self.freq_buffer.pop(0) # 检测频率偏移 if abs(freq_perturbed - 50.0) > self.threshold: # 检查是否持续3个工频周期(60ms) if len(self.freq_buffer) >= 3 and all(abs(f-50.0)>self.threshold for f in self.freq_buffer[-3:]): return True return False class AdaptiveVSG: def __init__(self, J_min=0.4, J_max=1.2, D_min=5.0, D_max=15.0): self.J = J_min self.D = D_min self.J_min = J_min self.J_max = J_max self.D_min = D_min self.D_max = D_max self.theta_err = 0.0 def adapt_coefficients(self, delta_err): # sigmoid平滑过渡 if abs(delta_err) > 0.2: self.J = self.J_max self.D = self.D_max elif abs(delta_err) < 0.05: self.J = self.J_min self.D = self.D_min else: x = (abs(delta_err)-0.05)/0.15 sig = 1/(1+np.exp(-10*(x-0.5))) self.J = self.J_min + (self.J_max-self.J_min)*sig self.D = self.D_min + (self.D_max-self.D_min)*sig return self.J, self.D