Тестер аккумуляторов для лотка.

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

Подскажите пожалуйста по схеме и коду коррекции напряжения с помощью TL431

В вашем скетче есть строки

coeff = 512/(float (analogRead(analogV_TL431)));      // считаем коэффициент погрешности опорного напряжения
volt = float (analogRead(analogV))*coeff*5/1024;      // 5В - опорное напряжение

Я так понимаю что ИОН подключенный к выводу А4 всегда будет давать на нем 2.5 вольта независимо от колебания напряжения питания. То есть coeff будет всегда равен 1. 

В чем заключается коррекция? Я тут совсем запутался. 
Мне тоже нужен относительно стабильный источникнапряжения для AVR но как его подключить и запрограммировать корректировку не совсем понимаю. Может подскажите где помотреть почитать, именно подключение к Ардуино, так то схем стабилизаторов на TL431 много, но это не то.

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Если напряжения питания просело или наоборот, поднялось - то analogRead(analogV_TL431) выдаст результат, отличный от 512 (поскольку за 1023 отсчёта АЦП берётся напряжение питания, а оно у нас в момент измерения не обязательно равно 5V). Если Vcc в момент измерения равно пяти - коэффициент будет равен единице, если будет отличаться - коэффициент изменится. Пока я игрался с настройкой он гулял в пределах 0,97-1,05, на нестабильном источнике может и больше.

У человека, который помогал мне с тестом напруга на ТЛке была 2.48, поэтому ему пришлось заменить константу 512 на 510 (сверял по образцовому вольтметру).

Посмотрите ссылки http://arduino.ru/Reference/AnalogReference и http://arduino.ru/Reference/AnalogRead .

Выбор опорного напряжения зависит ещё и от того, до какой величины может изменяться измеряемое АЦП напряжение в Вашем устройстве.

Не обязательно делать коррекцию, как в моём примере (это своего рода костыль). Можно подключить образцовый источник к выводу AREF и в скетче задать analogReference(EXTERNAL), тогда 1023 отсчёта АЦП будут равны подаваемому на данный вывод напряжению. Естественно, подаваемое на AREF напряжение не должно превышать напряжение питания контроллера.

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

tekagi пишет:

Если напряжения питания просело или наоборот, поднялось - то analogRead(analogV_TL431) выдаст результат, отличный от 512 (поскольку за 1023 отсчёта АЦП берётся напряжение питания, а оно у нас в момент измерения не обязательно равно 5V). 

\

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

Схемку такую находил, буду по ней делать. Мне нужно измерение напряжения на батарее LiOn 18650. 

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

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

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

tekagi пишет:
Под литий, наверно, всё же лучше из моего примера.

Да, спасибо, буду пробовать, просто сейчас нет свободной макетки, да и TL431 еще в пути. Надеюсь придут к НГ.

nevkon
Offline
Зарегистрирован: 20.01.2015

Подскажите кому не сложно. Собираюсь делать контроллер разряда батареи для шуруповерта. Хочу чтобы при достижении определенного разряда на какой-либо банке батарея отключалась. С этим сложностей у меня нет - подключаем через делитель и считаем. Также хочется контролировать превышение тока потребления (аккумуляторы 15А). Вот с этим проблема. Если я правильно понял у всех в этой теме расчет производится опираясь на напряжение на банке и известный номинал разрядного сопротивления. У меня же будет плавающее сопротивление (из-за двигателя и ШИМ контроллера в кнопке). Понятно что надо ставить токовый датчик 0.05-0.1Ом (или даже меньше). А дальше как его подключить?

Питаться МК будет от своего аккумулятора напрямую и опорное напряжение будет задавать TL431 в минимальной обвязке - 2.5В.

И не предлагайте купить готовый контроллер заряда/разряда - не нравится мне они. Заряжать аккумуляторы буду через imax b6.

Joiner
Offline
Зарегистрирован: 04.09.2014

Купил давненько у китайцев такую штуку http://www.ebay.com/itm/1-8S-Lipo-Li-ion-Fe-Battery-Voltage-2IN1-Tester-Low-Voltage-Buzzer-Alarm-LCO-/162285261008?hash=item25c8f490d0:g:HSUAAOSwKfVXEE~8

Можно контролировать до 8 банок. На дисплее по очереди высвечивается напряжение на каждой банке (точно не помню, надо посмотреть, может на первой, двух, трех... проверю, напишу если надо). Можно настроить напряжение контроля. При снижении напряжения батарею не отключает, но орет очень громко!

bwn
Offline
Зарегистрирован: 25.08.2014

nevkon пишет:

Также хочется контролировать превышение тока потребления (аккумуляторы 15А). Вот с этим проблема. Если я правильно понял у всех в этой теме расчет производится опираясь на напряжение на банке и известный номинал разрядного сопротивления. У меня же будет плавающее сопротивление (из-за двигателя и ШИМ контроллера в кнопке). Понятно что надо ставить токовый датчик 0.05-0.1Ом (или даже меньше). А дальше как его подключить?

