Bootstrap

【单相单级并网逆变器】模拟了一个具有最大功率点追踪(MPPT)功能的单相单级脉宽调制(PWM)光伏逆变器,并且支持并网运行(Simulink仿真实现)

   💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

 ⛳️赠与读者

💥1 概述

1. 硬件设计

1.1 主电路

1.2 控制电路

2. 软件控制策略

2.1 MPPT算法

2.2 PWM生成

2.3 电流控制环

2.4 电网同步

3. 仿真验证

3.1 仿真工具

3.2 仿真步骤

4. 调试与优化

📚2 运行结果

2.1 仿真结果

2.2 Matlab代码可视化

🎉3 参考文献

🌈4 Simulink仿真实现


 ⛳️赠与读者

👨‍💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。当哲学课上老师问你什么是科学,什么是电的时候,不要觉得这些问题搞笑。哲学是科学之母,哲学就是追究终极问题,寻找那些不言自明只有小孩子会问的但是你却回答不出来的问题。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能让人胸中升起一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它居然给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。

     或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎

💥1 概述

【单相单级并网逆变器】模拟了一个具有最大功率点追踪(MPPT)功能的单相单级脉宽调制(PWM)光伏逆变器,并且支持并网运行。

为了简化硬件实现,开关应具有固定频率,并且使用数字信号处理器(DSP)脉宽调制(PWM)模块要求控制器以0:1的占空比生成其动作。在附加的仿真中,使用快速傅里叶变换(FFT)检测器检测电网角度。光伏(PV)通过电容器与逆变器连接,电容器的参考电压由增量导纳最大功率点追踪(MPPT)技术定义。光伏耦合电容器的电压通过控制注入电网的交流电流的幅度,来跟踪其参考值,从而改变提取的功率。交流参考电流的角度是根据电网角度和所需功率角(在我们的模型中设置为单位功率因数)获得的。然后使用电流控制环路来确保参考交流电流的相位和幅度的可接受跟踪。交流电流相位偏移跟踪还通过使用专用的比例-积分(PI)控制器来辅助生成相位补偿角。

为了设计和实现一个具有最大功率点追踪(MPPT)功能的单相单级并网逆变器,我们需要考虑几个关键组件和步骤。以下是一个详细的实现方案,包括硬件设计、软件控制策略以及仿真验证。

1. 硬件设计

1.1 主电路
  • 光伏阵列(PV):作为直流电源输入。
  • 直流母线电容:连接光伏阵列和逆变器,用于平滑直流电压。
  • 逆变器桥:通常由四个IGBT(绝缘栅双极型晶体管)或MOSFET组成的全桥电路,用于将直流电转换为交流电。
  • 滤波器:LC滤波器,用于平滑逆变器输出的交流电,减少谐波。
  • 并网变压器(可选):根据电网要求,可能需要变压器进行电压匹配和隔离。
1.2 控制电路
  • 数字信号处理器(DSP):作为核心控制器,负责PWM信号生成、MPPT算法执行、电流控制等。
  • ADC(模拟数字转换器):用于采集光伏电压、电流,以及电网电压、电流等信号。
  • 通信接口(如CAN、Ethernet):用于远程监控和调试。

2. 软件控制策略

2.1 MPPT算法
  • 增量导纳法:通过监测光伏阵列的电压和电流变化,调整工作点以接近最大功率点。具体实现时,可以设定一个小的电压变化量,观察电流的变化方向,从而决定下一步的电压调整方向。
2.2 PWM生成
  • 使用DSP的PWM模块生成固定频率的PWM信号,占空比根据MPPT算法和电流控制环的输出动态调整。
2.3 电流控制环
  • PI控制器:用于控制逆变器输出的交流电流,使其跟踪参考电流。参考电流的幅度由MPPT算法决定,相位由电网角度和所需功率角(单位功率因数)决定。
  • 相位补偿:通过PI控制器调整相位补偿角,确保逆变器输出电流与电网电压同步。
2.4 电网同步
  • 使用FFT检测器或PLL(锁相环)技术检测电网角度,确保逆变器输出与电网同步。

3. 仿真验证

3.1 仿真工具
  • 使用MATLAB/Simulink或PSIM等仿真软件进行系统建模和仿真。
