1. 单相光伏储能系统架构设计
1.1 系统整体拓扑与能量流
先交代一下背景。这套模型面向的是典型家用或小型工商业场景:屋顶光伏给本地负荷供电,多余的电存到蓄电池里,蓄电池再不够的话才从电网取;反过来,光伏发得多、蓄电池又满了,那就把电卖给电网或者做馈网。在MATLAB Simulink里把它搭出来,不只是为了看波形,更重要的是验证能量管理逻辑在不同工况下的表现——比如光照突变、负荷投切、蓄电池SOC边界这些情况。
我在做这个模型的时候,推荐把系统按“源-储-荷-网”四象限来拆:
- 源:光伏阵列(PV Array),直流源,受光照和温度影响;
- 储:蓄电池组(Battery),通过双向DC/DC变换器挂到直流母线;
- 荷:本地交流负荷,可能是线性负载也可能带一点非线性;
- 网:单相电网,负责电压支撑和功率平衡兜底。
整机拓扑上,我建议用两级结构:前级是光伏Boost变换器,负责MPPT和升压;蓄电池侧用双向Buck-Boost,实现充放电管理;两级共享一条直流母线,母线电压由逆变器前级或者蓄电池侧控制稳定;后级是单相全桥逆变器,负责把直流母线电压转换成与电网同步的交流电,并控制并网功率。
为什么用“两级”而不是“单级”?因为单级结构通常是把光伏阵列直接接逆变器,MPPT和并网控制耦合在一起,母线电压波动大、控制逻辑复杂。两级结构把“MPPT-直流母线稳压”和“并网逆变-电流控制”两个环节解耦,每一级都能单独调试,仿真和实物调试都省心很多。这也是目前中小功率储能变流器的主流拓扑。
1.2 关键部件选型逻辑
Simulink里有现成的Simscape Electrical专业库,但很多初学者习惯全部用通用模块堆,结果仿真速度被拖得很慢。我的建议是用“理想化”和“详细模型”混合建模:
| 部件 | 推荐建模方式 | 说明 |
|---|---|---|
| 光伏阵列 | Simscape内置PV模块 | 自带光照、温度输入,输出I-V/P-V曲线准确 |
| 蓄电池 | Simscape Battery模块 | 内置等效电路参数模板(如锂离子、铅酸) |
| DC/DC变换器 | 理想开关+寄生参数 | 保留导通损耗与开关频率影响,但不建热模型 |
| 逆变桥 | 通用桥臂模块 + PWM | 重点在控制策略,不纠结每个IGBT的细节 |
| 电网 | 电压源 + 线路阻抗 | 用受控电压源模拟电网,加一点阻抗模拟线路压降 |
这里有个很容易被忽视的点:光伏阵列模块在Simulink里默认是“单二极管模型”,参数包括短路电流、开路电压、最大功率点电压/电流。别直接拿铭牌参数填,因为铭牌是在标准测试条件(STC:1000W/m²,25°C)下测的,而仿真时务必设置好当前工况的光照和温度,否则MPPT追踪出来的功率曲线可能对不上理论值。
蓄电池建模我吃过亏:一开始用理想电压源+内阻,仿真很快,但SOC一算就飘,尤其是恒功率放电时端电压根本不变,整个能量管理策略完全没法验证。后来换成Thevenin等效电路模型,动态特性才真实起来。Thevenin模型通常包含开路电压与SOC的查表关系(OCV-SOC曲线),再加一阶或二阶RC网络模拟极化效应。
1.3 控制策略总览
整套系统的控制框架,我习惯画成三层逻辑:
第一层:模式切换层。根据光伏输出功率、负荷功率、蓄电池SOC、电网状态,决定当前系统运行在什么模式。典型模式有这么几种:光伏直接供电(白天晴天)、光伏+蓄电池联合供电(晚间或阴天)、蓄电池单独供电(离网模式)、光伏向电网馈电(多余电量上网)、蓄电池充电模式。
第二层:单元控制层。每个变换器有自己的控制器:光伏Boost做MPPT和输出电压调整;蓄电池双向变换器做恒流/恒功率/恒压充电控制,或者放电稳压;逆变器做并网电流控制和直流母线电压控制。
第三层:底层执行层。就是PWM驱动、保护逻辑、锁相环这些具体实现。
这里我特别想强调一点:很多人把MPPT、电流环、电压环一股脑全写在一个PID里,调一个参数其他环节的波形全乱。我实际仿真下来,最稳的做法是“母线电压外环+并网电流内环”的标准串级控制,电流环带宽设计为开关频率的1/10左右,电压外环带宽再低一个数量级,这样级联起来稳定性才有保证。
2. 光伏阵列建模与MPPT实现
2.1 光伏电池数学模型
光伏电池的工程数学模型,其实就是单二极管等效电路:
I = IL - IO * [exp((V + IRs)/(nVt)) - 1] - (V + I*Rs)/Rsh
- IL:光生电流,近似与光照强度成正比;
- IO:反向饱和电流,温度敏感;
- Rs:串联电阻,影响最大功率点附近曲线形状;
- Rsh:并联电阻,影响短路电流附近曲线斜率;
- Vt:热电压,约等于 k*T/q。
很多教材直接把公式丢给你,但不告诉你关键点:这个方程是非线性超越方程,没法显式解出V关于I的表达式,仿真里需要迭代求解。Simulink里如果你自己搭这个方程,务必用代数约束模块或者求解器迭代来实现,别用简单的Fcn模块直接写表达式,那样初值不对很容易报错“Initialization failure”或者“Singularity”。
我经常用的替代方案是直接查I-V表:先用外部的经验公式计算不同光照、温度条件下的I-V曲线,生成一张二维插值表,然后在Simulink里用Lookup Table模块查表。这样既省了迭代求解的麻烦,还能保证曲线平滑、仿真稳定。做能量管理策略验证时,这种查表法完全够用。
2.2 MPPT算法比较与选型
光伏阵列在任意光照、温度条件下,都会存在一个唯一的最大功率点(MPP)。MPPT的作用就是让系统实时工作在这一点上。常用算法也就那么几类:
- 扰动观察法(P&O):经典方案。每步给参考电压加一个小扰动,然后看功率变化,功率增大了就继续同方向扰动,减小就反方向。优点是实现简单,缺点是稳态会有振荡,光照突变时可能误判,往错误方向走一拍,影响动态性能。
- 增量电导法(INC):基于dP/dV的符号判断工作点位置。相比P&O,它判断更准确,在光照快速变化时误判概率低一些,但需要做微分运算,对采样噪声敏感。
- 电导增量+变步长:在远离最大功率点时大步长追踪,接近时缩小步长。动态响应和稳态精度兼顾,是工程项目里用得比较多的方案。
我自己的经验是:做仿真验证的话,增量电导法首选。不是说P&O不能用,而是因为在仿真里光照是阶跃变化的,P&O在光照阶跃那一拍几乎一定会出现短暂反向扰动,在波形图上看特别难看,外行一眼就觉得你算法有问题。增量电导法在阶跃工况下干净很多。
一个小技巧:MPPT输出的是电压参考值,不是直接占空比。这点很多人搞错。正确的做法是MPPT输出参考电压Vref,然后电压外环去跟踪Vref,电压外环的输出再和三角载波比较生成PWM。直接把MPPT输出接到占空比上,动态会非常差,抗扰动能力也不行。
2.3 Simulink中的实现方式
我在Simulink里搭MPPT的推荐结构是这样的:
光伏模块 → 电压/电流测量 → 增量电导法MPPT → 电压环PI → PWM生成 → Boost开关关键参数我列出经验值:
- 采样时间:MPPT控制周期取0.01~0.1秒。千万别取太小,否则I-V曲线上的噪声会被放大,导致MPPT在最大功率点附近来回震荡;取太大又跟不上光照变化。
- 扰动电压步长:0.5V~2V(按单个组件参数调整),太大则稳态效率损失大,太小则追踪速度慢。
- 电压环PI参数:比例增益先试0.1~1,积分时间常数0.01~0.05,具体要在阶跃响应里调。
注意:做MPPT仿真时,先把光伏模块的“外部光照和温度输入”选项打开(Enable external inputs),这样才能在仿真中用Signal Builder或者Step模块模拟云遮、光照突变等工况。如果不打开,光照就固定死,MPPT的动态验证等于白做。
3. 蓄电池储能系统建模
3.1 蓄电池等效电路模型
蓄电池建模的选择直接影响仿真的可信度。很多人图省事直接拖Simulink库里那个Simscape Battery模块的默认参数,结果SOC变化曲线完全不是那么回事。我建议按自己的蓄电池规格修改参数,至少要把以下参数弄清楚:
- 额定容量Ah和标称电压V;
- SOC初始值;
- OCV-SOC曲线(每个厂家差异很大);
- 内阻(充电、放电分开给更好);
- 容量衰减模型(长期仿真用得着,短期不需要)。
Simscape里的锂离子电池默认模板,内阻和极化参数是按某款商用电池拟合的,不一定适合你的系统。如果你手头没有实测数据,最稳妥的做法是先用厂家规格书里的典型充放电曲线来校准模型。比如规格书上说的是“0.2C恒流充电,截止电压4.2V”,那你就用0.2C的电流去仿真充电,看端电压是否在4.2V附近截止,对不上就微调极化电阻和容量参数。
3.2 SOC估算方法
SOC估算在仿真里最常用的就是安时积分法:
SOC(t) = SOC0 - (1/3600/Capacity) * ∫Ibattery dt
方向符号要注意:充电时为负(对SOC来说是减少),放电时为正。很多人在这个符号上栽了跟头,导致SOC越充电越低。我建议先定一个统一的电流正方向约定:以“放电方向为正”,这样SOC公式写成SOC = SOC0 - ∫I/(3600*C)dt,充电电流就是负值,SOC自然上升。
安时积分法的缺点是初始SOC必须准确,否则误差一直累计。在Simulink里,初始SOC可以靠积分器模块的Initial Condition设置,但我不建议在长时间仿真里一直靠积分,因为数值仿真中由于步长原因积分会有微小漂移,时间长了SOC可能会超过0%~100%的范围。解决方法是给SOC信号加一个限幅,或者用简单的查表法做校准:根据开路电压估算SOC,再用滞环切换来修正。
3.3 充放电控制策略
蓄电池侧双向Buck-Boost变换器的控制,是整套系统里最容易出问题的地方之一。先说清楚方向:蓄电池放电时,能量从蓄电池流向直流母线,此时双向变换器工作在Boost模式;蓄电池充电时,能量从直流母线流向蓄电池,变换器工作在Buck模式。
控制策略我建议分两档:
- 恒流/恒功率充放电:适合额定工况。给定一个电流参考,电流环用PI控制PWM占空比。充电限流值一般在0.2C~0.5C之间,超过容易损伤电池,仿真里虽然不会真伤电池,但会让端电压出现异常拉升,影响能量管理策略判断。
- 恒压充电(浮充):电池电压到达截止电压后切换。电压环慢一些,电流逐渐减小。这个切换条件的判定,建议加上滞环逻辑:比如到达4.2V进入恒压模式,回落到4.05V才切回恒流,避免在边界处来回震荡。
我最想提醒的是充放电切换死区。如果不加死区,当系统功率指令在零附近波动时,变换器会频繁在Buck和Boost模式之间切换,仿真里的表现就是占空比跳变、电流尖峰,严重的话仿真直接卡死。加一个小死区(比如功率指令在±100W以内时切换暂停,用状态机锁存当前模式),能很有效地抑制这个问题。
4. 单相逆变器与并网控制
4.1 PWM调制细节
单相全桥逆变器的PWM调制,常见方案是双极性SPWM和单极性SPWM。双极性调制实现简单,同一桥臂上下管互补导通,输出波形就是正负对称的SPWM;单极性调制输出半周内只有正或负电平,谐波含量更小,但控制逻辑稍微复杂一点。
从仿真角度看,我的建议是用单极性倍频调制:两个桥臂分别用正弦调制波+反相的调制波与同一个三角载波比较。这样等效开关频率翻倍,输出滤波器的尺寸可以减小,电流谐波也明显小。具体实现方法:
- 载波用三角波,频率取10kHz~20kHz;
- 调制波A = 电流环输出 * sin(θ_pll),调制波B = -调制波A;
- 桥臂1比较调制波A和载波,桥臂2比较调制波B和载波。
还有一个细节:仿真里给PWM死区时间(Dead Time)不是必须的,因为理想开关没有直通问题。但如果你后面要接硬件在环(HIL)或者嵌入式代码生成,死区参数一定要先加上,否则实际运行绝对烧管子。建议仿真阶段就养成设置死区(1~2微秒)的习惯,提前暴露问题。
4.2 电流内环与电压外环设计
并网逆变器在并网模式下,本质上是“电流源”,控制目标是让并网电流跟踪指令。指令分两部分:有功电流对应储能/光伏的净功率输出,无功电流对应功率因数补偿(家储场景一般设0,即单位功率因数)。
电流内环用PI控制器就够,关键是坐标变换和控制量解耦。单相系统没有d/q轴的自然解耦,但可以用虚拟正交信号构造静止坐标系下的正交分量。常用方案:
- 虚拟相移法:把电网电压延迟1/4周期,构造一个正交的虚拟相电压;
- 二阶广义积分器(SOGI):用两个积分器构造正交信号,还能顺便做滤波。
有了正交分量,就可以做αβ→dq变换,得到d轴电流(有功)和q轴电流(无功),两个轴分别用PI控制。PI的Kp和Ki参数整定,先按典型二阶系统设计:
Kp = L * ω_cl,Ki = R * ω_cl
其中L和R是逆变器输出侧滤波电感与等效电阻,ω_cl是电流环闭环带宽,取开关角频率的1/10~1/5。实际调参时,我会先只给比例项,让系统稳定输出正弦电流后,再慢慢加积分项消除稳态误差。
4.3 锁相环实现
单相锁相环(PLL)常用的有基于SOGI的正交信号锁相和基于Park变换的锁相。我推荐带前馈的SOGI-PLL,结构如下:
电网电压 → SOGI(获得vα, vβ) → Park变换 → PI调节ω → 积分得θSOGI在50Hz附近具有带通滤波特性,能抑制电网电压谐波和失真对相角的影响。实际调试经验:SOGI的阻尼系数取0.707时,响应速度和滤波效果平衡最好;PLL的PI参数带宽取200Hz左右,锁定时间大约10~20ms,够用。
有一个坑:仿真刚开始时,PLL还没来得及锁定,如果这时逆变器就开始调制,第一个周期的电流会有一个很大的瞬态冲击。解决办法是设计一个启动逻辑:PLL锁定标志(频率误差小于0.1Hz且维持一段时间)置位后,再允许PWM使能。这个逻辑虽然简单,但能让仿真的初始波形干净漂亮,汇报演示的时候很加印象分。
5. 仿真集成与调试
5.1 参数配置清单
整套模型的调试,我强烈建议准备一个参数脚本文件(.m)来统一管理参数,而不是在Simulink每个模块里零零散散地填数字。改了参数还要一处一处排查的话,会浪费大量时间。我给出一个参考配置清单:
| 参数 | 典型值 | 说明 |
|---|---|---|
| 光伏额定功率 | 5 kW | 单相并网系统常见档位 |
| 直流母线电压 | 400 V | 单相220V逆变的直流侧电压 |
| 蓄电池电压 | 96 V | 32节3.2V磷酸铁锂串联 |
| 蓄电池容量 | 100 Ah | 约9.6 kWh |
| Boost开关频率 | 20 kHz | IGBT/MOSFET都可 |
| 逆变开关频率 | 16 kHz | 兼顾效率和音频噪声 |
| 滤波电感 | 3 mH | 根据纹波电流设计 |
| 滤波电容 | 10 μF | 抑制高频谐波 |
| 电网额定电压 | 220 V RMS | 单相 |
| 电网频率 | 50 Hz | 国内标准 |
这些参数不是随便给的。直流母线电压400V,是单相220V并网的一个常见折中:逆变器需要峰值电压高于电网峰值电压(约311V),留一点裕量,再加上Boost和蓄电池侧的电压匹配,400V是安全的选择。蓄电池电压96V,则要考虑双向变换器升压比不能太大,在50%~100%占空比范围内可控。
5.2 常见警告与误差排查
Simulink仿真光伏储能系统,最常见的警告就是“Singularity detected”和“At time X.X, simulation continues but equations are not converging”。遇到这种我一般按下面顺序排查:
- 代数环(Algebraic Loop):检查哪些模块的输出又通过自己所在路径绕回了输入。比如电压源逆变器接过高的内阻抗,或者控制回路里测量模块与受控源直接形成了没有延迟的反馈环。解决办法是给测量通道串一个小惯性环节(1/(T*s+1)加在反馈通道),打破代数环。别一上来就加一大堆零延迟状态空间模块,会让仿真变慢。
- 求解器选择不当:Simulink默认的ode45是变步长求解器,碰到功率电子这种强非线性系统,起步慢且容易在开关瞬间卡住。我建议用ode23tb或者ode15s这类刚性求解器,把最大步长限制在一个开关周期的1/20以内。开关管切换瞬间电压电流变化剧烈,求解器要处理的事件太多。
- 初始条件不对:如果仿真出一开始就有巨大的尖峰或者直接发散,十有八九是初始条件不匹配——比如积分器初值没设置、电容初始电压为0但控制环刚开始就按稳态输出。把所有积分器的初值都设置成对应变量的稳态工作点,是解决起始震荡最有效的手段。
- 开关管阻抗过小:Simscape里开关器件的Ron建议设成一个很小的值但不要为0。为0会导致求解器遇到不连续打开时刻时难以收敛;设为1e-3~1e-4Ω就稳很多。
5.3 收敛性问题专项排查
有些模型本身没问题,但仿真跑到某一步突然报“Zero-crossing detected”然后又跳过去,波形上就多出一个异常尖峰。这种问题往往出在PWM比较器上:三角载波和调制波的比较点在数值求解里是过零事件,Simulink要用事件驱动算法精确捕捉,捕捉不到就可能产生锯齿状异常。
我的处理办法是:
- 在PWM比较模块的输出端接一个S-R触发器或者采样保持,强制占空比信号在开关周期内保持恒定;
- 把载波频率和采样频率对齐,尽量让求解器步长能整除开关周期;
- 重要信号加solver adaptive零交叉检测设置。
还有一个经验:如果不做器件级热仿真的话,Simscape里的开关管用“平均模型”或“简化开关”模式就好,别用全物理模型。全物理模型带寄生电容和反向恢复特性,会让仿真时间暴涨十倍,而控制策略验证根本不需要那么细的开关动态。
6. 优化方向与进阶应用
6.1 能量管理策略优化
模型搭好后,能量管理策略的优化才是真正拉开差距的地方。最基本的策略是按SOC分区管理:SOC大于90%时优先馈网,SOC在20%~90%之间时优先满足本地负荷,SOC低于20%时停止放电并限制充电。但这个规则在光照频繁波动的场景下不够灵活。
我实际跑过几种增强策略,分享下效果:
- 预测性控制:用未来24小时的光伏出力预测曲线,提前决定蓄电池充电/放电的功率曲线。仿真里可以用Signal Builder存储几组典型天气数据来模拟,效果比纯实时策略好不少,尤其在“中午充电、晚上放电”这个典型循环场景下。
- 负荷平移:把洗衣机、空调这种可移负荷的运行时间设定到光伏出力高峰期,减少向电网取电。仿真里就是把负荷曲线换一个时间窗,对比峰值和电费。
- 功率平滑:对并网功率做低通滤波,蓄电池负责吸收高频分量。在仿真里给并网功率参考值加上一个滤波环节,蓄电池功率指令就变成“光伏出力-平滑后的并网功率”,能明显看到蓄电池的功率曲线从高频跳变变成缓慢平滑。
从实现角度看,这些策略在Simulink里都是用Stateflow状态机加逻辑比较就能搭出来的。Stateflow画状态图非常直观,模式切换条件一目了然,还能自动生成C代码,是做能量管理策略验证的首选工具。
6.2 动态响应与硬件在环扩展
仿真模型调好后,下一步往往就是硬件在环(HIL)测试。这个时候你要考虑模型能否转换成实时可运行的代码。我之前做过一次实时仿真移植,踩了几个坑:
- Simscape Electrical的连续求解器模块在实时环境里性能很差,最好把功率电路改成离散化模型,步长控制在50微秒左右;
- 控制部分的采样时间要和实际DSP的中断周期一致,通常是10kHz;
- 不用的示波器模块全部删掉,因为实时仿真里的虚拟示波器会比Matlab环境快得多,数据记录要用Data Inspector。
如果你只是在学校做课题,不涉及硬件,那模型的扩展方向可以做:多机并联仿真(两台逆变器并联时要加虚拟阻抗和下垂控制)、孤岛检测仿真(并网转离网切换的暂态过程)、并网谐波分析(用FFT分析PWM产生的谐波频谱)。这些扩展都建立在基础模型正确的前提下,基础模型的每个环节都要经得起推敲,后面扩展才不会返工。
7. 实操中的额外提醒
最后再多嘴几句,都是这几年反复踩过的坑。
第一,控制策略的验证顺序。我强烈建议“先开环后闭环、先仿真后调参”。先拿一组固定占空比跑通功率电路,确认母线电压能建立、电池能充放电、逆变器能输出正弦波;再接上PLL和闭环控制。很多人一上来就全闭环,出错了根本分不清是功率电路有问题还是控制策略有问题,排查成本极高。
第二,注意参考方向一致性。在Simulink里,通过同一个测量点的功率方向符号,在不同模块接口处可能不同。比如蓄电池模块的电流正方向在Simscape里可能定义为放电方向,而在你的控制逻辑里定义的又是充电方向,备课时我就见过很多人在这上面把SOC看反了。
第三,善用仿真数据导出。仿真结束别只看示波器上的波形,把关键变量用To Workspace模块导出到Matlab工作区,然后写一个脚本做后处理分析:计算效率、统计SOC变化轨迹、分析并网电流THD(总谐波畸变率)。这些数据才是论文、报告里最有力的结果。
我自己的习惯是每次调参都顺手保存一份仿真快照,记录参数变更前后的波形和数据对比。做得多了,就能总结出哪类参数在什么范围内系统最稳,这种经验是书本上绝对学不到的。希望这篇整理能让你在Matlab Simulink单相光伏储能模型上少走一些弯路,尤其是把能量流逻辑、控制层级和调试顺序理清楚之后,很多之前看起来玄学的问题其实都有章可循。