3. 扰动观察法(P&O)详解:算法原理、步长设计、振荡与误判问题、改进策略
各位工程师朋友,今天我们来聊聊MPPT算法里最经典、也最接地气的一个——扰动观察法,简称P&O。说实话,我刚入行那会儿,第一个接触的MPPT算法就是它。为什么?因为它简单、直观,而且效果还不错。但你要是觉得它就这么简单,那可就大错特错了。
3.1 算法原理:说白了就是“试”
P&O的核心思想,其实特别朴素。你想想看,我们不知道光伏板的最大功率点在哪,但我们可以“试探”啊。就像你在黑夜里找开关,伸手往左摸一下,没摸到,再往右摸一下,哎,摸到了。
具体到算法里,我们每次给电压加一个小扰动(比如增加0.5V),然后看功率怎么变:
- 功率增加了 → 说明方向对了,继续往这个方向扰动
- 功率减少了 → 说明方向错了,反过来扰动
就这么简单。我当年在实验室调第一版P&O时,看着示波器上功率曲线慢慢往最大点爬,那种感觉,嗯,挺有成就感的。
下面这个流程图,把P&O的逻辑讲得很清楚:
你看,逻辑就这么几行。但实际工程里,坑都在细节里。
3.2 步长设计:大还是小?这是个问题
步长,就是每次扰动的大小。我习惯用ΔV来表示。这个参数怎么选?我直接说结论:
| 步长 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 大步长(>2% Voc) | 跟踪速度快 | 稳态振荡大,功率损失多 | 光照剧烈变化时 |
| 小步长(<0.5% Voc) | 稳态精度高,振荡小 | 跟踪慢,可能跟不上光照变化 | 光照稳定的晴天 |
| 中等步长(1% Voc左右) | 折中方案 | 两头都不够极致 | 大多数常规场景 |
我在项目里踩过一个大坑。有一次做300kW的逆变器,步长设了1V,想着挺小的。结果并网后,MPPT一直在最大点附近来回晃,功率波动有3%那么大。后来一算,1V对于300kW的系统来说,对应的功率变化太大了。
3.3 振荡与误判问题: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;
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判断
}
3.5 我的工程建议
说了这么多,最后给几个实在的建议:
- 起步用固定步长:先把基础P&O跑通,再考虑优化。我见过太多人一上来就搞变步长,结果问题出在采样上,折腾半天找不到原因。
- 步长要跟开关频率匹配:每次扰动至少要等系统稳定下来再采样。我一般等5~10个开关周期。
- 加个死区:功率变化小于某个阈值时,不扰动。这个阈值我通常取额定功率的0.1%~0.3%。
- 别忘了滤波:采样进来的电压电流,一定要做滤波处理。我习惯用一阶低通滤波,截止频率设在10Hz左右。
好了,P&O的内容就讲到这里。这个算法虽然简单,但用好了,在大多数场景下都能达到98%以上的跟踪效率。关键是你要理解它的局限性,然后针对性地做改进。