太阳能充电控制器 DIY:PWM vs MPPT 方案对比与实战制作

太阳能板越来越便宜,但直接接电池充电可不是好主意。电压不稳、过充过放、能量浪费——这些问题都需要一个靠谱的充电控制器来解决。今天我们从原理到实战,把太阳能充电控制器这件事讲透。

PWM vs MPPT:到底选哪个?

这是太阳能充电领域最经典的问题。简单说:

PWM(脉宽调制):相当于一个快速开关,控制太阳能板向电池充电的通断时间。结构简单、成本低,但效率一般。

MPPT(最大功率点追踪):实时追踪太阳能板的最大功率输出点,通过 DC-DC 变换器高效转换能量。效率高 20%~30%,但电路复杂、价格贵。

对比项 PWM MPPT
转换效率 60%~75% 90%~98%
成本 ¥20~50 ¥100~500+
电路复杂度
低温/阴天表现 一般 明显更好
DIY 难度 ★★☆☆☆ ★★★★☆

我的建议:如果你用的是 12V 小系统(太阳能板 20W 以下),PWM 够用。超过 20W 或者想最大化利用太阳能,MPPT 值得投资。

方案一:PWM 充电控制器 DIY

PWM 方案的核心思路很简单——用 MOSFET 做开关,MCU 控制占空比,根据电池电压调整充电状态。

硬件清单

元件 型号 数量 参考价格
主控 MCU STM32F030C8T6 1 ¥8
功率 MOSFET IRFZ44N (N 沟道) 1 ¥2
肖特基二极管 1N5819 1 ¥0.5
电压分压电阻 100kΩ + 10kΩ 2 ¥0.2
电流采样电阻 0.1Ω/5W 1 ¥1
电解电容 100μF/25V 2 ¥1
陶瓷电容 0.1μF 3 ¥0.3
LED 指示灯 红色/绿色/蓝色 3 ¥0.5
PCB 板 自制或嘉立创 1 ¥5
接线端子 XT60 公母头 1 对 ¥2

总成本:约 ¥20

电路原理

太阳能板 → 肖特基二极管 → MOSFET → 电池

  太阳能板(18V)
      │
      ├─ 1N5819 (防反接)
      │
      ├─ MOSFET IRFZ44N (开关控制)
      │     │
      │     ├─ 电池(12V 铅酸/锂电)
      │     │
      │     └─ 电压采样 (100k/10k 分压)
      │
      └─ 电流采样 (0.1Ω 串联)
            │
            └─ STM32 ADC 采集

充电三阶段控制

铅酸电池(12V)的充电曲线是固定的三个阶段:

// PWM 充电控制器 - STM32 核心代码
#include "stm32f0xx.h"

#define BULK_VOLTAGE    14400   // 14.4V (bulk 阶段,单位 mV)
#define ABSORPTION_V    13800   // 13.8V (吸收阶段)
#define FLOAT_VOLTAGE   13200   // 13.2V (浮充阶段)
#define LOW_CUTOFF      11500   // 11.5V (欠压保护)

typedef enum {
    CHARGE_BULK,        // 恒流充电
    CHARGE_ABSORPTION,  // 恒压充电
    CHARGE_FLOAT,       // 浮充维护
    CHARGE_OFF          // 停止充电
} ChargeState_t;

static ChargeState_t charge_state = CHARGE_OFF;
static uint16_t battery_voltage = 0;
static uint16_t pwm_duty = 0;

// ADC 读取电池电压(已校准到实际 mV)
uint16_t read_battery_voltage(void) {
    // ADC 读取分压后的电压,乘以分压比还原
    uint16_t adc_val = HAL_ADC_GetValue(&hadc);
    return (adc_val * 15000UL) / 4095 * 11;  // 分压比 11 倍
}

// 充电状态机
void charge_controller(void) {
    battery_voltage = read_battery_voltage();

    switch (charge_state) {
        case CHARGE_BULK:
            // 电池电压低于 bulk 电压,全功率充电
            if (battery_voltage < BULK_VOLTAGE) {
                pwm_duty = 100;  // 100% 占空比
            } else {
                charge_state = CHARGE_ABSORPTION;
            }
            break;

        case CHARGE_ABSORPTION:
            // 恒压阶段,维持电压在吸收电压
            if (battery_voltage > ABSORPTION_V) {
                pwm_duty -= 2;  // 逐步减小占空比
            } else if (battery_voltage < ABSORPTION_V - 200) {
                pwm_duty += 2;
            }
            // 充电电流 < 额定电流 3% 持续 2h,进入浮充
            break;

        case CHARGE_FLOAT:
            // 浮充阶段,维持电池满电状态
            if (battery_voltage < FLOAT_VOLTAGE - 100) {
                pwm_duty = 5;
            } else {
                pwm_duty = 0;
            }
            break;

        case CHARGE_OFF:
            // 欠压保护或无光照
            pwm_duty = 0;
            if (battery_voltage > LOW_CUTOFF && solar_panel_voltage() > 13000) {
                charge_state = CHARGE_BULK;
            }
            break;
    }

    // 更新 PWM 输出
    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 
                          pwm_duty * (TIM1->ARR / 100));
}

方案二:MPPT 充电控制器 DIY

MPPT 的核心是一个 DC-DC Buck 变换器,加上一个追踪算法。电路复杂不少,但效率提升是实打实的。

硬件清单

