METEO LAB · ПРОЕКТ

Charger v1

Экспериментальное четырёхканальное интеллектуальное зарядное устройство на Arduino Mega 2560. Полное описание прошивки: распиновка, регулятор, профили заряда, защиты.

Проект в стадии разработки. Это экспериментальная инженерная разработка лаборатории NARMOVION, а не законченный продукт. Возможны ошибки, изменения и неполная функциональность; использование — на свой риск.
Charger v1 experimental prototype
🔋

Обзор

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/IINA219 (шунт 0.1 Ω)напряжение на батарее и ток заряда
ТемператураNTC 10k β=3950 + делитель 10k к +5Vконтроль перегрева банки
Держателькроватка 18650 / клеммысама батарея

2Принцип регулирования — инжекция в FB

Ток и напряжение регулируются не «умным» buck-контроллером, а инжекцией потенциала во вход обратной связи (FB) обычного buck-модуля:

PWM (Mega)→ RC-фильтр 1kΩ + 100nF→ резистор инжекции 10kΩ→ FB buck-модуля

Подъём напряжения на FB заставляет buck опускать выход. Зависимость инверсная: ↑PWM → ↓Vout. Знак инверсии учтён в PI-регуляторе (вычитание). PWM_MAX = 255 соответствует минимуму напряжения на выходе — безопасное состояние по умолчанию.

Настройка при сборке: подобрать резистор инжекции так, чтобы диапазон PWM 30…220 давал выход buck 3.0…4.3 В (для 18650) — это обеспечивает запас регулирования.

3Распиновка Arduino Mega 2560

Каналы заряда — 4 линии на канал

КаналPWM→FBMOSFET ENNTC (ADC)INA219 addr
Ch1D5 OC3AD32A00x40
Ch2D2 OC3BD33A10x41
Ch3D3 OC3CD34A20x44
Ch4D6 OC4AD35A30x45

Адреса INA219 задаются перемычками A0/A1 на модулях. MOSFET EN = HIGH → ток идёт в батарею.

Дисплеи ST7920 128×64 (программный SPI)

У ST7920 сигналы называются иначе, а порядок в конструкторе U8g2 — (clock, data, cs, reset): E=SCLK, RW=MOSI, RS=CS.
ДисплейSCK (E)MOSI (RW)CS (RS)RESETКаналы
Display 0D48D47D46D8Ch1, Ch2
Display 1D52D51D53D7Ch3, 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 и индикация

ФункцияПинПримечание
Кнопка MODED30INPUT_PULLUP, кнопка на GND
Кнопка STARTD31INPUT_PULLUP, кнопка на GND
BuzzerD12перенесён с D9
Backlight ST7920D9analogWrite (ШИМ)
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-бар» выбранного канала, заполняемый справа-налево (красный → зелёный).

PWM (Timer3/4) ADC (NTC) I²C SW SPI +5V / питание

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Конечный автомат заряда (на канал)

Литий:

IDLE→CHECK→ PRECHARGE→CC→ CV→DONE

NiMH:

IDLE→CHECK→ NIMH_CC⇄TERM_CHECK→ DONE
СостояниеЧто делает
IDLEждёт START, MOSFET разомкнут
CHECKразмыкает ключ, читает OCV, проверяет присутствие/переполюсовку, оценивает стартовый SoC
PRECHARGEtrickle 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-IonLiFePO4NiMH
V_max (CV)4.20 В3.55 В1.55 В (лимит)
V_precharge3.00 В2.50 В0.90 В
Ток precharge10%10%20%
Ток окончания CV5%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Замечания по сборке

  1. MOSFET обязательно logic-level (Vgs(th) < 3 В), иначе не откроется от 5 В.
  2. Подстроить резистор инжекции: PWM 30…220 → выход buck 3.0…4.3 В (для 18650) — запас регулирования.
  3. Проверка при первом запуске по Serial (115200): 4× INA[x] OK + VEML OK.
  4. При PWM=255 выход buck ≤ 3 В, при PWM=0 — максимум (~4.3–4.5 В).
  5. PSB дисплеев на GND, общая земля обязательна.
← В лабораторию