3.2 仿真步骤
  1. 建立光伏阵列模型:根据光伏电池的特性曲线建立模型。
  2. 建立逆变器模型:包括PWM生成、桥式电路、滤波器等。
  3. 实现MPPT算法:在仿真中集成增量导纳MPPT算法。
  4. 设置电流控制环:配置PI控制器,实现电流跟踪。
  5. 电网同步:使用FFT或PLL模块检测电网角度。
  6. 仿真运行:观察逆变器输出电流、电压波形,验证MPPT效果和并网性能。

4. 调试与优化

  • 根据仿真结果调整MPPT算法参数、PI控制器参数等。
  • 在实际硬件上进行测试,验证仿真结果的准确性,并进行必要的调整。

通过以上步骤,可以设计和实现一个具有MPPT功能的单相单级并网逆变器,并确保其稳定、高效地运行。

📚2 运行结果

2.1 仿真结果

2.2 Matlab代码可视化

 

部分代码:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Duties and Grid Angle
% [04] duty_ab_GA.....................duty_aa, duty_bb, grid_angle
time_04=duty_ab_GA.time;
duty_aa=duty_ab_GA.signals.values(:,1);
duty_bb=duty_ab_GA.signals.values(:,2);
grid_angle=duty_ab_GA.signals.values(:,3);
yy=yy+1;
figure('Color',[1 1 1]);
grid
subplot(3,1,1),plot(time_04,duty_aa, 'r-','LineWidth',2);
set(gca,'FontWeight','demi','FontSize',14);
set(gca,'XGrid','on')
set(gca,'YGrid','on')
ylabel('Duty','FontWeight','demi','FontSize',14);
xlabel('time (sec.)','FontWeight','demi','FontSize',14);
legend('Duty of SW Ap','Location','NorthEast')

subplot(3,1,2),plot(time_04,duty_bb, 'r-','LineWidth',2);
set(gca,'FontWeight','demi','FontSize',14);
set(gca,'XGrid','on')
set(gca,'YGrid','on')
ylabel('Duty','FontWeight','demi','FontSize',14);
xlabel('time (sec.)','FontWeight','demi','FontSize',14);
legend('Duty of SW Bp','Location','NorthEast')

subplot(3,1,3),plot(time_04,grid_angle, 'r-','LineWidth',2);
set(gca,'FontWeight','demi','FontSize',14);
set(gca,'XGrid','on')
set(gca,'YGrid','on')
ylabel('Grid Angle Rad','FontWeight','demi','FontSize',14);
xlabel('time (sec.)','FontWeight','demi','FontSize',14);
legend('Grid Angle','Location','NorthEast')


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Inverter Referecne Current, Phase Shift, Phase Compensation
% [05] Iref_phcomp_phshift.........i_ref, phase_comp, phase_shift
time_05=Iref_phcomp_phshift.time;
i_ref=Iref_phcomp_phshift.signals.values(:,1);
ph_comp=(180/pi)*Iref_phcomp_phshift.signals.values(:,2);
ph_shift=(180/pi)*Iref_phcomp_phshift.signals.values(:,3);
yy=yy+1;
figure('Color',[1 1 1]);
grid
subplot(3,1,1),plot(time_05,i_ref, 'r-','LineWidth',2);
set(gca,'FontWeight','demi','FontSize',14);
set(gca,'XGrid','on')
set(gca,'YGrid','on')
ylabel('Current (A)','FontWeight','demi','FontSize',14);
xlabel('time (sec.)','FontWeight','demi','FontSize',14);
legend('Inverter Reference Current','Location','NorthEast')

subplot(3,1,2),plot(time_05,ph_shift, 'r-','LineWidth',2);
set(gca,'FontWeight','demi','FontSize',14);
set(gca,'XGrid','on')
set(gca,'YGrid','on')
ylabel('Phase Angle (deg)','FontWeight','demi','FontSize',14);
xlabel('time (sec.)','FontWeight','demi','FontSize',14);
legend('Phase Shift Ir and Iact','Location','NorthEast')

