Найти тему
Мастерю понемногу.

Умный зарядник автомобильных аккумуляторов на Ардуино. Разработка часть 3. Программа.

Настало время описать самую сложную и долгую часть моей разработки. Многие алгоритмы менялись по нескольку раз и переписывались заново с нуля. В этой статье я постараюсь упорядочить логику работы программы и описать как работают все ее модули.

Самое основное что мне нужно от такого зарядника - это контролировать ток, напряжение и подсчет затраченных ампер-часов на заряд/разряд, завершать заряд/разряд аккумулятора когда он зарядится/разрядится. В дополнительных настройках можно устанавливать параметры заряда, дозаряда, разряда, хранения на свое усмотрение. Несколько режимов заряда аккумулятора:

1) Заряд - простой заряд аккумулятора со стабилизацией тока до напряжения 14,7В. Дальнейшая стабилизация по напряжению 14,7В со снижением тока до минимального и отключение заряда.

2) Заряд -> Дозаряд - сперва происходит заряд как в п. 1, далее включается Дозаряд.

3) Заряд по Бранимиру - заряд аккумулятора малыми токами по инструкции от Бранимира. Инструкция довольно большая, но если в кратце то заряд происходит малыми токами 1-2% от емкости аккумулятора (60А/ч - 0,6-1,2А). Когда напряжение достигнет 14,7В засекается время и по истечении 20 часов включается заряд повышенным напряжением без ограничения и током 2-3% от емкости аккумулятора (60А/ч - 1,2-1,8А) в течении часа для перемешивания электролита, после напряжение снова ограничивается до 14,7В. И так каждые 20 часов до тех пор пока ток заряда не упадет до 0,1% от от емкости аккумулятора (60А/ч - 0,06мА). Этот метод очень длительный, аккумулятор может стоять на заряде 5-7 дней, зато позволяет растворять застарелые сульфаты.

4) Дозяряд - заряд аккумулятора со стабилизацией тока до напряжения 16,3В. Дальнейшая стабилизация по напряжению 16,3В со снижением тока до минимального и отключение заряда. В этом режиме включаются несколько условий по контролю напряжения и тока: а) если напряжение достигло 16,3В и ток начал снижаться, остановился и начал увеличиваться то отключить заряд; б) если напряжение достигло 16,3В и ток не меняется в течении двух часов то завершить заряд; в) если напряжение не может достигнуть 16,3В (например зависает на 15,8В) то данное напряжение установить максимальным, если ток не уменьшается то по истечении двух часов завершить заряд.

5) Разряд - разряд аккумулятора, по умолчанию, происходит по инструкции Бранимира, то есть малым током. Сперва измеряется внутреннее сопротивление и в зависимости от его величины устанавливается ток разряда 1-3% от емкости аккумулятора (60А/ч: 0,6-1,8А), чем меньше сопротивление тем больше ток разряда. Разряд продолжается до напряжения 11,6В или до срыва напряжения (когда напряжение резко падает). Если отскок напряжения, через 5-15 мин., более 0,3В, снова включается разряд, но ток разряда уменьшается. Осуществляется подсчет слитых А/ч, Вт/ч. При достижении 12В рассчитывается текущая емкость аккумулятора в процентах.

6) Хранение - после окончания заряда, дозаряда включается режим хранения. Отслеживается напряжение на аккумуляторе и при снижении до 12,7В вкючается заряд малым током 2% от емкости до 14,4В. При снижении тока менее 0,7% от емкости заряд отключается.

Работа программы начинается с подключения необходимых библиотек:

- <Wire.h> - библиотека Wire используется для связи микроконтроллера с устройствами и модулями через интерфейс I2C

- <INA226.h> - библиотека для работы с модулем INA226

- <LiquidCrystal_I2C.h> - библиотека для работы с дисплеем по I2C.