元件 型号 数量 参考价格
主控 MCU STM32F103C8T6 1 ¥12
同步整流 Buck IC LM5013 1 ¥15
功率电感 47μH/5A 1 ¥3
肖特基二极管 SR560 1 ¥1
输入电容 220μF/50V 2 ¥3
输出电容 470μF/25V 2 ¥2
电压/电流采样 INA219 (I2C) 1 ¥5
MOSFET 驱动 TC4420 1 ¥3
功率 MOSFET AOD2907 (P 沟道) 2 ¥6
PCB 板 嘉立创 4 层板 1 ¥15

总成本:约 ¥65

MPPT 扰动观察法(Perturb & Observe)

这是最常用的 MPPT 算法,原理简单但有效:

// MPPT 扰动观察法核心逻辑
#define VOLTAGE_STEP    50      // 电压扰动步长 (mV)
#define SAMPLE_INTERVAL 100     // 采样间隔 (ms)

static uint16_t prev_voltage = 0;
static uint32_t prev_power = 0;
static int16_t duty_step = VOLTAGE_STEP;

void mppt_algorithm(void) {
    // 读取当前太阳能板电压和电流
    uint16_t v_solar = read_solar_voltage();  // mV
    uint16_t i_solar = read_solar_current();  // mA
    uint32_t power = (uint32_t)v_solar * i_solar / 1000;  // mW

    uint32_t delta_p = power - prev_power;
    int16_t delta_v = v_solar - prev_voltage;

    // 扰动观察逻辑
    if (delta_p > 0) {
        // 功率增加,继续同方向扰动
        if (delta_v > 0) {
            // 电压升高功率增加 → 减小占空比(提高输入电压)
            set_buck_duty(get_buck_duty() - duty_step);
        } else {
            // 电压降低功率增加 → 增大占空比
            set_buck_duty(get_buck_duty() + duty_step);
        }
    } else {
        // 功率下降,反向扰动
        if (delta_v > 0) {
            set_buck_duty(get_buck_duty() + duty_step);
        } else {
            set_buck_duty(get_buck_duty() - duty_step);
        }
    }

    prev_voltage = v_solar;
    prev_power = power;
}

扰动观察法的工作方式

  1. 记录当前功率 P1
  2. 微调 PWM 占空比
  3. 采样新功率 P2
  4. 如果 P2 > P1,说明方向对了,继续同方向调
  5. 如果 P2 < P1,说明调过头了,反向调回来

太阳能板选型建议

控制器选好了,太阳能板怎么选?记住这个公式:

太阳能板功率(W) = 电池容量(Ah) × 电池电压(V) ÷ 有效日照小时数 × 系统效率

以 12V 50Ah 铅酸电池为例:

  • 目标每天充满:50Ah × 12V = 600Wh
  • 有效日照 5 小时(中国大部分地区)
  • 系统效率 75%(含线损、控制器损耗)
  • 需要太阳能板:600Wh ÷ 5h ÷ 0.75 ≈ 160W
应用场景 推荐太阳能板 电池配置 控制器类型
小型传感器节点 5~10W 12V 7Ah 铅酸 PWM
户外监控摄像头 20~50W 12V 20Ah 铅酸 PWM/MPPT
离网小屋 100~200W 12V 100Ah 铅酸 MPPT
房车/船艇 200~400W 12V 200Ah 锂电 MPPT

常见问题排查

1. 充电电流上不去

可能原因

  • 太阳能板被遮挡(树叶、灰尘、鸟粪)
  • 太阳能板角度不对(最佳角度 ≈ 当地纬度)
  • 线径太细导致压降过大

排查步骤

# 用万用表测量太阳能板开路电压(不接电池)
# 12V 板子应该在 18~22V 之间
# 如果只有 10V 以下,板子有问题或被严重遮挡

# 测量充电线压降
# 太阳能板输出端电压 - 控制器输入端电压 = 线损
# 超过 0.5V 就需要换更粗的线

2. 电池充不满

铅酸电池标称 12V,但充满需要达到 13.8V~14.4V 并维持一段时间。如果你的控制器最大输出电压只有 13V,那电池永远充不满。

检查方法:用万用表测电池两端电压,如果长期低于 13.5V,说明充电电压不够。

3. MPPT 控制器在阴天效率反而不如 PWM

这不是 bug,是物理限制。MPPT 的优势在于太阳能板电压远高于电池电压时,能把多余电压"转换"成电流。阴天时太阳能板输出电压本身就低,MPPT 的 DC-DC 变换器还有自身损耗,反而不如 PWM 直接连接效率高。

4. 锂电池 vs 铅酸电池,参数设置不同

参数 12V 铅酸 12V 锂电(4S)
Bulk 电压 14.4V 16.8V
吸收电压 13.8V 16.8V
浮充电压 13.2V 14.6V
欠压保护 11.5V 12.0V
最大充电电流 0.1C~0.25C 0.5C~1C

⚠️ 警告:锂电池必须搭配 BMS(电池管理系统)使用!充电控制器只管充电曲线,BMS 负责最后一道安全防线。两者缺一不可。

总结

需求 推荐方案 预算
简单项目/预算有限 PWM DIY ¥20~50
中等功率/追求效率 MPPT DIY ¥65~150
成品稳定/不想折腾 购买成品 MPPT ¥100~300

DIY 太阳能充电控制器的价值不在于省钱(买成品可能更划算),而在于你真正理解了太阳能系统的每一个环节。下次遇到充电问题,你知道该查哪里、怎么调。

希望这篇博客文章对您有所帮助!