Charger v1
Экспериментальное четырёхканальное интеллектуальное зарядное устройство на Arduino Mega 2560. Полное описание прошивки: распиновка, регулятор, профили заряда, защиты.
Обзор
Charger v1 создан как инженерный стенд для разработки алгоритмов заряда, измерения параметров аккумуляторов и тестирования различных химических типов элементов.
Каждый канал имеет отдельное измерение напряжения, тока и температуры аккумулятора. Управление построено на PWM-регулировке buck-модуля через цепь обратной связи, с режимами предварительного заряда, постоянного тока и постоянного напряжения. Поддерживаются профили для Li-Ion, LiFePO4 и NiMH/NiCd.
Устройство использует два дисплея ST7920, четыре измерительных модуля INA219, NTC-датчики температуры, светодиодную индикацию, звуковое уведомление и автоматическую регулировку яркости.
4 канала Li-Ion LiFePO4 NiMH CC/CV Arduino Mega 2560В архиве проекта доступны исходники, схема подключения, блок-схема и схема инжекции обратной связи buck-модуля.
Перед подключением аккумуляторов обязательны проверка монтажа, калибровка измерений и отдельное тестирование каждого канала.
1Железо одного канала
Комплект повторяется для каждого из 4 каналов.
| Узел | Компонент | Назначение |
|---|---|---|
| Понижающий преобразователь | buck LM2596 / XL4015 (с выведенным FB) | источник регулируемого напряжения |
| Ключ | MOSFET IRLZ44N / AO3400 (logic-level) | разрыв «+» батареи — для замера OCV/-dV и безопасности |
| Измерение V/I | INA219 (шунт 0.1 Ω) | напряжение на батарее и ток заряда |
| Температура | NTC 10k β=3950 + делитель 10k к +5V | контроль перегрева банки |
| Держатель | кроватка 18650 / клеммы | сама батарея |
2Принцип регулирования — инжекция в FB
Ток и напряжение регулируются не «умным» buck-контроллером, а инжекцией потенциала во вход обратной связи (FB) обычного buck-модуля:
Подъём напряжения на FB заставляет buck опускать выход. Зависимость инверсная: ↑PWM → ↓Vout. Знак инверсии учтён в PI-регуляторе (вычитание). PWM_MAX = 255 соответствует минимуму напряжения на выходе — безопасное состояние по умолчанию.
3Распиновка Arduino Mega 2560
Каналы заряда — 4 линии на канал
| Канал | PWM→FB | MOSFET EN | NTC (ADC) | INA219 addr |
|---|---|---|---|---|
| Ch1 | D5 OC3A | D32 | A0 | 0x40 |
| Ch2 | D2 OC3B | D33 | A1 | 0x41 |
| Ch3 | D3 OC3C | D34 | A2 | 0x44 |
| Ch4 | D6 OC4A | D35 | A3 | 0x45 |
Адреса INA219 задаются перемычками A0/A1 на модулях. MOSFET EN = HIGH → ток идёт в батарею.
Дисплеи ST7920 128×64 (программный SPI)
(clock, data, cs, reset): E=SCLK, RW=MOSI, RS=CS.| Дисплей | SCK (E) | MOSI (RW) | CS (RS) | RESET | Каналы |
|---|---|---|---|---|---|
| Display 0 | D48 | D47 | D46 | D8 | Ch1, Ch2 |
| Display 1 | D52 | D51 | D53 | D7 | Ch3, Ch4 |
PSB = GND (режим SPI). Подсветка BLA обоих дисплеев → D9 (ШИМ, через транзистор, не напрямую).
Шина I²C · 100 кГц
SDA = D20 SCL = D21
Общие для 4× INA219 + VEML7700 (0x10).
Питание
- +5V шина ≥ 1 А — Mega + все модули
- +6…12V — вход VIN buck-ов (≈1.5 А/канал)
- Общая земля Mega / buck / батарей — обязательна
UI и индикация
| Функция | Пин | Примечание |
|---|---|---|
| Кнопка MODE | D30 | INPUT_PULLUP, кнопка на GND |
| Кнопка START | D31 | INPUT_PULLUP, кнопка на GND |
| Buzzer | D12 | перенесён с D9 |
| Backlight ST7920 | D9 | analogWrite (ШИМ) |
| LED READY (зелёный) | D10 | → 330Ω → LED → GND |
| LED FAULT (красный) | D11 | → 330Ω → LED → GND |
LED-панель — 8 светодиодов, порт PA
D22–D29 = G G B B Y Y R R, каждый через 330Ω на GND. Пары R2 R1 Y2 Y1 B2 B1 G2 G1 образуют «SoC-бар» выбранного канала, заполняемый справа-налево (красный → зелёный).
4ШИМ-настройки (быстрый PWM)
- Timer3 (D2/D3/D5) и Timer4 (D6): Fast PWM 8-bit, non-inverting, prescaler /1 → ≈62.5 кГц.
- Timer0 не трогается —
millis()/delay()работают штатно. - Значения пишутся напрямую в регистры
OCR3AL/BL/CL,OCR4ALчерезsetPwmFast(). - Высокая частота даёт ripple ≈1 мВ после RC-фильтра.
5Конечный автомат заряда (на канал)
Литий:
NiMH:
| Состояние | Что делает |
|---|---|
IDLE | ждёт START, MOSFET разомкнут |
CHECK | размыкает ключ, читает OCV, проверяет присутствие/переполюсовку, оценивает стартовый SoC |
PRECHARGE | trickle 10% тока, пока V < v_precharge (реанимация глубокого разряда) |
CC | постоянный ток = уставке (PI по току) до V_max |
CV | постоянное напряжение V_max, пока ток не упадёт ниже i_term_pct |
NIMH_CC | только CC + мониторинг -dV / dT/dt |
TERM_CHECK | раз в минуту размыкает ключ, читает OCV для детекта -dV |
DONE | заряд завершён, рассчитывается ёмкость |
FAULT | авария; автосброса нет — оператор жмёт START |
PI-регулятор
Единый для тока и напряжения. Анти-виндап интеграла, ограничение ±1000, rate-limit 5 шагов PWM за итерацию (защита от токовых спайков при входе в CC).
Оценка ёмкости
По мА·ч и стартовому SoC (таблица OCV): Cap ≈ mAh·100/(100−SoC). При SoC>30% — грубая («~»), при ≥90% не считается.
6Профили химий
Значения на одну банку (1S).
| Параметр | Li-Ion | LiFePO4 | NiMH |
|---|---|---|---|
| V_max (CV) | 4.20 В | 3.55 В | 1.55 В (лимит) |
| V_precharge | 3.00 В | 2.50 В | 0.90 В |
| Ток precharge | 10% | 10% | 20% |
| Ток окончания CV | 5% | 7% | — (нет CV) |
| -dV | — | — | 10 мВ |
| dT/dt | — | — | 1 °C/мин |
| Таймаут | 240 мин | 240 мин | 300 мин |
| Reverse | <100 мВ | <100 мВ | <100 мВ |
Ток заряда выбирается кнопкой из списка: 500 / 1000 мА (I_TARGET_LIST_MA).
7Защиты
Проверяются на каждом шаге автомата.
- WDT 4 сек —
wdt_enable(WDTO_4S) - Перенапряжение: V > V_max + 100 мВ →
F_OVERVOLT - Жёсткая отсечка тока: I > 1500 мА →
F_OVERCURRENT - Температура: T > 45 °C →
F_TEMP_HIGH - Температура: T < 0 °C →
F_TEMP_LOW(гистерезис 3°) - Обрыв NTC (ADC <20 или >1000) →
F_NTC_OPEN
- Переполюсовка (OCV < v_reverse) →
F_REVERSE - Батарея снята (V < 500 мВ) →
F_NO_BATTERY - Таймаут профиля →
F_TIMEOUT - Потеря INA219 →
F_INA_LOST - PWM упёрся в границу >5 сек при большой ошибке →
F_LOOP_STUCK - MOSFET разомкнут во всех состояниях кроме PRECHARGE/CC/CV/NIMH_CC
8Измерения
- INA219: калибровка 32V/2A (100 мкА/бит), IIR-фильтр EMA
y += (x−y)/4для V и I. - NTC → °C: β-уравнение,
R_ntc = 10k·ADC/(1023−ADC), результат в °C×10, доп. сглаживание(old·3+new)/4. - OCV: размыкает MOSFET, 200 мс релаксации, читает VBUS. Обратно ключ не включает — это делает автомат.
9Интерфейс
Экраны: Display 0 — каналы 1/2 (верх/низ), Display 1 — каналы 3/4. На канал: имя+химия+ток, крупно V/A, состояние/T/накопленные мА·ч, прогресс-бар.
Кнопка MODE (D30)
- короткое — переключение канала 1→2→3→4
- длинное — вход/выход edit (в IDLE/DONE/FAULT)
- в edit коротко — след. поле (химия → ток → выход)
Кнопка START (D31)
- короткое — START/STOP канала
- в edit — изменение значения поля
Звук: короткий писк — переключение; писк — START/STOP; длинный — DONE; короткий — FAULT.
Автояркость: VEML7700 читается раз в 1 с; подсветка плавно подъезжает к цели по освещённости (в темноте — минимум 20/255, при комнатном свете — максимум).
10Замечания по сборке
- MOSFET обязательно logic-level (Vgs(th) < 3 В), иначе не откроется от 5 В.
- Подстроить резистор инжекции: PWM 30…220 → выход buck 3.0…4.3 В (для 18650) — запас регулирования.
- Проверка при первом запуске по Serial (115200): 4×
INA[x] OK+VEML OK. - При PWM=255 выход buck ≤ 3 В, при PWM=0 — максимум (~4.3–4.5 В).
- PSB дисплеев на GND, общая земля обязательна.