简介:一份围绕PSIM平台开展光伏阵列建模与仿真的研究文档,面向从事光伏发电系统设计、电力电子仿真及光伏电池建模的工程师、研究人员和相关专业学生,重点解决光伏阵列外特性建模、仿真模型搭建以及最大功率点跟踪(MPPT)验证问题。压缩包内含1个doc文档,大小约415KB,已有513人学习下载。文档系统阐述了光伏电池的光电效应与等效电路原理,详细推导了综合考虑短路电流、开路电压、电压电流温度系数、环境温度、太阳辐射强度及串并联结构的光伏阵列数学模型,并给出了在PSIM环境中快速建立仿真模型和带MPPT功能的DC-DC变换器模型的具体方法。文中还对比了不同光照与温度条件下的输出曲线仿真结果和实验数据,两者吻合良好,验证了模型的有效性与准确性。读者可借此掌握光伏阵列建模思路、MPPT控制策略实现及PSIM仿真流程,为光伏发电系统优化设计提供参考。
1. 光伏阵列仿真模型卡在哪儿:PSIM 里与实测最大的三个差距
做光伏逆变器或者储能 PCS 的前级仿真,很多人一开始都会在 PSIM 里拉一个光伏阵列元件,填上开路电压、短路电流、最大功率点电压电流,然后就开始调 Boost 或 MPPT。曲线看起来很像一回事,但等到接上实际组件数据去比对,往往会发现最大功率点偏了 3% 到 5%,温度一变化偏得更远。问题不在于 PSIM 本身,而在于光伏阵列仿真模型的建立方式:PSIM 擅长开关级电路仿真,它的光伏阵列模型本质上是把一组物理方程映射成电路节点,参数输错了、串并联关系没映射好、遮蔽工况没建模,仿真结果就只是“形状像”,而不是“数值对”。
这篇内容适合两类人:一类是刚接手光伏逆变器或微逆开发、需要在 PSIM 里搭前级直流源模型的工程师;另一类是做电池模拟器、双向储能变流器测试,需要把光伏阵列模型作为受控源接入半实物仿真链路的人。核心目标是让 PSIM 里的光伏阵列仿真模型在光照、温度、部分遮蔽下,输出的 I-V 和 P-V 曲线能逼近真实组件,并且能够量化误差。下面从最基础的元件选择讲起,逐步把模型建到阵列级。
2. 用 PSIM 内置光伏阵列元件建立基线模型
2.1 在 PSIM 里选择器件模型的两条路线
PSIM 建模光伏阵列,常见做法是先确认用哪种模型。第一条路线是用 PSIM 自带的 PV Array 元件,这个元件以物理模型方式存在,输入端口可以接光照和温度信号,内部根据单二极管或双二极管方程计算 I-V 特性。第二种路线是自己用受控源加二极管、电阻搭建等效子电路,自由度最高,适合研究热斑、失配和旁路二极管行为。
我一般会先走第一条路线做基线:把 PV Array 元件作为“标准光伏组件”的替身,跑通整个变换器拓扑和 MPPT 算法,确认控制逻辑没问题。之后再根据研究目标决定要不要升级成自建子电路模型。这里有个容易犯的错:有人直接拿厂商数据手册里的四个参数填进 PV Array 元件,以为就完成了建模,实际上 PSIM 元件内部还需要二极管理想因子 A、串联电阻 R_S、并联电阻 R_SH,这些才决定曲线的弯曲程度和最大功率点位置。
2.2 从数据手册反推 R_S 和 R_SH 的计算过程
单二极管模型的输出方程如下,I 为输出电流,V 为输出电压,V_T 为热电压,N_S 为串联电池数:
I = I_PH - I_O * (exp((V + I * R_S) / (A * V_T * N_S)) - 1) - (V + I * R_S) / R_SH
这个方程里,I_PH 约等于短路电流 I_SC,I_O 是反向饱和电流。工程上要做的是:先把 V_OC、I_SC、V_MP、I_MP 四个点代入方程,获得初始的 R_S 和 R_SH。R_S 的粗略估算用最大功率点数据,R_SH 的估算用 I-V 曲线在短路电流附近的斜率,但生产环境里数据手册不会给这条斜率,所以更实际的做法是用一个固定迭代步骤去逼近。
常见做法是把 R_S 的初始值设为 (V_OC - V_MP) / I_MP,R_SH 设为 V_MP / (I_SC - I_MP),然后放进方程里计算理论 V_MP 和 I_MP,再与数据手册值比较,逐步修正。这个过程可以手工试算,也可以写个简单脚本自动做。下面是一个可直接复用的 Python 脚本,用来做单二极管模型参数反推。
import math Voc = 45.9 # 开路电压,V Isc = 5.96 # 短路电流,A Vmp = 37.0 # 最大功率点电压,V Imp = 5.52 # 最大功率点电流,A Ns = 72 # 串联电池数 A = 1.15 # 二极管理想因子,先按硅基组件经验值设置 q = 1.602e-19 k = 1.381e-23 T = 298.15 Vt = k * T / q * Ns # 对应整个组件的热电压 # 初始 Rsh 和 Rs Rsh = Vmp / (Isc - Imp) # 由短路点附近斜率估算 Rs = (Voc - Vmp) / Imp # 由最大功率点估算 # 迭代修正 Rs,使理论 Vmp 与数据手册 Vmp 对齐 for _ in range(100): Io = (Isc - (Voc - Rs * Isc) / Rsh) / (math.exp(Voc / (A * Vt)) - 1) Iph = Isc * (Rsh + Rs) / Rsh # 在最大功率点处解 V = Vmp 对应的 I I_pred = Iph - Io * (math.exp((Vmp + Imp * Rs) / (A * Vt)) - 1) - (Vmp + Imp * Rs) / Rsh err = Imp - I_pred Rs += err * 0.02 # 小步长修正 if abs(err) < 1e-4: break # 用修正后的 Rs,反向估计 Rsh 是否需要调整 Isc_calc = Iph - Io * (math.exp(Isc * Rs / (A * Vt)) - 1) - Isc * Rs / Rsh Rsh = (Vmp - Imp * Rs) / (Isc - Imp - Io * (math.exp(Vmp / (A * Vt)) - 1) + (Vmp + Imp * Rs) / Rsh) print("Rs=%.4f" % Rs) print("Rsh=%.4f" % Rsh) print("Isc_calc=%.4f" % Isc_calc)这段脚本的核心思路是保持 V_MP 点对齐,用误差修正 R_S;再在短路电流点用方程反推 R_SH,避免两个电阻相互干扰。注意这里没有做完整的双参数牛顿迭代,对于工程预研已经足够把最大功率点误差压在 1% 以内。脚本算出的 R_S 和 R_SH 值直接作为 PSIM 元件参数输入即可。
2.3 把单组件参数映射到阵列的串并联组态
PSIM 的 PV Array 元件通常需要区分两个层级:单组件的物理参数和阵列的串并联结构。N_S 是每个组件内部的串联电池数,这个由组件型号决定;阵列层面的串联组件数和并联组串数是另一组参数,分别影响阵列总电压和总电流。
| 参数 | 单位 | 含义 | 设置建议 |
|---|---|---|---|
| N_Cell_Series | 个 | 单个组件内串联电池数 | 按组件标称值填,常见 60/72 |
| N_Module_Series | 个 | 阵列中每串的组件数 | 由直流母线电压范围决定 |
| N_Module_Parallel | 个 | 并联组串数 | 由逆变器输入电流上限决定 |
| V_MP_Module | V | 单组件最大功率点电压 | 数据手册 STC 值 |
| I_MP_Module | A | 单组件最大功率点电流 | 数据手册 STC 值 |
阵列空载电压大约等于 N_Module_Series 乘 N_Cell_Series 再乘单电池电压,但注意 PSIM 的 PV Array 元件内部已经按照 N_Cell_Series 把开路电压折算过,不要重复乘组件串联数去覆盖元件内部电压。这里最容易出错:有人既把单组件开路电压设成 45.9V,又把阵列串联数设为 20,期望得到 918V 直流母线,结果元件输出的开路电压还是 45.9V,因为元件把 V_OC 解释成了整个阵列的值。
正确的做法是决定“元件的输出接口代表什么”。如果研究重点是 DC-DC 环节,把元件配置成整个阵列的等效模型,那么 V_OC 填阵列总电压,N_Module_Series 填 1;如果想保留单组件粒度以便后续研究遮蔽,就把独立 PV 元件叠起来组成子电路,每个元件只代表一个组件。
2.4 用负载扫描验证基线模型的 I-V 曲线形状
模型参数填好之后,不要直接接 Boost 电路验证,先做一个最简单的负载扫描。用可变电阻或者可控电流源作为光伏阵列的负载,在仿真中让负载从短路逐步增加到开路,记录电压和电流,画出 I-V 曲线。PSIM 里可以使用参数扫描功能,把负载电阻值设为扫描变量,扫描范围从 0.1 欧姆扫到 100 欧姆,步长按对数分布取 20 个点。
扫描结束后,把曲线与数据手册的 STC 曲线比对,重点看三个位置:短路电流点斜率、最大功率点附近曲率、开路电压拐点。如果最大功率点偏差超过 2%,优先调整 R_S 而不是 R_SH;如果短路电流附近曲线过于陡峭,说明 R_SH 太小,漏电流过大。这一步的验证是后面所有研究的基础,很多项目后面 MPPT 振荡或者功率预测偏差,根源就出在这个基线没有校准好。
3. 光照与温度工况建模:用参数扫描逼近实际逆变器输入
3.1 把 G 与 T 定义为可实时改变的输入信号
光伏阵列模型的仿真价值,很大程度上取决于能不能模拟光照突变和温度漂移。PSIM 的 PV Array 元件一般都带有光照和温度的输入引脚,常见做法是用信号源或者全局变量去驱动。G 的单位是 W/m²,范围 0 到 1200;T 是电池温度,单位 °C,范围通常取 -10 到 75。
实际操作中,我建议把 G 和 T 定义成两个独立变量,之后在仿真控制里做参数组合扫描。这样不用修改电路结构,只需要改扫描设置就能生成一簇曲线。需要注意 PSIM 对温度的处理是用电池温度而非环境温度,两者的差异在强光照下可能有 20°C 以上,如果数据手册给出的是 NOCT 条件下的温度系数,需要先把 NOCT 换算成电池温度再填入。
3.2 用温度系数修正 I_SC 和 V_OC 的漂移
数据手册通常会给出两个温度系数:I_SC 的温度系数 α,一般在 +0.04%/°C 到 +0.06%/°C;V_OC 的温度系数 β,一般在 -0.28%/°C 到 -0.34%/°C。这两个系数决定了温度变化时曲线怎么移动。PSIM 元件模型会基于参考温度自动修正,但如果用的是自建子电路模型,就得手动把修正项写进去。
修正公式用线性近似即可:
I_SC(T) = I_SC(STC) * (1 + α * (T - 25))
V_OC(T) = V_OC(STC) * (1 + β * (T - 25))
这里的 α 和 β 是数据手册里的相对值,不是绝对值。很多人直接拿绝对温度系数比如 0.05A/°C 去填 PSIM 参数,导致模型在偏离 STC 时误差放大。正确做法是先用数据手册的相对系数换算,再把结果与厂家的 I-V 曲线温度图交叉验证。若厂家给出 45°C 和 65°C 两条曲线,取其中两个电压点对比,偏差控制在 ±1.5V 内就算合格。
3.3 一次跑完 200 到 1000 W/m² 的 I-V 曲线族
为了得到可供后续 MPPT 算法使用的曲线族,用 PSIM 的 Sweep 功能做多重扫描。扫描外层是光照 G,取值 200、400、600、800、1000;内层是负载电压或负载电阻。仿真结束后把数据导出成 CSV,用 Python 或 MATLAB 绘制 P-V 曲线族。
| 光照 W/m² | V_OC 偏移 | I_SC 偏移 | P_MAX 偏移 |
|---|---|---|---|
| 200 | -1.2V 左右 | 约 20% 标准值 | 约为 1000W/m² 的 19% |
| 400 | -0.8V 左右 | 约 40% 标准值 | 约为 1000W/m² 的 38% |
| 600 | -0.5V 左右 | 约 60% 标准值 | 约为 1000W/m² 的 58% |
| 800 | -0.2V 左右 | 约 80% 标准值 | 约为 1000W/m² 的 79% |
| 1000 | 标准值 | 标准值 | 标准值 |
低光照时 P-V 曲线会变得平滑,最大功率点左侧近似线性上升,右侧快速跌落。MPPT 在这种曲线下如果步长太大,容易在最大功率点左侧反复振荡。有一条经验值得记住:PSIM 仿真里的 MPPT 振荡频率和幅度直接反映实际控制器参数是否合理,光伏阵列模型的光照输入用阶跃信号变化时,观察 MPPT 从旧工作点迁移到新工作点的调节时间,这个时间如果超过 200ms,说明扰动步长或 PI 参数需要调整。
有人习惯用 psim 里的简易压控振荡器做扰动源去模拟 MPPT 的 PWM 纹波,但光伏阵列模型本身是静态 I-V 特性,高频纹波叠加只会让电压电流采样产生谐波,并不会改变工作点位置。研究 MPPT 动态响应时,光照阶跃比振荡器干扰更有参考价值。
4. 热斑与部分遮蔽:给阵列模型加旁路保护逻辑
4.1 为什么单模块等效模型会低估遮蔽损失
基线模型在均匀光照下没问题,但真实屋顶和地面电站经常出现树叶、鸟粪、云影造成的部分遮蔽。遮蔽的本质是某个子串的短路电流下降,导致它在串联回路里被其他子串反偏。如果被遮蔽子串没有旁路二极管保护,它就会进入反向击穿区,局部发热形成热斑。
单模块等效模型把整个阵列当作一个大电池,光照取平均或直接设成 0,输出结果和实测相差非常大。实测中,一个子串被遮蔽 50%,阵列总功率可能只下降 15%,因为旁路二极管把被遮蔽子串短路掉了,其余子串继续输出;如果用平均光照建模,功率会下降 50%。这个差异直接决定了 MPPT 能不能找到全局最大值。
4.2 在 PSIM 子电路里建立串级光伏阵列模型
要模拟热斑与旁路二极管行为,需要在 PSIM 里搭建一个更细致的阵列子电路。常见做法是每 N 个电池片组成一个子串单元,每个子串单元用一个小型光伏电源模型表示,并在它两端并联一个理想二极管,方向允许电流绕过该子串。
子串单元可以用压控电流源加并联电阻实现,电流源受本地光照和温度控制。每个子串的 G_i 作为独立变量,这样就能模拟不同子串接受不同光照的情形。旁路二极管的模型并不复杂,关键是方向别接反,正确方向是二极管阳极接被遮蔽子串的负极输出端,阴极接正极输出端;正常光照时二极管反偏截止,子串被遮蔽导致整体电流下降时,二极管导通,电流从二极管流过。
4.3 子串模型的关键参数与触发条件
子串模型的参数不宜过多,否则仿真收敛会很困难。我一般保留四个参数:子串开路电压、子串短路电流、子串串联电阻、旁路二极管导通压降。其中子串开路电压约等于组件开路电压除以子串数,子串短路电流等于组件短路电流。
| 参数 | 典型值 | 说明 |
|---|---|---|
| 子串电池数 | 24 片 | 常见组件 60 片或 72 片按 3 等分 |
| 子串 V_OC | 约 14V | 取决于电池类型和温度 |
| 子串 I_SC | 与组件 I_SC 一致 | 串联回路电流受最小子串限制 |
| 旁路二极管 V_F | 0.6V 到 0.8V | 导通压降与流过的电流相关 |
触发条件可以理解为:当回路电流大于被遮蔽子串的光生电流时,该子串两端电压开始反偏,一旦反偏电压超过旁路二极管导通阈值,电流转向旁路。这个时候阵列 I-V 曲线会出现台阶状跳跃,P-V 曲线出现多个峰值。全局 MPPT 算法需要在这个多峰曲线上找到最高的那个峰值,常规扰动观察法只会锁定在局部峰值附近。
验证热斑模型是否正确的简单方法:把某一子串的光照设为 600W/m²,其他子串保持 1000W/m²,扫描整个阵列的输出,观察 P-V 曲线是否出现双峰。若只有一个平滑峰值,说明旁路二极管模型或者子串电流源设置有问题,优先检查二极管的极性以及子串的 I_SC 是否随光照正确变化。
部分遮蔽还有一个被忽视的现象:不仅最大功率点变化,整个阵列的最佳工作电压也会向左移动。实测中常见的情况是阵列最佳工作电压下降 10% 到 20%,如果逆变器 MPPT 电压范围设计得过窄,就可能找不到新的最大功率点。这个信息应该反馈到系统设计阶段,逆变器的 MPPT 电压下限要留出遮蔽工况的余量。P-V 曲线多峰情况下,模型输出可以直接接入 PSIM 的 MPPT 模块做算法对比,这也是在 PSIM 里研究全局搜索类算法的经典用法。
5. 验证模型的两个硬指标:最大功率误差与 MPPT 链路适配
5.1 最大功率点误差的计算方法
评判光伏阵列仿真模型是否达标,一个硬指标是最大功率点误差。在标准测试条件 STC 下,用扫描法找到模型输出 P_MAX_SIM,与数据手册 P_MAX_DATA 比较:
e_PMAX = (P_MAX_SIM - P_MAX_DATA) / P_MAX_DATA * 100%
工程上,e_PMAX 绝对值在 2% 以内属于可用,1% 以内算良好。如果超过 2%,调整参数时从 R_S 开始,同一时间只调一个变量,否则很难定位原因。R_SH 只在低光照条件下对曲线影响明显,STC 下调节 R_SH 对最大功率点影响很小,这个顺序能省很多调试时间。
5.2 复现数据手册 I-V 曲线的校准流程
建好模型之后,建议做一个能在十分钟内完成的校准流。固定 G 为 1000W/m²,扫描得到一条完整的 I-V 曲线,然后取六个特征点:短路点、最大功率点、1/4 开路电压、1/2 开路电压、3/4 开路电压、开路点,与数据手册的 STC 曲线比较。如果所有点误差都在 3% 以内,模型就可以交付到系统级仿真使用。
校准之后再做温度工况验证。设电池温度为 50°C,扫描得到该温度下的 V_OC,与数据手册温度图对照。若 V_OC 偏差超过 2V,检查温度系数是否设成了环境温度系数;若 I_SC 偏差明显,检查光照参考值是否写错。
5.3 把校准好的阵列接到 MPPT 仿真链路
模型校准完成后,把它接到 Boost 变换器与 MPPT 控制器构成的仿真链路中。控制器可以采用扰动观察法,核心逻辑如下:
采样 V(k) 和 I(k) 计算 P(k) = V(k) * I(k) if P(k) > P(k-1): 扰动方向不变 else: 扰动方向反转 更新占空比 d(k) = d(k-1) + step * direction在 PSIM 里用 C Block 或 Simulink 耦合模块实现这段逻辑。注意观察两个指标:一是稳态时最大功率附近是否有持续振荡,振荡幅度应小于 1% P_MAX;二是光照从 1000W/m² 跳变到 600W/m² 时,MPPT 重新找到最大功率点的调节时间。这两个指标比单纯看曲线形状更能说明模型是否适合控制算法验证。
5.4 一个可迁移的实用技巧:用脚本批量生成不同组件模型
最后分享一个我在多项目并行时常用的工作流。把不同组件厂家的数据手册参数整理成一个 CSV 文件,每一行对应一种组件型号。然后用脚本读取 CSV,按照本章 2.2 节的反推逻辑计算 R_S 和 R_SH,自动生成 PSIM 元件参数表。再批量运行扫描仿真,输出每个组件型号的 e_PMAX,把误差大于阈值的型号筛选出来。
import csv models = [] with open('modules.csv') as f: for row in csv.DictReader(f): # 对每行执行 Rs/Rsh 反推 rs, rsh = calc_rs_rsh( voc=float(row['Voc']), isc=float(row['Isc']), vmp=float(row['Vmp']), imp=float(row['Imp']) ) models.append({ 'part_no': row['PartNo'], 'Rs': round(rs, 4), 'Rsh': round(rsh, 1) })这样得到的参数不是凭空估计,而是基于每款组件自己的数据手册,模型之间可以横向对比。阵列失配研究、多路 MPPT 的组串差异仿真、不同组件功率等级对逆变器直流侧电压范围的影响,都能用这套批量生成的参数快速搭建。完成这一步,光伏阵列仿真模型就可以作为标准模块复用到多个项目中,而不再每次从零搭建。
本文还有配套的精品资源,点击获取