同一块光伏板,晴空下输出100W,飘来一片云挡住三分之一,输出往往不是掉到70W,而是直接腰斩成40W甚至更低。这不是组件质量问题,也不一定是逆变器故障,而是局部遮阴引发了一个非常棘手的问题——光伏阵列的P-V特性曲线从单峰变成了多峰。常规的MPPT(最大功率点追踪)算法在这个场景下很容易被“骗”到某个局部峰值上,导致系统长期在低功率点运行。做光伏控制仿真这几年,“考虑局部遮阴的光伏PSO-MPPT控制模型(Simulink仿真实现)”这个课题我前后搭了三次模型,踩了不少坑,也积累了一些实打实的调参经验,今天一次性说清楚。
这篇文章适合谁看:正在做光伏MPPT方向毕业设计的学生、想把智能算法引入到自己仿真项目里的工程师、或者单纯想搞清楚PSO在Simulink里怎么落地的人。我会把局部遮阴的多峰机理、粒子群优化算法(PSO)的MPPT控制策略、以及完整的Simulink模型搭建链路都拆开讲,最后再分享几个让仿真结果更具参考价值的调参细节。如果你之前只做过常规的扰动观察法MPPT,这篇内容能帮你把思路往前推一大步。
1. 局部遮阴引发的多峰输出特性:为什么传统MPPT在这里会失灵
在讲PSO算法之前,得先把对手的样子看清楚。局部遮阴下光伏阵列的输出特性曲线完全变了形,这是所有后续控制设计的前提。
1.1 组件串联结构下“短板效应”的放大机制
光伏组串的电气特性可以简化理解为串联电池串:电流处处相等,电压逐块累加。当某一小块组件被云层、树木、楼宇阴影遮挡时,它的光生电流会显著下降,但组串电流却由其他正常光照的组件决定。如果组串当前工作电流大于被遮挡组件能提供的最大电流,被遮组件没法正常输出,会被反向偏置,甚至产生热斑效应烧毁组件。
为了防止热斑损坏,光伏组件内部都并联了旁路二极管。旁路二极管的物理作用是什么?当组件的反向偏压达到二极管导通阈值时,二极管导通,把被遮组件“旁路短路”掉。这时候被遮组件停止发电,电压直接从组串中扣除一段,但电流可以绕过它继续流动。同时,如果遮阴程度较轻,被遮组件自身还能提供一部分电流,则它不被旁路,仍然参与电压串联。
于是,整个组串在不同工作电流下,出现了“旁路状态”和“正常工作状态”的切换切换。每次旁路切换,都会在P-V曲线上制造一个局部极值点。
1.2 从P-V曲线看“多峰”与“单峰”的本质差异
以三块组件串联的组串为例,假设每块组件开路电压22V、最大功率点电压17.2V、短路电流3.8A、最大功率点电流3.5A,额定功率约60W。全部均匀光照时,组串的P-V曲线只有一个最大功率点,大约在51.6V左右,功率约180W,曲线是平滑山丘形。
现在假设中间那块组件被遮了50%光照。它的光生电流几乎减半,最大只能输出1.9A左右。此时P-V曲线上会出现两个功率峰:
第一个峰出现在组串电压约34V附近(两块正常组件的最大功率点电压叠加,第三块被旁路),此时电流可以跑到3.5A,功率约119W。第二个峰出现在组串电压接近51V的位置,此时三块组件都正常工作但电流受限于1.9A,功率约96W。
发现没有?在这个案例里,全局最大功率点在低压侧,不在常规的高压侧。如果遮阴比例、环境温度、辐照强度发生改变,全局峰值也可能跳到另一个位置。更复杂的情况是串并联结构、多个组件被不同程度遮挡,曲线可能出现三个甚至四个峰,分布毫无规律。这就是PSO这类智能算法登场的原因——要在不知道曲线形状的情况下,把全局最高峰找出来。
1.3 扰动观察法(P&O)为什么会卡在局部峰
常规的扰动观察法、电导增量法,本质逻辑都是“看当前点往左移动功率是否增大、往右移动功率是否增大,哪个方向功率增大就往哪个方向走”。在单峰曲线上这个逻辑没问题,最终会收敛到山顶。但多峰曲线的关键特征是:局部峰的左右两侧功率都低于峰顶,算法一旦爬上某个局部峰,往任何方向扰动都会看到功率下降,于是判定“这里就是最佳工作点”,不再移动。
这就是P&O在局部遮阴下失效的直接原因。它不是坏了,而是它从设计上就没有“识别其他山峰”的能力。很多实际电站里,组件被遮挡后发电量长期低于预期,故障诊断却又找不到原因,往往就是这个局部峰值陷阱在作怪。
2. PSO-MPPT控制策略设计:粒子群算法如何从“多峰围猎”中锁定全局最大功率点
既然传统算法会陷在局部峰里,那就需要一个带“全局搜索”能力的算法。粒子群优化算法(PSO)最初被提出来是解决连续优化问题的,用在MPPT里刚好合适。
2.1 PSO的核心机制与MPPT场景的映射关系
PSO的灵感来自鸟群觅食。假设有一群鸟在一片地形复杂的区域里找食物最多的地方,每只鸟都不知道食物在哪,但每只鸟记得自己飞过的最好位置,同时也知道整个鸟群目前发现的最好位置。于是每只鸟的飞行方向就由两部分决定:回归自己最好位置的“个体认知”和飞向群体最好位置的“社会认知”,外加一点继承自上一时刻速度的惯性。
对应到MPPT问题里,“鸟”就是一组占空比候选值,“食物量”就是光伏阵列输出功率P“,飞行维度只有1维——即Boost变换器的占空比D。粒子在占空比可行域内移动,每次移动后,控制器读取当前占空比下的光伏输出电压和电流,算出功率,记录下来,更新粒子个体最优和全局最优,然后再按下一次指令移动。
速度更新公式是:
v_i(k+1) = w * v_i(k) + c1 * r1 * (pbest_i - x_i(k)) + c2 * r2 * (gbest - x_i(k))
位置更新公式是:
x_i(k+1) = x_i(k) + v_i(k+1)
这里:
- w是惯性权重,控制粒子对之前速度的继承程度。w大则全局探索能力强,w小则局部精细搜索能力强
- c1、c2是加速系数,分别衡量“相信自己经验”和“相信群体经验”的程度
- r1、r2是在[0,1]之间均匀分布的随机数,用来增加搜索的随机性
- pbest_i是第i个粒子自身历史最优位置,gbest是全体粒子的历史最优位置
在MPPT场景里,粒子的位置x就是占空比D,适应度函数就是光伏输出功率P = Vpv * Ipv。PSO要做的事情,就一句话:在占空比[0.1, 0.9]这个区间里,找到能使功率最大化的那个占空比。
2.2 从算法到控制器的映射:一维粒子群的关键参数设定
和我最初搭二维粒子群做MPPT的经历不同,经过多个版本的对比,我最终确定MPPT场景下用一维粒子群就够了。占空比是唯一的控制量,用二维甚至三维粒子纯粹增加计算量,收敛速度和稳定性反而变差。
粒子维度:1维,对应Duty Cycle。 粒子数量:传统优化问题里粒子数量常用20~50,但MPPT是单峰问题(在某一时刻)且实时性要求高,粒子取6~10个就足够。取太多会在每次迭代时花大量时间评估,功率波动也更大,8个是我实测下来最均衡的选择。
迭代次数:单次MPPT搜索建议20~40轮。粒子数量8、迭代30轮,意味着完成一次完整搜索需要240次功率采样。如果每次采样等待5ms让系统稳定,一次搜索大约1.2秒。在环境变化不太剧烈的场景下完全够用。
惯性权重:固定w=0.7或者线性递减策略都可以。线性递减更稳:从0.9开始,随着迭代次数增大逐渐减小到0.4,前期大范围搜索定位全局峰,后期在全局峰附近精细收敛。我自己习惯写成w = 0.9 - 0.5 * (k / Kmax),其中k是当前迭代次数,Kmax是最大迭代次数。
加速系数c1和c2取2.0和1.5左右,r1、r2使用rand函数生成。
2.3 占空比可行域与Boost电路输出特性的关联
PSO搜索的占空比范围不是随便定的,它和主电路拓扑强相关。Boost升压变换器中,连续导通模式(CCM)下输入输出电压关系是:
V_out = V_pv / (1 - D)
所以光伏阵列工作电压被占空比直接钳制:D越大,V_pv越低;D越小,V_pv越高。占空比范围通常限制在0.1~0.9之间。低于0.1,Boost升压比接近1,功率点可调范围有限;高于0.9,开关管导通时间过长,输出电压过高,器件应力大,而且电感电流纹波显著恶化。同时需要在算法里做限幅,防止粒子跑出可行域。
3. Simulink模型搭建实录:从光伏阵列到Boost电路的完整链路
PSO算法设计得再好,落不到Simulink模型里也是纸上谈兵。这一节我把模型的每一层都拆开讲,包括模块选型、参数设置、信号流组织方式。
3.1 光伏阵列的建模选择:内置模块与自定义公式的取舍
Simulink中搭建光伏阵列模型有两种主流方式。第一种是使用Simscape Electrical工具库里的PV Array模块(光伏阵列模块),它的好处是参数直观、和后面电力电子电路直接电气相连,可以设置组件串联数、并联数、温度和辐照度。第二种方式是自己用MATLAB Function写光伏电池的五参数方程,输出I-V特性。
对做局部遮阴仿真的场景,我更推荐先用Simscape的PV Array模块把基础跑通,再用自定义模型做多峰精确验证。原因是Simscape的PV Array支持直接设置每个子串(或组件)的辐照度,非常方便搭建“第一块组件1000W/m²、第二块500W/m²、第三块800W/m²”这样的遮阴场景。
我常用的一组组件参数如下:
| 参数 | 数值 | 说明 |
|---|---|---|
| 开路电压V_oc | 22.0V | 单块组件 |
| 短路电流I_sc | 3.8A | 单块组件 |
| 最大功率点电压V_mpp | 17.2V | 单块组件 |
| 最大功率点电流I_mpp | 3.5A | 单块组件 |
| 最大功率P_max | 60W | 单块组件 |
| 串联组件数 | 3 | 构成约66V组串 |
| 并联组串数 | 1 | 简化模型 |
如果自己写单二极管模型,标准电流方程是:
I = Iph - Io * (exp(q * (V + IRs) / (nkT)) - 1) - (V + IRs) / Rsh
其中Iph是光生电流,Io是二极管反向饱和电流,q是电子电荷常数,k是玻尔兹曼常数,T是电池温度,n是二极管理想因子,Rs是串联电阻,Rsh是并联电阻。搭建时把这个方程写进MATLAB Function,输入V_pv和辐照度,输出I_pv。这种方法的优势是能精确控制每个电池片的辐射差异,自由度最高;缺点是计算量大,容易不收敛,所以建模时要给光伏端口并联一个小电容缓冲。
3.2 Boost主电路参数设计:电感、电容与开关频率
光伏MPPT需要Boost变换器把光伏阵列的低压直流升压到负载所需的电压母线。我用的是经典CCM模式Boost:
- 输入侧并联电容C_in = 470uF,用于稳定光伏阵列电压、提供开关期间的高频电流通路
- 储能电感L = 5mH。电感的选取依据纹波要求,电感和开关频率共同决定电流纹波幅度。5mH在20kHz开关频率下,配合几十瓦级功率,纹波控制在5%以内没问题
- 输出电容C_out = 470uF,用于抑制输出电压纹波
- 开关管用MOSFET/IGBT理想开关模型即可,要看到更接近实际的开关波形可以用斯密特触发器加PWM发生器驱动
- 负载电阻R_load = 30欧姆,额定功率约145W左右
- PWM开关频率f_sw = 20kHz,三角波载波幅值0~1,与占空比信号直接比较
有一点需要提醒:仿真求解器步长。PWM开关频率20kHz,对应周期50us,如果仿真步长太大,脉冲波形会失真;太小则耗时爆炸。我的做法是模型层用变步长ode23tb,最大步长限制在1e-6秒,控制信号采样用1e-4秒的Rate Transition模块做缓冲,兼顾精度和速度。
3.3 PSO控制器在Simulink中的实现结构
PSO控制器用MATLAB Function模块实现,输入是光伏阵列的输出电压V_pv、输出电流I_pv,输出是目标占空比Duty。这里有一个关键设计:整群粒子同时评估还是逐个粒子串行评估?
同时评估的好处是每轮迭代并行度高、响应快,但在Simulink里需要同时给多个占空比分支配置多个Boost电路副本,电路规模成倍增长,仿真很慢。逐个粒子串行评估的优势是只需要一套主电路:控制器设定某个粒子占空比,等待几个开关周期让功率稳定,然后采样电压电流、更新粒子状态、切换下一个粒子。电路规模小、仿真速度快,代价是完成一轮搜索的时间更长,但工程上完全够用。
核心代码如下:
function Duty = PSO_MPPT(Vpv, Ipv, enable) % PSO-MPPT 单粒子逐次评估版本 % 输入: Vpv 光伏电压, Ipv 光伏电流 % 输出: Duty 目标占空比 persistent particles vels pbest pbestVals gbest gbestVal count iter if isempty(particles) N = 8; % 粒子数 Dmin = 0.1; Dmax = 0.8; particles = linspace(Dmin, Dmax, N)'; % 均匀初始分布 vels = zeros(N,1); pbest = particles; pbestVals = zeros(N,1); gbest = 0.6; % 初始占空比 gbestVal = 0; count = 0; % 总评估次数计数器 iter = 0; % 当前迭代次数 end P = Vpv * Ipv; % 当前功率 idx = mod(count, N) + 1; % 当前粒子编号 % 评估并更新粒子个体最优 if P > pbestVals(idx) pbestVals(idx) = P; pbest(idx) = particles(idx); % 更新全局最优 if P > gbestVal gbestVal = P; gbest = particles(idx); end end % 迭代轮数计算 if idx == N iter = iter + 1; end % 线性递减惯性权重 Kmax = 30; w = 0.9 - 0.5 * min(iter, Kmax) / Kmax; c1 = 2.0; c2 = 1.5; % 速度与位置更新 r1 = rand; r2 = rand; vels(idx) = w * vels(idx) + c1 * r1 * (pbest(idx) - particles(idx)) + ... c2 * r2 * (gbest - particles(idx)); % 限速限位 vmax = 0.08; if vels(idx) > vmax, vels(idx) = vmax; end if vels(idx) < -vmax, vels(idx) = -vmax; end particles(idx) = particles(idx) + vels(idx); if particles(idx) < 0.1, particles(idx) = 0.1; end if particles(idx) > 0.8, particles(idx) = 0.8; end Duty = particles(idx); count = count + 1; end这段代码的逻辑是“评估一个粒子,再更新这个粒子”,依次轮转8个粒子,每8次评估构成一轮完整迭代。这样做的好处是每次占空比变化不超过一个粒子的位移量,不会出现整个系统剧烈振荡。对实时MPPT来说,这个平滑性非常重要。
细节:Simulink中MATLAB Function模块的采样时间要设置为离散采样,采样周期可以设为5ms。这样每个采样周期只评估一个粒子,给Boost电路预留了足够的稳定时间。初始粒子位置用linspace均匀分布在0.1~0.8区间,而不是随机分布,这是为了防止多个粒子挤在一起导致搜索覆盖不足。
4. 仿真结果拆解:局部遮阴场景下的追踪全过程
模型跑通了,结果怎么看?我做了三组代表性场景的仿真:均匀光照基准测试、单块组件遮阴的追踪测试、非对称遮阴对比测试。
4.1 均匀光照下的基准验证:PSO能收敛到理论MPP吗
先把三块组件都设为1000W/m²、25°C,跑PSO-MPPT,看它能不能找到理论上的最大功率点。理论计算:组串最大功率应在51.6V和3.5A附近,约180W。
实测PSO从初始占空比0.6启动(对应V_pv约40V,工作点明显低于MPP),第1~3轮,粒子分布在0.1~0.8区间,功率评估值差异很大,功率曲线出现明显毛刺;第5轮左右,gbest基本锁定在低压侧的某个粒子附近;第10轮以后,全体粒子向gbest收敛,占空比稳定在0.53附近,光伏电压稳定在51.2V,功率179W左右,和理论值偏差不超过1%。
这里要强调一个现象:PSO在首轮搜索阶段,由于粒子跨度大,功率从几十瓦到一百多瓦快速跳变,这是正常的“探索”,不要把它当作系统振荡。如果发现粒子全部聚集后功率仍在波动,那就要检查是不是速度限幅设得太高、导致粒子在全局最优点附近来回穿越。
4.2 局部遮阴场景下的全局峰追踪实测
场景设定:组件2的辐照度降到500W/m²,组件1和组件3保持1000W/m²。遮阴比例50%。这种情况下P-V曲线存在双峰,理论全局MPP在34V附近约119W,局部峰在51V附近约96W。
传统P&O从51V附近的常规启动点开始扰动,大概率会停在局部峰96W附近。而PSO的粒子初始均匀分布在0.1~0.8,天然覆盖了低压和高压两个区域。第2轮就有粒子落在D=0.72附近(对应V_pv约34V),评估到功率118W,gbest迅速切换到低压侧;后续所有粒子在惯性作用下逐渐聚拢到D=0.72周围,最终稳定输出功率118W,成功避开局部峰。
这个例子的启示很重要:PSO能找全局峰,靠的不是“从某个点开始爬”,而是“一开始就撒开网”。粒子初始分布的均匀性直接决定搜索成功的可能性。我见过有人把粒子初始位置全部设成同一个值,结果PSO退化成了局部搜索,完全没有多峰能力。
4.3 PSO与扰动观察法的响应对比:用数据说话
为了直观展示差异,我把两种算法放在同样的遮阴场景下跑完仿真,记录稳态功率和追踪时间:
| 遮阴场景 | 全局最优功率 | P&O稳态功率 | PSO稳态功率 | PSO达到目标的时间 |
|---|---|---|---|---|
| 无遮阴(三块1000W/m²) | 180W | 179.3W | 178.8W | 约1.4s |
| 中间块50%遮阴 | 119W | 约96W(卡在局部峰) | 118.2W | 约2.1s |
| 不对称遮阴(两块各30%、50%) | 约85W | 约60W(卡在局部峰) | 84.5W | 约2.6s |
三组数据足够说明问题。无遮阴时两者差距不大,都有精准追踪能力;一旦遮阴导致多峰,P&O大概率卡在局部峰,PSO几乎总能收敛到全局最优点。
不过要老实说:PSO也不是万能的。如果全局峰和局部峰靠得非常近(比如只差2V),粒子的限速又太大,粒子可能高速掠过全局峰附近而不采样到足够高的功率,最终收敛到次优解。处理办法是把速度限幅严格控制在D宽度的10%以内,同时保证粒子初始覆盖密度够细。
5. 调参经验与踩坑记录:把仿真结果做实的关键细节
模型能跑通只是第一步,结果能不能让人信服,取决于大量细节。这一节全部是实测中总结出来的经验,照着做能少走很多弯路。
5.1 粒子数与迭代次数的平衡:不是越多越好
粒子越多,全局搜索能力越强,但代价是每轮迭代需要的评估次数成倍上升,系统波动时间拉长。在我的20kHz PWM、5ms控制周期的配置下,6个粒子的搜索过程毛刺太多,偶尔漏掉全局峰;10个粒子的搜索平滑度好一些,但收敛到全局峰的时间增加到3秒以上;8个粒子是综合最优解,既有足够的覆盖密度,又能控制总搜索时长在2秒左右。
迭代次数也不需要过大。PSO的特性是前10轮基本完成了“定位山峰”的任务,后面都是在做精细收敛。30轮对大多数场景足够了。如果30轮后粒子还在漂移,大概率是速度限幅和惯性权重没调好,而不是迭代次数不够。
5.2 初始化布局的两种策略
粒子初始位置直接决定PSO“看得见”哪些候选解。我试过两种初始化策略。
随机初始化:每个粒子的初始位置在可行域内均匀随机生成。优点是搜索覆盖完全无偏,缺点是可能产生初始粒子过于密集或过于稀疏的极端情况,导致首轮评估功率普遍偏低。
均匀初始化加偏置:先用linspace把粒子均匀铺开,确保覆盖整个占空比区间,再把其中一个粒子放置在一个“有经验的猜测点”上。这个猜测点可以根据开路电压比例估算,比如组串开路电压66V,目标电压约51V,估算占空比D = 1 - 51/66 = 0.23左右。这个粒子保证首轮至少有一个直接落在常规MPP附近,即使其他粒子全部迷失,系统也能有一个相对合理的输出。
实测下来,均匀初始化加偏置的鲁棒性明显更好,在严重遮阴场景下从启动到输出合理功率的时间缩短了近40%。
5.3 功率采样时机与“等待-评估”时序设计
这是最容易踩坑的地方,也是仿真结果不稳定的常见来源。
Boost电路在切换占空比后,电感电流和电容电压需要一段时间才能达到新的稳态。如果粒子占空比刚切换就立刻采样功率,读到的是一堆过渡过程的瞬态值,根本不能代表该占空比下的真实稳态功率。PSO很可能把一个瞬态高功率误判为最优点,从而收敛到错误位置。
解决方案是在控制周期里加入“等待-评估”时序。我的Simulink实现是:MATLAB Function模块的采样周期设为5ms,其中前4ms作为等待时间(此时只更新Duty输出),第5ms读取Vpv和Ipv计算功率并更新粒子状态。实测对比,加了等待机制后稳态追踪精度从88%提升到99%以上。
另一个坑是Simulink中代数环问题。Vpv和Ipv直接反馈给MATLAB Function,Function又直接输出Duty驱动功率电路,如果整个环路的采样时间设置不当,会报“Algebraic Loop”错误。解决办法是在反馈回路中插入Memory模块或单位延迟Unit Delay打破代数环,或者在MATLAB Function中增加一个单位延迟寄存器。
5.4 占空比限幅与平滑输出
PSO的搜索本质是随机性的,粒子在更新过程中可能出现大幅跳跃。如果直接把这些占空比送到PWM发生器,输出电压会出现很大的阶跃性波动,不仅影响仿真稳定性,在实物平台上更可能损坏开关器件。
我在控制器输出端加了两道保险。第一道是限幅器,把占空比硬限制在0.1~0.9之间。第二道是一阶低通滤波器,时间常数5ms,把占空比变化速率平滑化。滤波之后PSO的控制量变化变得连续,系统给负载的冲击明显减小。需要注意,滤波时间常数太大会降低动态响应速度,在辐照度突变的场景下会明显延迟追踪。5ms这个值和5ms控制周期匹配,实测是响应速度和稳定性的较好折中。
5.5 环境突变时PSO重启判定:一个常被忽略的问题
最后说一个很多人做仿真时不考虑、但实际场景中非常重要的问题:当辐照度或温度再次变化时,旧的gbest已经失效,PSO必须重新搜索。
判断重启的常用逻辑有几种。我自己的做法是:持续监视光伏输出功率,如果当前功率低于gbest记录功率的85%以上且持续超过0.2秒,则认为环境发生显著变化,重置粒子和历史最优,重新开始搜索。
这个阈值需要谨慎选择。阈值设置过低(比如95%)会导致正常微小波动也触发重启,系统不断振荡;阈值设置过高(比如70%)则会错过有效遮阴变化,系统长时间滞留在次优工作点。85%是我在不同遮阴比例下测试多组后确定的值。另外要注意重启后粒子分布要重新铺开,不能沿用旧粒子位置,否则搜索范围受限。
5.6 求解器与仿真速度的优化实战
最后一个实用技巧:怎么让仿真跑得更快且不丢精度。
局部遮阴仿真涉及PWM开关、光伏非线性方程、PSO逻辑多层模块,求解器选择很关键。我先用离散求解器试过,固定步长1e-6秒,运行0.5秒仿真大约要十几分钟,非常慢。后来改成变步长ode23tb,最大步长设为0.001秒,自动步长情况下精度控制在1e-4,仿真时间缩短到两分钟左右,而PSO稳态功率误差几乎没变。
如果仿真仍然太慢,还有一个思路:把Boost的PWM模型改为平均值模型。平均值模型不考虑开关细节,用受控电压源和受控电流源模拟变换器平均行为,仿真速度可以再提升一个数量级。代价是看不到真实开关纹波波形。建议是:最终验证时用完整开关模型跑一遍确认动态过程,其他大量参数扫描实验用平均值模型,效率和可信度兼顾。
最后再提醒一点
把PSO-MPPT模型从“论文里”搬进“电脑里”的过程,很多时候卡住的不是算法本身,而是Simulink里时序、代数环、采样步长这类看似小到不值得写进文档的问题。我上面给出的参数和结构是我反复验证后比较省心的一套配置,直接抄作业基本能跑通,但强烈建议你把粒子数、惯性权重、速度限幅几个关键变量稍微拨动一下,观察差异,这会让你更直观地理解每个参数在算法里承担的角色。扩展方向上,你还可以试试把PSO和模糊控制结合做动态参数调整,或者把重启判据升级成辐照度传感器的直接信号,都是值得往深处做的题目。