9V 镍氢电池智能充电器 V1:Arduino + MCP4725 DAC + LM317 恒流控制
设计初衷与定位
市面 9V 充电器多为“定压/定时”简易方案,极易过充损伤电池。本项目实现 **CC(恒流)→ -ΔV/dt 终止 → 微充 (C/40) → 定时切断** 完整充电曲线,硬件成本 < ¥100,固件开源,适合电池维护爱好者、DIY 仪器供电模块二次开发。**仅验证过 7 节串联 9V NiMH(170 mAh),其他规格需修改参数并自行验证。**
核心硬件架构
| 模块 | 关键器件 | 功能 |
|---|---|---|
| 主控 | Arduino UNO | ADC 采样、状态机、I²C 控制 DAC |
| DAC | MCP4725 (12-bit, I²C, 0~5V) | 输出控制电压,经运放放大驱动 LM317 |
| 运放 | LM358 (双路) | 增益 3.06×,将 0~5V → 0~15.3V |
| 稳压/恒流 | LM317 (TO-220 + 散热片) | 可调稳压器,ADJ 引脚接运放输出,OUT 接电池+ |
| 采样电阻 | 10 Ω / 1% / 1W | 串联电池回路,电压降 = 电流 × 10 Ω |
| 电压分压 | 5.1 kΩ / 20 kΩ (1%) | 电池电压 ÷5 送 ADC (A0),量程 0~16.2V |
| 电流采样 | 采样电阻两端 → A2 | 直接读取压降,I = V / 10 Ω |
| 隔离继电器 | 5V 线圈,常开触点 | 充电结束/异常物理断开电池 |
| 显示 | I²C LCD1602 (YwRobot, 0x27) | 实时显示电压、电流、时间、充入容量 |
| 供电 | 17V/2A DC 适配器 | 满足 LM317 压降 + 采样电阻压降 + 电池端电压 |
电路原理框图
17V DC ──┬──→ LM317 IN
│
├──→ SparkFun 5V/3.3V 面包板电源 → MCP4725, LCD, Arduino
│
└──→ (备用)
LM317 OUT ── 10Ω (R_sense) ──┬── Relay NO ── Battery +
│
A2 (Arduino) // 电流采样
│
5.1k / 20k 分压
│
A0 (Arduino) // 电池电压采样
LM317 ADJ ← LM358 OUT (Gain 3.06) ← MCP4725 OUT (I²C)
充电算法状态机
enum State {
INIT, NO_BATT, BATT_CONNECTED, BATT_LOW,
CURRENT_RAMP_UP, CHARGING, CURRENT_RAMP_DOWN,
TRICKLE, END_TRICKLE,
FAULT_OVERCURRENT, FAULT_OVERVOLTAGE, FAULT_REGULATION, DONE
};
// 关键参数(charger.ino 宏定义区)
float TARGET_CURRENT_mA = 30; // 恒流充电电流 (0.1C~1C)
float BATT_CAPACITY_mAh = 170; // 标称容量
float MAX_TRICKLE_MIN = 6; // 最大微充分钟数
float TRICKLE_RATIO = 40; // 微充电流 = C/40
核心流程
- 上电自检:DAC 输出 0V,继电器断开,读取电池电压。< 7V 判定为过放拒充。
- 电流爬升:DAC 电压以 1 mV/步 (≈3 mV @LM317 ADJ) 递增,直到采样电流 ≥ 目标电流。
- 恒流充电:PID 思想微调 DAC 维持电流,每分钟记录电压均值,线性拟合斜率
dV/dt。**连续 5 分钟斜率 < 0 判定 -ΔV 峰值,终止快充。** - 电流下坡 → 微充:电流降至 C/40 (4.25 mA),进入计时微充。
- 超时/异常保护:过压 (>15V)、过流 (>200mA)、调节失控 (|I_target - I_actual| > 5mA) 均立即断开继电器进故障态。
固件模块化文件结构
charger.ino:主状态机、参数定义、LCD 刷新hw.ino:ADC 平均滤波、DAC 写入、继电器驱动、硬件保护中断calculations.ino:最小二乘线性拟合best_linear_fit()计算 dV/dtlcd.ino:双行显示缓存防闪烁、状态文本生成main.ino:setup()/loop()入口
关键代码片段:dV/dt 终止判定
// 每秒采样一次电压存入 sec_log[60]
// 每分钟计算均值存入 min_log[5] (滑动窗口 5 分钟)
float best_linear_fit(float y[5]) {
float sx=0, sy=0, sxx=0, sxy=0;
for (int i=0;i<5;i++) { sx+=i; sy+=y[i]; sxx+=i*i; sxy+=i*y[i]; }
float delta = 5*sxx - sx*sx;
return (5*sxy - sx*sy) / delta; // 返回斜率 V/min
}
// 在 CHARGING 状态中:
float slope = best_linear_fit(min_log);
if (slope < 0) { state = FULLY_CHARGED; } // 检测到负斜率 → 峰值通过
实测数据与波形
- 30 mA 恒流充 170 mAh 电池:快充约 5.5 小时,充入 ~165 mAh,效率 97%。
- 终止电压约 9.8 V (7×1.4 V),微充 6 分钟额外充入 ~0.4 mAh。
- 全程电池表面温升 < 5°C,无鼓包、漏液。
安全警示(必读)
1. 镍氢电池过充会析气增压、甚至爆炸起火,**全程不可离人**。
2. 17V 直流虽低压,但短路电流大,接线前必查万用表。
3. 碱性/锂电/铅酸**严禁**接入此充电器,化学体系不兼容。
4. 代码含已知 Bug(如
elapsedMillis 库依赖、字符串处理内存碎片),**仅供学习参考,量产需重写**。5. 作者明确声明:“因设计或代码缺陷造成任何损害,概不负责。”
V2 规划功能
- 放电容量测试(恒流放电至 1.0V/节)。
- 循环寿命测试(自动充放电计数)。
- 温度监测 (NTC) + dT/dt 终止双重保护。
- 移植 ESP32 + Web 界面 + 数据记录 CSV。
- 支持 6/8 节可配置、自动识别节数。
一句话总结:Arduino + MCP4725 + LM317 实现 9V NiMH 电池 CC/-ΔV/微充全流程智能充电,开源固件模块化清晰,是学习模拟充电控制、DAC 闭环调节、电池特性分析的极佳实战案例——但切记安全红线。
制造工艺
- 智能缺水报警器 – DIY植物土壤湿度监测装置
- 意大利语单词时钟:Arduino Nano + NeoPixel 144 灯珠 + LCD + RTC 打造
- 仅用 3 根模拟口驱动 4×3 矩阵键盘:电阻分压识别键值
- 基于Arduino MKR Fox 1200构建可靠Sigfox千瓦时电表
- 蓝牙温度监测仪:Arduino Nano + NTC 热敏电阻 + HC-06 无线传输
- 非接触手势门锁:APDS-9960 + Arduino 实现安全门禁
- Arduino Nano 多功能伴侣套件 —— 电阻/电容测量、二极管测试、RTC时钟一体化
- Arduino Micro/Leonardo USB MIDI 适配器套件 —— 完整元件清单与固件指南
- 为Arduino构建隔离模拟输入电路
- RGB 32 频段音频频谱可视化器:Arduino Nano 驱动 WS2812B 8×32 LED 矩阵
- 两个电阻自制 Arduino UNO 视频输出线(RCA/TVout)
- Arduino UNO 精准视觉反应时间测试仪