subplot(3,1,3),plot(time_05,ph_comp, 'r-','LineWidth',2);
set(gca,'FontWeight','demi','FontSize',14);
set(gca,'XGrid','on')
set(gca,'YGrid','on')
ylabel('Phase Angle (deg)','FontWeight','demi','FontSize',14);
xlabel('time (sec.)','FontWeight','demi','FontSize',14);
legend('Phase Compensation','Location','NorthEast')

myfilename=strcat('File',num2str(yy))
myfilename=strcat(myfilename,'.pdf');
set(gcf,'PaperPositionMode','auto');
set(gcf,'InvertHardcopy','off','Renderer','zbuffer');
saveas(gcf,myfilename);


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Reference Inverter Current, Modified Inverter Reference Current, Actual
% Measured Current
% [06] I_ref_mod_act...............i_ref, i_ref_mod, i_meas
time_06=I_ref_mod_act.time;
i_ref=I_ref_mod_act.signals.values(:,1);
i_ref_mod=I_ref_mod_act.signals.values(:,2);
i_inv_ac=I_ref_mod_act.signals.values(:,3);
yy=yy+1;
figure('Color',[1 1 1]);
grid
plot(time_06,i_ref,'r-',time_06,i_ref_mod,'b-.',time_06,i_inv_ac,'k--','LineWidth',2);
set(gca,'XGrid','on')
set(gca,'YGrid','on')
ylabel('Current (A)','FontWeight','demi','FontSize',14);
xlabel('time (sec.)','FontWeight','demi','FontSize',14);
legend('Inv. Ref. Cur.','Lead Inv. Ref. Cur.','Actual Inv. Cur.','NorthEast')

myfilename=strcat('File',num2str(yy))
myfilename=strcat(myfilename,'.pdf');
set(gcf,'PaperPositionMode','auto');
set(gcf,'InvertHardcopy','off','Renderer','zbuffer');
saveas(gcf,myfilename);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DC Link Voltage and Current and AC inverter Current
% [07] dclinkv_dclinki_imeas.......dclink_v, dclink_i, i_meas
time_07=dclinkv_dclinki_imeas.time;
dc_link_v=dclinkv_dclinki_imeas.signals.values(:,1);
dc_link_i=dclinkv_dclinki_imeas.signals.values(:,2);
i_inv_ac=dclinkv_dclinki_imeas.signals.values(:,3);
yy=yy+1;
figure('Color',[1 1 1]);
grid
subplot(3,1,1),plot(time_07,dc_link_v, 'r-','LineWidth',2);
set(gca,'FontWeight','demi','FontSize',14);
set(gca,'XGrid','on')
set(gca,'YGrid','on')
ylabel('Voltage (V)','FontWeight','demi','FontSize',14);
xlabel('time (sec.)','FontWeight','demi','FontSize',14);
legend('Inverter DC I/P Voltage','Location','NorthEast')

subplot(3,1,2),plot(time_07,dc_link_i, 'r-','LineWidth',2);
set(gca,'FontWeight','demi','FontSize',14);
set(gca,'XGrid','on')
set(gca,'YGrid','on')
ylabel('Current (A)','FontWeight','demi','FontSize',14);
xlabel('time (sec.)','FontWeight','demi','FontSize',14);
legend('Inverter DC I/P Current','Location','NorthEast')

subplot(3,1,3),plot(time_07,i_inv_ac, 'r-','LineWidth',2);
set(gca,'FontWeight','demi','FontSize',14);
set(gca,'XGrid','on')
set(gca,'YGrid','on')
ylabel('Current (A)','FontWeight','demi','FontSize',14);
xlabel('time (sec.)','FontWeight','demi','FontSize',14);
legend('Inverter AC O/P current','Location','NorthEast')

myfilename=strcat('File',num2str(yy))
myfilename=strcat(myfilename,'.pdf');
set(gcf,'PaperPositionMode','auto');
set(gcf,'InvertHardcopy','off','Renderer','zbuffer');
saveas(gcf,myfilename);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
% Inverter Reference Current, Lead Inverter Reference Current, 
% [08] iref_irefmod................i_ref,i_ref_mod
time_08=iref_irefmod.time;
i_ref=iref_irefmod.signals.values(:,1);
i_ref_mod=iref_irefmod.signals.values(:,2);
yy=yy+1;
figure('Color',[1 1 1]);
grid
plot(time_08,i_ref,'r-',time_08,i_ref_mod,'b-.','LineWidth',2);
set(gca,'XGrid','on')
set(gca,'YGrid','on')
ylabel('Current (A)','FontWeight','demi','FontSize',14);
xlabel('time (sec.)','FontWeight','demi','FontSize',14);
legend('Inv. Ref. Cur.','Lead Inv. Ref. Cur.','NorthEast')