- "GyverButton.h" - библиотека работы с кнопками от AlexGyver (https://alexgyver.ru/lessons/gyverlibs/).

- <EncButton.h> - библиотека работы с энкодером от AlexGyver (https://alexgyver.ru/lessons/gyverlibs/).

Далее инициализируется структура переменных для сохранения в постоянной памяти ардуино (третий рисунок). Здесь сохраняются все параметры работы программы.

В блоке Setup :

- устанавливается частота ШИМ заряда - 31,4кГц (частота может быть другая в зависимотсти от применяемого дроселя - 2, 4, 8, 31.4, 62,5кГц).

- инициализапия пинов : 3,11 - выход ШИМ сигнала; 2,4,5,6 - подтянутый к питанию вход (кнопки); 7,8,12 - подтянутый к питанию вход (энкодер); 13 - вход (сигнал превышения тока от INA226); А6 - аналоговый вход датчика температуры, А7 - аналоговый вход (напряжение на входе зарядника).

- установка времени долгого удержания кнопок Старт, +,-, Стоп - 1 секунда.

- запуск таймера времени подсветки дисплея.

- вывод на дисплей названия и версии прошивки.

- чтение блока данных из памяти.

- проверка на корректное завершение заряда. Если заряд прерван некорректно (отключение электроэнергии, сбой программы, ручное прерывание заряда), то заряд будет продолжен с того места и с теми параметрами с которыми произошло прерывание заряда. При этом дается 10 секунд что бы отключить заряд вручную если он не требуется. Если заряд завершен корректно то переход в основное меню.

- установка параметров работы INA226: ina.configure(INA226_AVERAGES_128, INA226_BUS_CONV_TIME_1100US, INA226_SHUNT_CONV_TIME_1100US, INA226_MODE_SHUNT_BUS_CONT);

ina.calibrate(0.0106, 8); // Calibrate INA226. Rshunt = 0.01 ohm, Max excepted current = 8A - устанавливается сопротивление шунта и максимального тока заряда.

Далее программа переходит в блок Меню где выставляются необходимые параметры заряда. Как минимум достаточно установить емкость аккумулятора в Ач и напряжение. Режим "Заряд" выставлен по умолчанию. Все настройки рассчитаются автоматически. Их можно просмотреть и изменить в "Дополнительных настройках". Удерживание кнопки Старт в течении 1 секунды запускает заряд. В "Дополнительных настройках" можно сбросить все параметры по умолчанию которые установлены для аккумулятора на 60А/ч.

При нажатии Кнопки Старт программа переходит в блок выбора режима заряда, разряда, дозаряда, хранения. Включаются в работу нужные функции. Каждые 10 минут сохраняются все параметры в памяти. Поэтому при каком либо сбое работа зарядника осуществляется с того места где завершилась.

Функция заряда.

Основная функция которая осуществляет заряд, дозаряд аккумулятора. Здесь осуществляется контроль напряжения и тока (с помощью соответствующей функции), защита от перенапряжения, большого тока и КЗ (с помощью соответствующей функции), контроль времени заряда, подсчет залитых ампер-часов, ватт-часов. Вывод информации на дисплей 16*2 символов. Отключить заряд или поставить на паузу с сохранением данных в памяти. Заряд в режиме "качели" - когда напряжение достигло максимального (14,7В) а ток снизился менее 1% от емкости заряд отключается, напряжение на аккумуляторе начинает падать, когда напряжение стабилизируется снова включается заряд и так по кругу. В режиме Дозаряд "качели" не работают.

https://yadi.sk/d/0v9DMgxXemFbEQ Ссылка на каталог Яндекс диска с исходником программы, и дополнительными библиотеками. Программа еще в бета версии, дорабатывается, содержит ошибки, но вполне пригодна для работы.

Для более быстрой работы программы и более компактного кода я использую GYVERCORE – ЛЁГКОЕ ЯДРО ДЛЯ ARDUINO https://alexgyver.ru/lessons/gyvercore-doc/