4、MPPT算法实现(一):固定步长扰动观察法的C语言伪代码实现
本节我们将进入MPPT算法的具体实现环节。扰动观察法(Perturb & Observe, P&O)是工程中最常用的MPPT算法之一,其核心思想是:通过周期性地对光伏组件的工作电压施加一个微小的扰动(增加或减少),然后观察扰动前后输出功率的变化方向,从而决定下一次扰动的方向。
4.1 算法逻辑与判断规则
固定步长扰动观察法的判断逻辑非常直观,可以用以下规则概括:
- 规则1:如果扰动后功率增加(P_new > P_old),且扰动方向为电压增加(V_new > V_old),则说明当前工作点位于最大功率点(MPP)左侧,应继续增加电压。
- 规则2:如果扰动后功率增加(P_new > P_old),且扰动方向为电压减小(V_new < V_old),则说明当前工作点位于MPP右侧,应继续减小电压。
- 规则3:如果扰动后功率减小(P_new < P_old),且扰动方向为电压增加,则说明扰动方向错误,应反向扰动(减小电压)。
- 规则4:如果扰动后功率减小(P_new < P_old),且扰动方向为电压减小,则说明扰动方向错误,应反向扰动(增加电压)。
- 规则5:如果功率不变(P_new == P_old),则保持当前电压不变。
上述规则可以简化为一个核心判断:比较功率变化量ΔP与扰动方向的关系。若ΔP与扰动方向同号,则继续同向扰动;若异号,则反向扰动。
4.2 C语言伪代码实现
以下代码展示了固定步长扰动观察法的核心逻辑。我们假设系统已经完成了ADC采样,并得到了当前时刻的电压V_now和电流I_now。步长step_size是一个固定的电压增量值(例如0.5V或1V)。
/* ============================================================
* 文件名: mppt_pando.c
* 功能: 固定步长扰动观察法MPPT算法实现
* 说明: 该伪代码展示了单次MPPT计算周期内的逻辑
* ============================================================ */
/* 全局变量(需在初始化时赋值) */
float V_old = 0.0f; /* 上一次的电压采样值 */
float P_old = 0.0f; /* 上一次的功率计算值 */
float V_ref = 0.0f; /* 当前MPPT输出的参考电压(给控制环路) */
int direction = 1; /* 扰动方向:+1表示增加电压,-1表示减小电压 */
/* 固定步长参数(根据系统设计调整) */
#define STEP_SIZE_VOLT 0.5f /* 电压扰动步长,单位:伏特 */
/* ============================================================
* 函数: MPPT_PandO_Update
* 输入: V_now - 当前采样电压 (V)
* I_now - 当前采样电流 (A)
* 输出: 无(更新全局变量 V_ref)
* 功能: 执行一次扰动观察法MPPT计算
* ============================================================ */
void MPPT_PandO_Update(float V_now, float I_now)
{
float P_now; /* 当前功率 */
float delta_P; /* 功率变化量 */
float delta_V; /* 电压变化量 */
/* 步骤1:计算当前功率 */
P_now = V_now * I_now;
/* 步骤2:计算功率变化量 */
delta_P = P_now - P_old;
/* 步骤3:计算电压变化量(用于判断扰动方向) */
delta_V = V_now - V_old;
/* 步骤4:根据功率变化和扰动方向,决定下一次扰动方向 */
if (delta_P > 0.0f)
{
/* 功率增加:保持当前扰动方向 */
/* direction 保持不变 */
}
else if (delta_P < 0.0f)
{
/* 功率减小:反转扰动方向 */
direction = -direction;
}
else
{
/* 功率不变:保持当前方向(或不做任何操作) */
/* direction 保持不变 */
}
/* 步骤5:根据扰动方向,更新参考电压 */
V_ref = V_ref + (direction * STEP_SIZE_VOLT);
/* 步骤6:更新历史值,为下一次计算做准备 */
V_old = V_now;
P_old = P_now;
/* 注意:实际应用中可能需要增加限幅保护,防止V_ref超出安全范围 */
/* if (V_ref > V_MAX) V_ref = V_MAX; */
/* if (V_ref < V_MIN) V_ref = V_MIN; */
}
4.3 关键点说明
| 关键点 | 说明 |
|---|---|
| 采样同步性 | 电压和电流采样必须在同一时刻完成,否则计算出的功率会引入相位误差。通常使用ADC的同步采样模式或双采样保持器。 |
| 功率计算精度 | 建议使用浮点数(float)进行计算,避免定点数截断误差导致误判。如果资源受限,可考虑Q格式定点运算。 |
| 扰动步长选择 | 步长越大,跟踪速度越快,但稳态振荡幅度也越大。步长越小,稳态精度越高,但跟踪速度变慢。需要根据光伏组件特性和应用场景折中。 |
| 历史值更新 | 注意:V_old和P_old存储的是上一次采样时刻的电压和功率,而不是上一次的参考电压。这是为了准确计算扰动前后的功率变化。 |
| 启动初始化 | 系统首次运行时,V_old和P_old应初始化为0,direction可初始化为+1(默认向开路电压方向扰动)。首次计算时,delta_P和delta_V可能无意义,但算法会在第一个周期后自动进入正常状态。 |
4.4 算法流程图(文字描述)
- 读取当前电压V_now、电流I_now。
- 计算当前功率P_now = V_now * I_now。
- 计算功率变化量ΔP = P_now - P_old。
- 判断ΔP的符号:
- 若ΔP > 0:保持当前扰动方向不变。
- 若ΔP < 0:反转扰动方向。
- 若ΔP == 0:保持方向不变。
- 更新参考电压:V_ref = V_ref + direction * STEP_SIZE。
- 保存历史值:V_old = V_now, P_old = P_now。
- 返回步骤1,等待下一个MPPT周期。
下一节我们将讨论固定步长扰动观察法的局限性,并引入变步长策略来改善稳态性能。