3. 扰动观察法(P&O)详解:算法原理、步长设计、振荡与误判问题、改进策略

各位工程师朋友,今天我们来聊聊MPPT算法里最经典、也最接地气的一个——扰动观察法,简称P&O。说实话,我刚入行那会儿,第一个接触的MPPT算法就是它。为什么?因为它简单、直观,而且效果还不错。但你要是觉得它就这么简单,那可就大错特错了。

3.1 算法原理:说白了就是“试”

P&O的核心思想,其实特别朴素。你想想看,我们不知道光伏板的最大功率点在哪,但我们可以“试探”啊。就像你在黑夜里找开关,伸手往左摸一下,没摸到,再往右摸一下,哎,摸到了。

具体到算法里,我们每次给电压加一个小扰动(比如增加0.5V),然后看功率怎么变:

  • 功率增加了 → 说明方向对了,继续往这个方向扰动
  • 功率减少了 → 说明方向错了,反过来扰动

就这么简单。我当年在实验室调第一版P&O时,看着示波器上功率曲线慢慢往最大点爬,那种感觉,嗯,挺有成就感的。

下面这个流程图,把P&O的逻辑讲得很清楚:

开始 采样 V(k), I(k) 计算 P(k) = V(k) × I(k) ΔP = 0? ΔP > 0 保持方向 ΔP < 0 改变方向 ΔP = 0 施加扰动 ΔV 返回

你看,逻辑就这么几行。但实际工程里,坑都在细节里。

3.2 步长设计:大还是小?这是个问题

步长,就是每次扰动的大小。我习惯用ΔV来表示。这个参数怎么选?我直接说结论:

步长 优点 缺点 适用场景
大步长(>2% Voc) 跟踪速度快 稳态振荡大,功率损失多 光照剧烈变化时
小步长(<0.5% Voc) 稳态精度高,振荡小 跟踪慢,可能跟不上光照变化 光照稳定的晴天
中等步长(1% Voc左右) 折中方案 两头都不够极致 大多数常规场景

我在项目里踩过一个大坑。有一次做300kW的逆变器,步长设了1V,想着挺小的。结果并网后,MPPT一直在最大点附近来回晃,功率波动有3%那么大。后来一算,1V对于300kW的系统来说,对应的功率变化太大了。

注意:步长不是绝对值,要跟系统功率等级挂钩。我建议用相对值,比如Voc的0.5%~1%。对于1000V的系统,步长取5V~10V比较合理。

3.3 振荡与误判问题:P&O的“阿喀琉斯之踵”

P&O最大的问题是什么?两个:振荡和误判。

振荡问题说白了就是:到了最大点附近,算法还在左右扰动,功率就在最大点附近来回跳。你想想看,本来已经到山顶了,你非要往左走一步再往右走一步,能不晃吗?

误判问题更头疼。光照突然变化时,P&O会搞不清方向。比如光照突然变强,功率上升了,算法以为是自己扰动对了方向,继续往那个方向走,结果越走越远。

我遇到过最夸张的一次,是在一个多云天测试。云飘过来遮住太阳,功率掉了一半,P&O误判方向,直接往短路点跑,差点触发过流保护。

核心矛盾:P&O本质上是个“瞎子摸象”的算法——它只知道功率变了,但不知道是扰动引起的还是光照变化引起的。

3.4 改进策略:让P&O更聪明一点

针对上面这些问题,业界有很多改进方案。我挑几个实用的说说:

3.4.1 变步长P&O

这个思路很直接:离最大点远的时候,大步快跑;离得近了,小步慢走。怎么判断远近?看ΔP/ΔV的绝对值。这个值大的时候,说明还在斜坡上,大步走;值小的时候,说明快到顶了,换小步。

// 变步长P&O核心代码
float deltaV = 0;  // 扰动步长
float k = 0.5;     // 步长系数,需要调试

if (abs(dP) > threshold_large) {
    deltaV = step_large;   // 大步长
} else if (abs(dP) > threshold_small) {
    deltaV = step_medium;  // 中步长
} else {
    deltaV = step_small;   // 小步长
}

// 方向判断
if (dP > 0) {
    // 保持方向
} else {
    deltaV = -deltaV;  // 反向
}

Vref += deltaV;
经验之谈:变步长的阈值怎么设?我习惯用额定功率的1%和5%作为两个阈值。当然,具体数值要看系统特性,建议在实测中微调。

3.4.2 功率预测法

这个方法的思路是:既然我们分不清功率变化是扰动引起的还是光照引起的,那我们就“预测”一下光照变化的影响。

具体做法是:采样两次功率变化,一次是扰动前的,一次是扰动后的。如果两次变化趋势一致,说明是光照变化;如果相反,说明是扰动引起的。

嗯,这个方法理论上很好,但实际实现时有个问题——需要高速采样,对ADC和MCU的要求比较高。我在一个低成本项目里试过,采样频率不够,预测效果很差,最后还是换回了变步长方案。

3.4.3 三点比较法

这个方法更简单粗暴:不只看当前点和上一个点,而是看三个点。如果功率连续三次往同一个方向增加,那大概率是光照变化,不是扰动引起的。

代码实现也很简单:

// 三点比较法
static float P_history[3] = {0};

// 更新历史数据
P_history[2] = P_history[1];
P_history[1] = P_history[0];
P_history[0] = P_current;

// 判断趋势
if (P_history[0] > P_history[1] && P_history[1] > P_history[2]) {
    // 连续上升,可能是光照增强,保持方向
} else if (P_history[0] < P_history[1] && P_history[1] < P_history[2]) {
    // 连续下降,可能是光照减弱,保持方向
} else {
    // 正常P&O判断
}
注意:三点比较法会引入延迟,因为要等三个采样点才能判断。对于光照变化特别快的场景(比如云边效应),这个延迟可能让MPPT跟不上。

3.5 我的工程建议

说了这么多,最后给几个实在的建议:

  • 起步用固定步长:先把基础P&O跑通,再考虑优化。我见过太多人一上来就搞变步长,结果问题出在采样上,折腾半天找不到原因。
  • 步长要跟开关频率匹配:每次扰动至少要等系统稳定下来再采样。我一般等5~10个开关周期。
  • 加个死区:功率变化小于某个阈值时,不扰动。这个阈值我通常取额定功率的0.1%~0.3%。
  • 别忘了滤波:采样进来的电压电流,一定要做滤波处理。我习惯用一阶低通滤波,截止频率设在10Hz左右。

好了,P&O的内容就讲到这里。这个算法虽然简单,但用好了,在大多数场景下都能达到98%以上的跟踪效率。关键是你要理解它的局限性,然后针对性地做改进。


专注资料整理