По старой схемотехнике - n-p-n транзистор, эмиттер на -, далее шунт (0,6В), после него база, коллектор вырубает регулирующий элемент. Придется какой то триггер придумывать, чтобы в генератор не превращалось и шунт подгонять под конкретный экземпляр транзистора.
Хотя, при 15А - 9Вт выходит, неплохая печка получиться. Бредс. Ффф топку.((((

nevkon
Offline
Зарегистрирован: 20.01.2015

Согласен про печку. Схему уже нашел так же как и выход из ситуации (пока на стадии обдумывания). Сопротивление будет не более 0.01Ом, так что не более 1Вт планируется и 2Вт резистор тут уже вполне справится с задачей.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

nevkon пишет:

Согласен про печку. Схему уже нашел так же как и выход из ситуации (пока на стадии обдумывания). Сопротивление будет не более 0.01Ом, так что не более 1Вт планируется и 2Вт резистор тут уже вполне справится с задачей.

Привет.

Рекомендую просто оставить контроль банок по напряжению.

Не ставить защиту по току, это нужен дополнительный шунт+ОУ с обвязкой+ключ способный пропустить 15А.

Лично мой шуруповерт даже в диких нагрузках не смог пропустить больше 12-15А  сопротивление обмоток двигателя или проводов является искусственным ограничителем тока!

 

nevkon
Offline
Зарегистрирован: 20.01.2015

Ну можно и так поступить, пока без контроля тока, но схема действительно найдена на LM358.

У меня тут еще одна проблема нарисовалась. Лучше объясню с начала. Хочу в корпус поставить одновременно два комплекта аккумуляторов (по 3 банки в каждом). Не хочу ставить аккумуляторы в параллель, их будет сложнее контролировать на износ. Соответственно МК должен переключать/отключать аккумуляторы по мере их разряда (любая банка если опускается ниже установленного порога, то цепочка отрубается). МК питается от своего аккумулятора с бустером. Плюсы цепочек объединены, минусы подключаются полевиками.

Ну и собственно проблема: как подключить землю МК чтобы он смог управлять полевиками, но при этом не замкнуть минусы у двух цепочек аккумуляторов? Можно ли поставить с земли диод шоттки на минус аккумулятора, что при этом будет? Аккумуляторы точно не объединятся, но будет ли работать? Протеус есть, но им еще пользоваться уметь надо...

Пока что монстр какой-то выходит, но если убрать контроль тока, то будет много проще.

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

А почему бы не поставить датчик тока вроде ACS754 и p-channel полевики с управлением по плюсу?

nevkon
Offline
Зарегистрирован: 20.01.2015

Еслиб я был так силен в схемотехнике... Я пытаюсь сделать развязаный от основной батареи МК. Так чтобы его работоспособность не зависила от работоспособности основной батареи  не кушал ее.

Вот я наваял немного, может кто подскажет как доделать схему (токовый датчик уже убрал):

Тоже думал про токовый датчик холла, но пока попробую без датчика для начала сделать.

зы как сделать картинку кликабельной? похоже сервер режет размер картинки.

nevkon
Offline
Зарегистрирован: 20.01.2015

Кстати интересно как отнесется контроллер на наличие разницы потенциалов между портами АЦП при отключенном питании и отсутствия общей земли.

nevkon
Offline
Зарегистрирован: 20.01.2015

Довел схему до предварительного варианта, только не обозначил отключения батарей для зарядки. Потом создам свою тему, а пока прошу проверить кому не сложно. Полевики P канальные поставил.

Smit7ua
Offline
Зарегистрирован: 08.03.2017

а на полевиках как сделать?

1707
Offline
Зарегистрирован: 08.02.2017

Всем привет мужики. Может где то есть готовый проект для повторения, печатка, прошивка.

yucan
Offline
Зарегистрирован: 20.04.2015

1707 пишет:

Всем привет мужики. Может где то есть готовый проект для повторения, печатка, прошивка.

Если только для проверки и зарядки лития, то рекомендую этот вариант. Но на PIC.

http://smartelectronix.biz/publ/prostoj_analizator_kachestva_i_jomkosti_...

Frolv
Offline
Зарегистрирован: 31.08.2015

yucan пишет:

Доброе утро. Вопросик, у Вас время разряда точно показывает? У меня сильно увеличине, вместо 120 (2ч.00мин)мин - 150 (2ч.30мин)минут. где в скетче это можно исправить?

Novice User
Offline
Зарегистрирован: 25.09.2017

tekagi     вопрос по вашей схеме с предыдущей станицы-можно ли подключить вместо цепи заряда Т1(КТ315) и Т2(КТ814) микосхему заряда LTC4054,а в цепи разряда поставить реле?не смог найти кт814

 

 

 

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Разве что перепишите скетч под управление ЛТЦшкой и уберёте из него индикацию тока заряда...

КТ814 можно заменить почти любым p-n-p транзистором с допустимым током не менее ампера.

Есть версия этого тестера на полевиках 6401 и 2502, но там скетч на несколько версий ниже и беднее по функционалу, могли остаться баги. Если есть желание - разбирайтесь, допиливайте и т.д. То были мои первые пробы с ардуиной, разгребать код сейчас желания нет. Версия на биполярках у меня работает по сей день, версию на полевиках собирал в железе и тестировал другой человек.

Novice User
Offline
Зарегистрирован: 25.09.2017

О,спасибо!на полевиках то что надо...

то что кт814 можно заменить я понял,радиатор не охота ставить,а реле лежат который год

Рисую плату,пины придется немного изменить для удобства

 

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

814е у меня стоят без радиаторов (на фото видно), еле тёплые при указанных на схеме номиналах резисторов.
Скетчи и схемы версий под полевики и под биполярники не взаимозаменяемы!

Novice User
Offline
Зарегистрирован: 25.09.2017

Это понятно

А что препочтительней для опороного напряжения ацп-5 вольт,внутреннее 1,1 в или на TL431?

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Я использовал напряжение питания, но с коррекцией нестабильности по TLке. Можно корректировать по внутреннему ИОН, но использовать опорное напряжение ниже подаваемого на АЦП не выйдет.

Novice User
Offline
Зарегистрирован: 25.09.2017

После испытаний выцяснил что питание атмега и силовой части заряда лучше разделить,использованы 2 стабилизатоа 7805,кроме того в качестве опорника поставил LM4040 3 V,по даташиту +-0,1%,точность измерения очень хорошая,но не пойму как сделать заме емкости...

по скетчу подключаем нагрузку и измеряем напряжение на нагрузке каждые 5 сек,складываем в переменную сар,но зачем делить на 720?вроде надо на 3600,не пойму этот момент...

скетч сырой,пока выкладывать не буду,новичек и там полно наверно неправильного но пока вроде работает

 

Novice User
Offline
Зарегистрирован: 25.09.2017

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Novice User пишет:

по скетчу подключаем нагрузку и измеряем напряжение на нагрузке каждые 5 сек,складываем в переменную сар,но зачем делить на 720?вроде надо на 3600,не пойму этот момент..

Правильно поставленый вопрос содержит половину ответа :)

Novice User
Offline
Зарегистрирован: 25.09.2017

3600/5=720....,вроде так

 

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

tekagi пишет:

Мод авторской версии, основан на скетче, изменённом arthemy под дисплей 1602.

..........

На данный момент альфа-версия, только вчера добавил в скетч меню, пока на стадии тестирования, так что возможны глюки.

 

Здравствуйте. Меня заинтересовал ваш вариант тестера. Вчера закончил сборку и немного протестировал.

Прибор понравился. Весьма полезная вещь - определение внутреннего сопротивления аккумулятора. Пусть и примерное.

Позже плпнирую сделать по нему обзор на сайте "Радиосхемы" (мне там удобнее и проще). С платой и кодом, естественно.

 

Если вы еще интересуетесь данной темой, то небольшое пожелание к программе:

После окончания теста заряжать аккумулятор (и поддерживать напряжение) не до 4,1 вольта, а до 3,7 - 3,8 (во время зарядки пожалуй 3,8 ).

Т.е. заряжать его до напряжения хранения.

Полностью заряженный аккумулятор быстрее теряет емкость при длительном хранении.

Тем самым прибор приобретет дополнительный плюс в эксплуатации.

Ну а собственно функция зарядки не самое главное в вашей конструкции. Да и хватает других приборов для этого. Те же платы заряда.

И да.

Спасибо за интересную конструкцию.

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

По коду посмотрю, уже не помню что да как там. С печаткой проблем не возникло? Выложен промежуточный вариант, не тестированый, окончательный я где-то протерял.

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

tekagi пишет:
По коду посмотрю, уже не помню что да как там. С печаткой проблем не возникло? Выложен промежуточный вариант, не тестированый, окончательный я где-то протерял.

С печаткой все более-менее. 7 небольших перемычек, не считая СМДшных. Плата 100х100. Можно еще уменьшить немного при желании. Я перебдел с местом под возможную установку радиатора на разрядные резисторы.

Периодически при включении были кракозяблы на дисплее. Возможно попробую отключить приветствие. Возможно дело в нем. Но это не точно, было до окончания сборки (не был установлен светодиод и бузер).

А с проблемой хранения я столкнулся недавно. Почитал по теме вот и взялся за ваш вариант. И сопротивление посмотреть и возможно получится сразу после него спокойно ложить аккумуляторы, не заморачиваясь дополнительным разрядом.

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

А, Вы свою печатку разводили. Я выкладывал ту, что на фото, но, к сожалению, промежуточный вариант. Все оставшиеся от проекта наработки здесь: https://www.dropbox.com/sh/57zurmfmrx1s8ug/AABe_xWCyuSJIda_oBGK841da?dl=0

Осторожно, в печатке могут быть косяки.

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

tekagi пишет:

Осторожно, в печатке могут быть косяки.

В моей косяков нет. Заработала сразу.

(Сорри, скопировал ссылку на ЯД и удалил. С моей стороны будет некрасиво публиковать ее у себя после этого).

Но если нужно - выложу.

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Лучше выложите свою, провереную в железе. Мож ещё кто собрать захочет.

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

https://yadi.sk/d/kDhUwMLeWKa_sA

Номиналы и позиционные обозначения деталей указаны в свойствах деталей (двойной клик по детали).

Перед изготовлением платы советую убедится, что:

Ардуино Про-Мини от разных производителей могут отличаться расположением некоторых выводов.

Дисплеи по крепежным отверстиям так же.

Разрядные резисторы советую подобрать до изготовления платы. В качестве резистора заряда (5,1 ома по схеме) достаточно одного двухваттного. У меня просто не нашлось.

Сравнительно сильно греется только 10 омный резистор. Как у меня - достаточно (5 ваттный).

22 ома достаточно как у меня (2 по 2 ватта).

Транзисторы не греются.

Прошивку лучше брать из поста сразу за этим. №187.

Схема и описание пост №148 страница 3.

 

Добиться стабильной работы этого варианта схемы не удалось. И почему то чем дальше, тем хуже. Впечатление, что что-то ускоренно деградирует в схеме.

Возможно это просто у меня детали с брачком (проверены до установки и после выпаивания с помощью ТРД).

Стало все чаще сбрасываться в кракозяблы, чаще всего на этапе проверки сопротивления.

В бузере что-то вроде треска мокрых дров, хаотично меняется ток потребления и кракозяблы.

Дополнение 02.09.19.

Вроде начинает что-то вырисовываться. Схема требует стабильного незашумленного питания.

Добавил развязки по питанию. Убрал некоторые резисторы. Если потеряю возможность редактировать этот пост, советую посмотреть дальше. Будет результат или нет, обязательно сообщу.

Нормальным результатом буду считать, когда хотя бы пару раз оставленный на ноч тест с достаточно емким аккумом, утром не будет показывать кракозяблы и будут отсутствовать паразитные явления.

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Лекс 59 пишет:
После окончания теста заряжать аккумулятор (и поддерживать напряжение) не до 4,1 вольта, а до 3,7 - 3,8 (во время зарядки пожалуй 3,8 ).

Попробуйте такой вариант:


/*
История здесь arduino.ru/forum/proekty/tester-akkumulyatorov-dlya-lotka
*/

#include <util/delay.h>
#include <LiquidCrystal.h>

const float R5 = 5.5;         //задаём сопротивление зарядного резистора R5
const float R10 = 22.3;       //задаём сопротивление разрядного резистора R10
const float R15 = 10.2;       //задаём сопротивление разрядного резистора R15
const int analogV = A0;       //назначаем аналоговый вход аккума
const int analogVC = A1;      //назначаем аналоговый вход заряда
const int analogVD = A2;      //назначаем аналоговый вход разряда
const int analogVD2 = A3;     //назначаем аналоговый вход разряда 2
const int analogV_TL431 = A4; //назначаем аналоговый вход коррекции напряжения
float coeff = 0.0;            //поправка на нестабильность напряжения
float volt = 0.0;             //задаем переменные
float R = 0.0;                //внутреннее сопротивление аккумулятора
float voltC = 0.0;            //Напряжение при заряде
float voltD = 0.0;            //Напряжение при разряде
float voltD2 = 0.0;           //Напряжение при разряде
float Vc = 0.0;               //Конечное напряжение заряда
float Vd = 0.0;               //Конечное напряжение разряда
float am = 0;                 //милиамперы
float amR = 0;                //милиамперы, ток определения внутреннего сопротивления
float amR2 = 0;               //милиамперы, ток определения внутреннего сопротивления
float amC = 0;                //милиамперы заряд
float capvrem= 0;             //временная емкость
float cap= 0;                 //емкость
float voltTEMP= 0;            //временная переменная для рассчёта внутреннего сопротивления
byte counteR = 0;             //счётчик циклов замера внутреннего сопротивления
byte knop = 0;                //переменная для хранения состояния кнопки
byte knop_menu = 1;           //переменная для хранения состояния кнопки
byte SEK = 0;                 //секунды
byte MIN = 0;                 //минуты
byte HOUR = 0;                //часы
byte akk_type = 0;            //переменная типа аккумулятора
byte discharge_type = 0;      //переменная типа разряда
byte recharge_control = 0;    //переменная для однократного подзаряда в конце
unsigned long prMillis = 0;
// initialize the library with the numbers of the interface pins       
LiquidCrystal lcd(12, 11, 5, 4, 19, 10);   // 19 - pinA5

void setup() 
{
  pinMode(analogV , INPUT);    //определяем тип порта (вход), АЦП
  pinMode(analogVC , INPUT);  //определяем тип порта (вход), АЦП
  pinMode(analogVD , INPUT);  //определяем тип порта (вход), АЦП
  pinMode(analogVD2 , INPUT);  //определяем тип порта (вход), АЦП
  pinMode(analogV_TL431 , INPUT);  //определяем тип порта (вход), АЦП
  pinMode(2, INPUT);         //определяем тип порта (вход), кнопка
  pinMode(3, INPUT);         //определяем тип порта (вход), кнопка
  pinMode(13, OUTPUT);   // бузер
  pinMode(9, OUTPUT);   // разряд
  pinMode(8, OUTPUT);   // заряд
  pinMode(7, OUTPUT);   //LED
  pinMode(6, OUTPUT);   //разряд2
  lcd.begin(16, 2); // размер дисплея 
  lcd.clear();      // Чистим экран
  menu(); //вызов меню для начальной конфигурации
}


void loop()
{ 
  if (digitalRead(3)==HIGH)		//нажатие кнопки "меню"
    {
       knop_menu=1;
       digitalWrite(8,LOW);            //выключаем ключ зарядки аккумулятора
       digitalWrite(9,LOW);            //выключаем ключ нагрузки
       digitalWrite(6,LOW);            //выключаем ключ нагрузки 2
       digitalWrite(7,LOW);            //выключаем светодиод заряда
       _delay_ms(100);
       menu();
    }
coeff = 512/(float (analogRead(analogV_TL431)));      // считаем коэффициент погрешности опорного напряжения
volt = float (analogRead(analogV))*coeff*5/1024;      // 5В - опорное напряжение
voltC = float (analogRead(analogVC))*coeff*5/1024;    // Напряжение заряда
voltD = float (analogRead(analogVD))*coeff*5/1024;    // Напряжение разряда
voltD2 = float (analogRead(analogVD2))*coeff*5/1024;  // Напряжение разряда 2
  if (digitalRead(2)==HIGH)		//нажатие кнопки
  {
    tone(13, 1000, 70);
    knop++;
    lcd.clear();					      //чистим экран  
    if (knop>4){knop=1; }		  	// обнуляем четвёртое нажатие.  
    _delay_ms(250);
  }
  if (knop==0){    //сценарий устройство включено но незапущен тест
    lcd.setCursor(0, 0);
    lcd.print("Press 1Ch 2Rint ");
    lcd.setCursor(0, 1);
    lcd.print("3Dis 4FinCh ");
    lcd.print(volt, 1);  
    lcd.print("V           ");      
    _delay_ms(250);
  }
//-------------------------------------------------
  if (knop==1){		//отработка сценария зарядки после подключения
    lcd.clear();					      //чистим экран  
    cap= 0;			//обнуляем переменные
    am = 0;
    amR = 0;
    amR2 = 0;
    amC = 0;
    R = 0;
    SEK = 0; 
    MIN = 0; 
    HOUR = 0;
    counteR = 0;
    voltTEMP = 0;
    recharge_control = 0;
    digitalWrite(7,LOW);		//светодиод разряжено
    if (volt<Vc)
    {                   
      digitalWrite(8,HIGH);	//включаем ключ зарядки аккумулятора
      digitalWrite(9,LOW);		//отключаем ключ нагрузки
      amC=((voltC-volt)/R5)*1000;        //считаем ток в mA =Uтекущее/Rнагрузки,  *1000 получаем mA
      lcd.setCursor(0, 0);
      lcd.print("CHARGE: ");
      lcd.print(volt);     //выводим напряжение на аккумуляторе
      lcd.print("V        ");   
      lcd.setCursor(8, 1);
      lcd.print("I=");
      lcd.print(amC);        
    }
    if(volt>=Vc) {knop = 2;    tone(13, 1000, 150);}  // фиксируем зарядку АКБ, переходим в проверку внутреннего сопротивления
      _delay_ms(350);
  }
//----------------------------------------------------------------------------------------------------
  if (knop==2)            //замер внутреннего сопротивления
  {
   if (counteR<=252)
   {
       
        if (counteR<=230)      //первый цикл проверки
           {
            if (counteR==0) { lcd.clear(); } // Чистим экран
            digitalWrite(8,LOW);    //отключаем ключ зарядки аккумулятора
            digitalWrite(6,LOW);    //отключаем ключ нагрузки 2
            digitalWrite(9,HIGH);   //включаем ключ нагрузки
            amR=(voltD/R10);        //считаем ток
            lcd.setCursor(0, 0);
            lcd.print("Testing Rint ");
            lcd.setCursor(13, 0);   //ставим курсор в 14й столбец, первую строку (вспомогательные данные, можно закомментить строку)
            lcd.print("R10");        //используемый резистор (вспомогательные данные, можно закомментить строку)
            lcd.setCursor(0, 1);    //ставим курсор в первый столбец, вторую строку
            lcd.print(amR*1000,0);  //выводим значение тока разряда в мА
            lcd.print("mA ");       //
            lcd.print(volt,2);      //выводим напряжение на аккумляторе под нагрузкой
            lcd.print("V ");        //
            _delay_ms(500);         //задержка
            lcd.setCursor(0, 1);    //ставим курсор в первый столбец, вторую строку
            lcd.print("                ");        //чистим строку
            counteR++;              //инкрементируем счётчик
            if (counteR<=231)      //окончание первого цикла проверки
             {
               voltTEMP = volt;        //переносим значение напряжения под нагрузкой во временную переменную
             }
          }
       if (counteR>230 and counteR<=250)      //второй цикл проверки
          {
            if (counteR==231) { lcd.clear(); } // Чистим экран
            digitalWrite(8,LOW);    //отключаем ключ зарядки аккумулятора
            digitalWrite(9,LOW);    //отключаем ключ нагрузки           
            digitalWrite(6,HIGH);   //включаем ключ нагрузки 2
            amR2=(voltD2/R15);      //считаем ток
            lcd.setCursor(0, 0);
            lcd.print("Testing Rint");
            lcd.setCursor(13, 0);   //ставим курсор в 14й столбец, первую строку
            lcd.print("R15");        //используемый резистор (вспомогательные данные, можно закомментить строку)
            lcd.setCursor(0, 1);    //ставим курсор в первый столбец, вторую строку
            lcd.print(amR2*1000,0); //выводим значение тока разряда в мА
            lcd.print("mA ");       //
            lcd.print(volt,2);      //выводим напряжение на аккумляторе под нагрузкой
            lcd.print("V ");        //
            counteR++;              //инкрементируем счётчик
            _delay_ms(500);         //задержка         
            lcd.setCursor(0, 1);    //ставим курсор в первый столбец, вторую строку
            lcd.print("                ");        //чистим строку
          }

        if (counteR==251)             //заканчиваем проверку сопротивления
           {
             R = ((voltTEMP-volt)/(amR2-amR));  //считаем внутреннее сопротивление аккумулятора
             digitalWrite(9,LOW);         //выключаем ключ нагрузки
             digitalWrite(6,LOW);         //выключаем ключ нагрузки 2
             digitalWrite(8,LOW);         //выключаем ключ зарядки аккумулятора
             counteR++;                   //инкрементируем счётчик
             lcd.clear();  // Чистим экран
             lcd.setCursor(0, 1);         //ставим курсор в первый столбец, вторую строку
             lcd.print("Rin=");           //
             lcd.print(R,3);              //выводим значение внутреннего сопротивления
           }
        if (counteR>=252)  //восстанавливаем заряд аккумулятора перед тестом ёмкости, переходим в разряд
            {
             digitalWrite(9,LOW);     //выключаем ключ нагрузки
             digitalWrite(6,LOW);     //выключаем ключ нагрузки 2
             digitalWrite(8,HIGH);    //включаем ключ зарядки аккумулятор
             lcd.setCursor(0, 0);         //ставим курсор в первый столбец, первую строку
             lcd.print("re-charging");        //дозарядка до полного
             lcd.setCursor(11, 1);         //ставим курсор в 12й столбец, вторую строку
             lcd.print(volt);        //вывод текущего напряжения на аккумуляторе
             lcd.print("V");         //
             _delay_ms(350);
             lcd.setCursor(15, 0);         //ставим курсор в 16й столбец, первую строку
             lcd.print("*");               //мигающий значок заряда
             _delay_ms(350);
             lcd.setCursor(15, 0);         //ставим курсор в 16й столбец, первую строку
             lcd.print(" ");               //мигающий значок заряда
             lcd.setCursor(11, 1);         //ставим курсор в 12й столбец, вторую строку
             lcd.print("     ");         //
             
           if (volt>=Vc)             //если зарядился - переходим в разряд
                {
                 digitalWrite(8,LOW);    //выключаем ключ зарядки аккумулятора
                 knop = 3;                    //фиксация окончания замера внутреннего сопротивления, переход к замеру ёмкости
                 tone(13, 1000, 150);   //тональный сигнал смены цикла
                }
            } 

       
   }
  }
//----------------------------------------------------------------------------------------------------------------
  if (knop==3){					//проверка сценария для разрядки
    lcd.clear();      // Чистим экран
    if (volt>Vd)
    {
          digitalWrite(8,LOW);		//отключаем ключ зарядки аккумулятора
             if (discharge_type==1)
                {
                 digitalWrite(9,HIGH);  //включаем ключ нагрузки 
                }
            if (discharge_type==2)
                {
                 digitalWrite(6,HIGH);  //включаем ключ нагрузки 
                }
            if (discharge_type==3)
                {
                 digitalWrite(6,HIGH);  //включаем ключ нагрузки 
                 digitalWrite(9,HIGH);  //включаем ключ нагрузки 
                }
      //#########цикл отсчета
      if (millis()-prMillis>=5000){
        prMillis=millis();
        SEK=SEK+5;
            if (discharge_type==1)
                {
                 am=(voltD/R10)*1000;        //считаем ток в mA =Uтекущее/Rнагрузки,  *1000 получаем mA
                }
            if (discharge_type==2)
                {
                 am=(voltD2/R15)*1000;        //считаем ток в mA =Uтекущее/Rнагрузки,  *1000 получаем mA
                }
            if (discharge_type==3)
                {
                am=((voltD/R10)*1000)+((voltD2/R15)*1000);        //считаем ток в mA =Uтекущее/Rнагрузки,  *1000 получаем mA
                }
        capvrem=am/720; cap=cap+capvrem;	//считаем емкость в mAh, при замере раз в 5 сек (в часе 3600сек / 5 = 720)
        if (SEK>59){SEK=0;MIN++;}
        if (MIN>59){MIN=0;HOUR++;}
        if (HOUR>23) HOUR=0;
      }
        //######################## 
      lcd.setCursor(0, 0);
      lcd.print("DisCh  ");
      lcd.print("I=");		//вывод на экран
      lcd.print(am, 0);		//вывод на экран
      lcd.print("mA ");		//вывод на экран
      lcd.setCursor(0, 1);
      lcd.print(volt); 
      lcd.print("V  Q=");	//вывод на экран
      lcd.print(cap, 0);		//вывод на экран
      lcd.print("mAh    ");	//вывод на экран
      lcd.setCursor(12, 1);
    }
    _delay_ms(500);
    if (volt<=Vd){knop=4; tone(13, 1000, 150);}  //фиксация окончания разрядки и замера емкости   
  }
//-------------------------------------------------
  if (knop==4){					              //сценарий окончания подсчета емкости, вывод на экран и зарядка.
    lcd.setCursor(10, 1);
    lcd.print(volt, 1);               //вывод на экран текущего напряжения аккумулятора
    lcd.print("V");

   switch (recharge_control)
    {
      case 0:                          //тест окончен, но аккумулятор полностью разряжен, выводим результаты на экран
       digitalWrite(8,LOW);            //выключаем ключ зарядки аккумулятора
       digitalWrite(9,LOW);            //выключаем ключ нагрузки
       digitalWrite(6,LOW);            //выключаем ключ нагрузки 2
       digitalWrite(7,LOW);            //выключаем светодиод заряда
       lcd.setCursor(0, 0);            //выводим значение внутреннего сопротивления
       lcd.print("R=");
       lcd.print(R,3);
       lcd.print(" ");
       lcd.setCursor(8, 0);
      if (HOUR<1){ lcd.print("00");}   //вывод времени разряда на экран
         else {lcd.print(HOUR);}
       lcd.print(":");
      if (MIN<1){ lcd.print("00");}    //вывод на экран
         else {lcd.print(MIN);}
       lcd.print(":");
       lcd.print(SEK);
       lcd.setCursor(0, 1);
//     lcd.print("Q=");                //вывод на экран
       lcd.print(cap, 1);              //вывод на экран
       lcd.print("mAh ");              //вывод на экран
       recharge_control=1;             //инкремент счётчика
       _delay_ms(5);
       break;                          //выход из case

      case 1:                      //тест окончен, результаты отображены, заряжаем
            if (volt<(Vc - 0.3))               //после того как посчитали емкость заряжаем (до напряжения хранения)
             {
              digitalWrite(8,HIGH);    //включаем ключ зарядки аккумулятора
              lcd.setCursor(15, 1);    //столбец 16, строка 2
              lcd.print(" ");          //мигаем звёздочкой индикатора заряда
              _delay_ms(250);
              lcd.setCursor(15, 1);    //столбец 16, строка 2
              lcd.print("*");         //мигаем звёздочкой индикатора заряда
              _delay_ms(250);
              }
            if (volt>=(Vc - 0.3))   //после того как зарядили переходим к поддержанию заданного напряжения
            {
              digitalWrite(8,LOW);             //отключаем ключ зарядки аккумулятора
              digitalWrite(7,HIGH);            //включаем светодиод заряда
              recharge_control=2;              //инкрементируем счётчик
              tone(13, 500, 300);
              _delay_ms(301);
              tone(13, 700, 300);
              _delay_ms(301);
              tone(13, 900, 300);
              _delay_ms(301);
            }
              break;

      case 2:
    if (volt<(Vc-0.5))                 //после заряда поддерживаем напряжение
           {
              digitalWrite(8,HIGH);    //включаем ключ зарядки аккумулятора
              _delay_ms(150);
           }
    
    if (volt>=(Vc-0.5))                //после заряда поддерживаем напряжение
        {
         digitalWrite(8,LOW);          //отключаем ключ зарядки аккумулятора
         _delay_ms(500);
        }
            break;

    }
  }
}

void menu()                    //меню
{
knop=0;                        //обнуляем используемые переменные
akk_type=1;                    //по умолчанию Li-Ion
discharge_type=1;              //по умолчанию минимальный ток разряда
_delay_ms(150);              //задержка - антидребезг
while  (knop_menu!=0)            //пока не произведены начальные настройки остаёмся в меню
{
    if (digitalRead(2)==HIGH)    //нажатие кнопки
  {
    lcd.clear();                //чистим экран 
    knop++;                     //инкремент кнопки
    tone(13, 1000, 70);         //бипер
    if (knop>3){knop=1; }       // обнуляем нажатие  
    _delay_ms(75);              //задержка - антидребезг
  }
    if (digitalRead(3)==HIGH)    //нажатие кнопки
  {
    knop=0; 
    lcd.clear();                //чистим экран 
    knop_menu++;                //инкремент кнопки
    tone(13, 1000, 70);         //бипер
    if (knop_menu>3){knop_menu=1; }       // обнуляем нажатие  
    _delay_ms(75);              //задержка - антидребезг
  }     
switch(knop_menu)                //выбор типа аккумулятора и тока разряда
 {
case 1:                //выбор типа аккумулятора
     {
              lcd.setCursor(0, 0);                  //индикация текущего типа аккумулятора
              lcd.print("  akkum. type:  ");
                     if (knop==0)                    
                       {
                         lcd.setCursor(0, 0);
                         lcd.print("change akk type?");

                       if (akk_type==1)
                         {
                           lcd.setCursor(0, 1);
                           lcd.print("Li-Ion 2.9V-4.1V");
                         }
                       if (akk_type==2)
                         {
                           lcd.setCursor(0, 1);
                           lcd.print("Li-Pol 2.9V-4.2V");
                         }
                       if (akk_type==3)
                         {
                           lcd.setCursor(0, 1);
                           lcd.print("Li-Fe 2.8V-3.6V ");
                         }

                      }

                if (knop==1)                    //выбор литий-ионной батареи
                {
                  lcd.setCursor(0, 1);
                  lcd.print("Li-Ion 2.9V-4.1V");
                  akk_type=1;
                }
                if (knop==2)                    //выбор литий-полимерной батареи
                {
                  lcd.setCursor(0, 1);
                  lcd.print("Li-Pol 2.9V-4.2V");
                  akk_type=2;
                }
                if (knop==3)                    //выбор литий-железо-фосфатной батареи
                {
                  lcd.setCursor(0, 1);
                  lcd.print("Li-Fe 2.8V-3.6V ");
                  akk_type=3;
                }
            _delay_ms(250);
            break;
     }


case 2:                       //выбор тока разряда
    {
              lcd.setCursor(0, 0);
              lcd.print("discharge type: ");


             if (knop==0)                
              {
                  lcd.setCursor(0, 0);           //индикация текущей уставки тока разряда
                  lcd.print("change I disch.?");

                 if (discharge_type==1)       //минимальный ток
                   {
                     lcd.setCursor(0, 1);
                     lcd.print("minimum current ");
                   }

                 if (discharge_type==2)      //средний ток
                   {
                     lcd.setCursor(0, 1);
                     lcd.print("middle current  ");
                   }

                 if (discharge_type==3)      //максимальный ток
                   {
                     lcd.setCursor(0, 1);
                     lcd.print("maximum current ");
                   }
              }

                if (knop==1)                //выбор минимального тока разряда (R10)
                {
                  lcd.setCursor(0, 1);
                  lcd.print("minimal current ");
                  discharge_type=1;
                }
                if (knop==2)               //выбор среднего тока разряда (R15)
                {
                  lcd.setCursor(0, 1);
                  lcd.print("middle current  ");
                  discharge_type=2;
                }
                if (knop==3)               //выбор максимального тока разряда (R10+R15)
                {
                  lcd.setCursor(0, 1);
                  lcd.print("maximum current ");
                  discharge_type=3;
                }
           _delay_ms(250);                //задержка
           break;
    }

case 3:                                       //сохранение параметров и переход к тесту
    {
              lcd.setCursor(0, 0);
              lcd.print("  save and go   ");
              lcd.setCursor(0, 1);
              lcd.print("    to test?    ");
                if(knop==1)
                  {
                   knop_menu=0;

                     if (akk_type==1)
                         {
                           Vd=2.9;
                           Vc=4.1;
                         }
                     if (akk_type==2)
                         {
                           Vd=2.9;
                           Vc=4.2;
                         }
                     if (akk_type==3)
                         {
                           Vd=2.8;
                           Vc=3.6;
                         }
                  }
           _delay_ms(250);                //задержка
            break;
    }
 }
}
       knop=0;                             //обнуляем переменные
       knop_menu=0;                        //обнуляем переменные
}

Подсвеченные строки отвечают за напряжение окончательного заряда и последующего режима ожидания (относительно напряженя полного заряда для выбраного типа аккумулятора). В строках 501-515 можно поменять граничные напряжения полного заряда-разряда для разных типов аккумуляторов.

В железе не проверял.

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

Спасибо. Попробую. Потом отпишусь.

Сегодня столкнулся с таким эффектом. Ранее замеренный литий (около 1400 по прибору Бодрого 2014), выдал 2059 мАч.

Многовато. И в конце разряда, в районе 3,0 - 3,1 уж больно долго находился. А должно быть быстрое падение в конце. Появилось подозрение, что во время разряда подтекает транзистор Т2 в ветке заряда.Проверка показала наличие падения напряжения на резисторе R5. Т.е. Т2 приоткрыт. При этом на Ардуинке Порт 8 присутствует практически 0 вольт.

Т.е. некорректно работает схема исполнительной части.

При подборе деталей я брал транзисторы с КУ больше 200. Возможно дело в этом. Ловят помехи от куда нибудь.

Заменил Т1 и Т2 на аналогичные, но с КУ менее 100 (90 с чем-то у обоих), вроде ситуация устаканилась.

Но все равно плохо, что схема чувствительна к параметрам деталей.

Возможно имеет смысл подавать сигнал управления на Т2 непосредственно с Ардуино, через резистор.

К сожалению сам я не  электронщик. Базовых знаний у меня нет. Попробую погуглить по части управления нагрузкой с Ардуино.

Поэтому если кто собрался повторять устройство прямо сейчас, советую подождать.

 

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

tekagi пишет:

===========

Подсвеченные строки отвечают за напряжение окончательного заряда и последующего режима ожидания (относительно напряженя полного заряда для выбраного типа аккумулятора). В строках 501-515 можно поменять граничные напряжения полного заряда-разряда для разных типов аккумуляторов.

В железе не проверял.

Извините, не увидел никаких подсвеченных строк. Не разобрался, где надо поменять значение заряда после проверки емкости.

Пожалуйста, ткните носом, укажите номера строк.

Со строками 501-515, как я понял, это напряжение, до которого аккумы будут заряжены ПЕРЕД измерением емкости.

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Строки 315, 325, 340, 346. Vc - напряжение полного заряда, минус дельта, на которую нужно уменьшить.
По хорошему схему надо делать на полевиках, в папке на дропбоксе такрй вариант есть, но с текущим скетчем несовместим. Его сборкой и тестированием занимался другой человек, у меня на тот момент полевиков не было. Хотя с ними схема проще и стабильнее.
Дорабатывать ни тот, ни другой вариант не планирую, применённые схемные решения всё же не слишком удачные. Если что-то подобное ваять и буду - то уже по другой схеме.

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

tekagi пишет:
Строки 315, 325, 340, 346. Vc - напряжение полного заряда, минус дельта, на которую нужно уменьшить. По хорошему схему надо делать на полевиках, в папке на дропбоксе такрй вариант есть, но с текущим скетчем несовместим. Его сборкой и тестированием занимался другой человек, у меня на тот момент полевиков не было. Хотя с ними схема проще и стабильнее. Дорабатывать ни тот, ни другой вариант не планирую, применённые схемные решения всё же не слишком удачные. Если что-то подобное ваять и буду - то уже по другой схеме.

А, то есть вы уже учли мои пожелания. Спасибо.

Во блин, просматривал скетч в браузере и дважды в ардуино. И не увидел выделения и даже надписи... (смайлик мне стыдно).

Ваше мнение по доработке понятно. Я плату сделал уже и переделывать ее заново тоже не стану. Если схему и буду дергать, то резать/паять перемычки.

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

Если будут переделки в схеме - то отпишусь здесь.

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Лекс 59 пишет:
Появилось подозрение, что во время разряда подтекает транзистор Т2 в ветке заряда.

Попробуйте поставить подтяжку 5-10к между базой и эмиттером Т5. Можно и на Т4, Т6.

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

tekagi пишет:
Попробуйте поставить подтяжку 5-10к между базой и эмиттером Т5. Можно и на Т4, Т6.
Вероятно вы имели ввиду транзистор Т1?

Транзистор Т5 по вашей схеме это КТ315 в цепи "разряд средний".

Попробую.

Сейчас схема стоит на прогоне после замены транзисторов на меньшее КУ. Пока работает стабильно.

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Очепятался, Т2. Силовой ключ заряда. На Т1 подтяжка не нужна, выход ардуины либо низкий, либо высокий, высокоимпедансного состояния там нет.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

tekagi пишет:
Очепятался, Т2. Силовой ключ заряда. На Т1 подтяжка не нужна, выход ардуины либо низкий, либо высокий, высокоимпедансного состояния там нет.

Как ты глубоко ашыбаешьса. 

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

Я попробую поставить подтяжку между коллектором и эмиттером Т1, тем самым подтянув базу Т2 к земле.

 

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

В том, что в данном случае не нужна? В скетче емнип нигде не задействован перевод пинов в отключённое состояние.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

tekagi пишет:
В том, что в данном случае не нужна? В скетче емнип нигде не задействован перевод пинов в отключённое состояние.

а в те жалкие миллисекунды после сброса, перед pinMode, в каком состоянии будуть выходы? Золотое правило ембеддера, "Никогда не полагайся на программу, полагайся только на железо"

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Тоже верно, за напоминание спасибо. В данной схеме особых проблем не наделает, но учитывать на будущее надо. Базы 315х можно подтяжками к gnd подцепить.
Лекс 59, резистор 10к между базой и эмиттером Т2. Если поставить параллельно Т1 - это откроет ключ заряда.

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

tekagi пишет:
Лекс 59, резистор 10к между базой и эмиттером Т2. Если поставить параллельно Т1 - это откроет ключ заряда.
На эмиттере Т2 питание плюс 5 вольт. Мы же подтягиваем тем самым базу к плюсу.

Собственно устройство закончит тест, смогу попробовать так и этак.

Жалко бросать, уже большая часть прошла, как раз того самого на 1400.

Беда в том, что теоретических познаний не хватает, несмотря на громадный практический опыт.

Сейчас устройство стабильно и без подтяжек. Но это у меня и именно сейчас. А надо сделать для всех и навсегда.