myfilename=strcat('File',num2str(yy))
myfilename=strcat(myfilename,'.pdf');
set(gcf,'PaperPositionMode','auto');
set(gcf,'InvertHardcopy','off','Renderer','zbuffer');
saveas(gcf,myfilename);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
% PV Terminal Voltages, Inverter DC I/P Voltage, PV mean Power, Grid
% Injected MEan Power
% [09] VPV_VDC_PPV_PG...............V_PV,dclink_v,P_PV,P_grid
time_09=VPV_VDC_PPV_PG.time;
PV_V=VPV_VDC_PPV_PG.signals(1).values(:,1);
dc_link_v=VPV_VDC_PPV_PG.signals(1).values(:,2);
PV_P=VPV_VDC_PPV_PG.signals(2).values(:,1);
Grid_P=VPV_VDC_PPV_PG.signals(2).values(:,2);
yy=yy+1;
figure('Color',[1 1 1]);
grid
subplot(2,1,1),plot(time_09,PV_V, 'r-',time_09,dc_link_v,'b-.','LineWidth',2);
set(gca,'FontWeight','demi','FontSize',14);
set(gca,'XGrid','on')
set(gca,'YGrid','on')
ylabel('Voltage (V)','FontWeight','demi','FontSize',14);
xlabel('time (sec.)','FontWeight','demi','FontSize',14);
legend('PV Terminal Voltage', 'Inverter DC I/P Voltage','Location','NorthEast')

subplot(2,1,2),plot(time_09,PV_P, 'r-',time_09,Grid_P,'b-.','LineWidth',2);
set(gca,'FontWeight','demi','FontSize',14);
set(gca,'XGrid','on')
set(gca,'YGrid','on')
ylabel('Mean Power (KW)','FontWeight','demi','FontSize',14);
xlabel('time (sec.)','FontWeight','demi','FontSize',14);
legend('Mean PV Power','Mean Grid Injected Power','Location','NorthEast')

myfilename=strcat('File',num2str(yy))
myfilename=strcat(myfilename,'.pdf');
set(gcf,'PaperPositionMode','auto');
set(gcf,'InvertHardcopy','off','Renderer','zbuffer');
saveas(gcf,myfilename);


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Irradiation, Capacitor Ref. Voltage, Capacitor Actual voltage (filtered)
% PV mean Power, Grid Mean Power
% [10] ir_capvref_capvf_PPV_Pg.....ir,cap_ref_v, cap_v_filt, P_PV,P_grid
time_10=ir_capvref_capvf_PPV_Pg.time;
ir=ir_capvref_capvf_PPV_Pg.signals(1).values(:,1);
capv_ref=ir_capvref_capvf_PPV_Pg.signals(2).values(:,1);
capv_act=ir_capvref_capvf_PPV_Pg.signals(2).values(:,2);
P_PV=ir_capvref_capvf_PPV_Pg.signals(3).values(:,1);
P_grid=ir_capvref_capvf_PPV_Pg.signals(3).values(:,2);
yy=yy+1;
figure('Color',[1 1 1]);
 

🎉3 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

[1]吴理博.单级式光伏并网逆变系统中的最大功率点跟踪算法稳定性研究[J].中国电机工程学报, 26(6)[2024-08-18].DOI:10.3321/j.issn:0258-8013.2006.06.013.

[2]于晶荣,曹一家,何敏,等.单相单级光伏逆变器最大功率点跟踪方法[J].仪器仪表学报, 2013, 34(1):18-25.

[3]古俊银,陈国呈.单级式光伏并网逆变器的无电流检测MPPT方法[J].中国电机工程学报, 2012, 32(27):5.DOI:CNKI:SUN:ZGDC.0.2012-27-021.

🌈4 Simulink仿真实现

资料获取,更多粉丝福利,MATLAB|Simulink|Python资源获取

                                                           在这里插入图片描述

;