太阳能板越来越便宜,但直接接电池充电可不是好主意。电压不稳、过充过放、能量浪费——这些问题都需要一个靠谱的充电控制器来解决。今天我们从原理到实战,把太阳能充电控制器这件事讲透。
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;
}
扰动观察法的工作方式:
- 记录当前功率 P1
- 微调 PWM 占空比
- 采样新功率 P2
- 如果 P2 > P1,说明方向对了,继续同方向调
- 如果 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 太阳能充电控制器的价值不在于省钱(买成品可能更划算),而在于你真正理解了太阳能系统的每一个环节。下次遇到充电问题,你知道该查哪里、怎么调。
希望这篇博客文章对您有所帮助!