Здравствуйте. Перекопировал тут себе термометр. Хочу добавить процент заряда питающей батарейки От чего именно будет питаться еще пока не решил - крона, пальчиковые, дисковая.
МК на частоте 0-8мгц питается от 1.8-5.5V Добавил вольтметер на основе внутренней опорной частоты 1.1V
экран питается от 5 вольт, мк 1,8-5,5 - как мне рассчитывать процент батарейки ? ( как понял экран будет тухнуть первым чем мк
Первое решение, неверное СпойлерА если поступить так: 1) в начале программы измеряем напряжение, к пример 5V 2) Устанавливаем минимальное Т.к. у меня ватчдог по прерыванию будет, а не резет, значит эти значения будут сохраняться. А не будут только при полном обесточивании батарейки - при замене. ВОзможно ли как-то указать по типу: max=read_adc(0); min=3.
Если простым математическим соотношением то между максимальной 5V и минимальным 3V не будет 100% Или думаю можно каким-то образом реализовать к примеру такое: 1) Vmax - напряжение измеренное при старте программы ( к примеру 5 ) 2) Vmin - минимальное рабочее напряжение ( у меня мой экран на какой-то микрухе, надо будет через резисторы самому посмотреть на скольки вольтах отключаться будет ) к примеру 3V 3) Curr=Vmax-Vmin - узнаём что запас напряжения для работы всей схемы имеем в 2 вольта Массив volt[100] Массив perc[100] 4) в цикле разбиваем число на 100 равных
Код:
a=Vmax-Vmin/100; // получаем из моего примера что 0,02 вольта будет 1 процент. volt[0]=Vmin+a;// Получаем что при напряжение 3.002 будет равняться 1% заряда батарейки. Данный расчёт будет производиться for (i=1;i<=100;i++) { volt[i]=volt[i-1]+a; // прибавляем наш шаг к предыдущему значению. }
Таким образом записываем массив из напряжения. Запишем так же массив из процентов:
Код:
for (i=0;i<=100;i++) { perc[i]=i; // забиваем весь массив от 0 до 100 }
В итоге имеем 2 массива: один с таблицей напряжений исходя из максимального и минимального и имеем таблицу процентов.
Т.е. эти расчёты будут производиться единожды при старте МК ( как пока это сделать не понимаю ) А в прерывании ватчдога указать что-то вида:
Код:
vdd=read_adc(0); // считываем вольтаж батарейки с 0 ноги PC0 for (i=0;i<=100,i++) { if (vdd=volt[i]) { percent=perc[i]; break; } // А тут методом подбора сравнивается текущий вольтаж и вольтаж из батарейки. И если искомый вольтаж в 56 ячейки то собственно 56% }
Но пока не понимаю как моя писанина будет вообще выполняться. Ведь основное тело программы выполняется всегда - а значит просто разместив это всегда будет показывать 100%/ Т.к. у меня ватчдог по прерыванию то резета не будет - мои данные сохраняться до тех пор пока я не замению батарейку обесточив микрокотроллер, либо не сядет батарейка. Т.е. нужен на что-то упор что бы запускать мои вычисления при первом старте, но не последующем. Может в МК есть счётчик тактов - что бы до скольки-то работ тактов он запускался ( при первом включении ) а потом просто игнорировал. Заранее всем большое спасибо, заранее извеняюсь - и не гоните ссаными тряпками
У меня в программе есть такой кусок:
Код:
ADCSRA=(1<<ADEN)
Т.е. можно сделать наверное так что бы проверял какая цифра установлена в ADEN - если 0 то выполнить ( по стандарту он ноль ). А потом уже забьётся единица - и выполняться не будет, до обесточивания мк
Второе, более правильное решение: СпойлерИмеем входное напряжение - 10V Имеем минимальное для МК - 5V
Сокращяем обе отняв 5 - получаем 2V и 1V ( отнимаем 1 вольт что бы стало ноль ), получаем 2V и 0V
2/100=0.02 - это 1%
1V/0.02=50% 1.5V/0.02=75% 2V/0.02=100%
Если подаваемый ток равен 7,5 вольта - надо отнять 5V ( т.к. мы отнимали выше ) получаем 2,5V и отнимает так-же еденицуб 1,5V/0 А 1.5V/0.02=75%
Добавлено after 5 hours 16 seconds: Зделал таким способом:
Код:
adc=read_adc(0); // получаем значение Vcurr=((adc*1.1)/1023)*10; // вычесления на основе опорного напряжения 1,1V умсножив на делитель х10 Vmax=5.5; a=(Vmax-Vmin)/100; //Узнаем сколько будет 1 процент rez_adc=(Vcurr-Vmin)/a;
Vmin=1.8 для моего МК Vmax=5.5 для примера, надо как-то 1 разобъявить что-бы Vmax был равен вольтажу батарейки при старте
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Заголовок сообщения: Re: Atmega88pa и ёмкость питающей батареи
Добавлено: Вт янв 31, 2017 18:25:40
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2694 Откуда: г. Чайковский
Рейтинг сообщения:1 Медали: 1
kakawkin писал(а):
А если математические операции совершить на ассемблере - станет ли код компактнее ?
Как сделаешь. Но в принципе да, компактнее. Но тут асм не требуется. Достаточно работать с целыми числами и не делать лишних мат. операций. Например, если Вам нужны только проценты, зачем сначала переводить код АЦП в напряжение, а затем его в проценты.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
А если математические операции совершить на ассемблере - станет ли код компактнее ?
Как сделаешь. Но в принципе да, компактнее. Но тут асм не требуется. Достаточно работать с целыми числами и не делать лишних мат. операций. Например, если Вам нужны только проценты, зачем сначала переводить код АЦП в напряжение, а затем его в проценты.
Не совсем понимаю о чём ты. Хочу просветления.
Vmax=5.5; - тут я устанавливаю максимальное напряжение, дальше сделаю что бы при включение бралось напряжение ( при первом ) это и будем максималкой, ил иисходным adc=read_adc(0); // получаем значение получаю значение с 0 ноги в переменную adc Vcurr=((adc*1.1)/1023)*10; // обычный перевод цифр [0-1023] в напряжение a=(Vmax-Vmin)/100; //Узнаем сколько будет 1 процент для последующего расчёта rez_adc=(Vcurr-Vmin)/a; // сам расчет
Работаю не с целыми числами - т.е. и напряжение то может быть как минимум с одним знаком после запятой (3.6,3.5 и т.д.)
Просто лично я другой реализации вообще не вижу для моего случая.
Я чего-то не понимаю, о чем Вы. Например, если устройство питается от 6-ти последовательных аккумуляторов NiMH (грубо: полностью заряженные 1.4V * 6 = 8.4V), при напряжении 1V на банку (1V * 6 = 6V), аккумулятор уже разряжен практически полностью.
kakawkin, зависимость напряжение на батарейке (аккумуляторе) от остаточной емкости сильно не линейна, к тому же сильно зависит от температуры, от "старости" (если про аккумуляторы), от потребляемого тока. Для примера: DURACELL Ni-MH Rechargeable Batteries В данном примере видно, что (грубо) от 75% до 25% остаточной емкости напряжение практически не меняется. ИМХО выходов два: 1) Упрощенный "показометр", немного градаций (например три) практически "полная" батарея, нормально, разряженная (скоро устройство отключится). Достаточно задать несколько порогов напряжений, эти пороги зависят от типа батарей, которые Вы будете применять. Если окружающая температура может сильно "плавать", то ввести простую температурную коррекцию. 2) Более "честный" режим, т.е. оценивать остаточную емкость более точно - тут в двух "ассемблерных" командах объяснить не получится. К тому же Вы с химией еще не определились. И вообще, а может оно и нафиг не нужно
Я чего-то не понимаю, о чем Вы. Например, если устройство питается от 6-ти последовательных аккумуляторов NiMH (грубо: полностью заряженные 1.4V * 6 = 8.4V), при напряжении 1V на банку (1V * 6 = 6V), аккумулятор уже разряжен практически полностью.
kakawkin, зависимость напряжение на батарейке (аккумуляторе) от остаточной емкости сильно не линейна, к тому же сильно зависит от температуры, от "старости" (если про аккумуляторы), от потребляемого тока. Для примера: DURACELL Ni-MH Rechargeable Batteries В данном примере видно, что (грубо) от 75% до 25% остаточной емкости напряжение практически не меняется. ИМХО выходов два: 1) Упрощенный "показометр", немного градаций (например три) практически "полная" батарея, нормально, разряженная (скоро устройство отключится). Достаточно задать несколько порогов напряжений, эти пороги зависят от типа батарей, которые Вы будете применять. Если окружающая температура может сильно "плавать", то ввести простую температурную коррекцию. 2) Более "честный" режим, т.е. оценивать остаточную емкость более точно - тут в двух "ассемблерных" командах объяснить не получится. К тому же Вы с химией еще не определились. И вообще, а может оно и нафиг не нужно
Я обязан! И в правду, сильные изменения напряжения происходят только на отрезках [0-20][80-100]. Т.е. из-за нелинейности напряжения и ёмоксти по вольтажу смысла нету ( эх.... а строчки уже готовые )
А акими методами можно измерить оставшеюся ёмкость батареи не подскажешь ? Или данный метод требует именно "заточки" под определённый вид батареи
uint16_t ADCcurr=ADC; if (ADCcurr<=ADCmin)Procent=0; else if (ADCcurr>=ADCmax)Procent=100; else Procent = (uint16_t)(ADCcurr-ADCmin)*100/ADCRange;//%_батарейки = К * (измеренное_напряжение-Umin)
.....
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Или данный метод требует именно "заточки" под определённый вид батареи
да. и причем, не путем умножения на некоторый коэффициент, а построение таблички на несколько точек. и чем больше точек, тем точнее. и более того, при старении батареи табличка начнет давать ошибку. тут будет более разумным сделать по этому варианту:
viiv писал(а):
1) Упрощенный "показометр", немного градаций (например три) практически "полная" батарея, нормально, разряженная (скоро устройство отключится).
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Или данный метод требует именно "заточки" под определённый вид батареи
да. и причем, не путем умножения на некоторый коэффициент, а построение таблички на несколько точек. и чем больше точек, тем точнее. и более того, при старении батареи табличка начнет давать ошибку. тут будет более разумным сделать по этому варианту:
viiv писал(а):
1) Упрощенный "показометр", немного градаций (например три) практически "полная" батарея, нормально, разряженная (скоро устройство отключится).
Спасибо - просто как-то не учёл нелинейность заряда относительно напряжению. А если по силе тока ? Как понимаю и сама схема будет простая и вроде поточнее
kakawkin, интерес чисто академический? Или для реального применения?
Если для реального применения, то проценты, "нарисованные" на экране, не сильно то и нужны. Например, есть у меня китайский термометр. Я не помню, когда я менял в нем батарейку то ли год назад, то ли два года назад. Если я увижу "осталось 30%" - это мне ровным счетом ничего не скажет: 1) я не помню 70% емкости "сожралось" за год или за два года. Т.е. я не смогу ответить на вопрос сколько еще устройство проработает (может около года, может полгода). А какая разница? Мне ведь только надо знать, что батарею пока менять рановато. 2) параметры батарей разных производителей могут "плавать". Мне что покупать только рекомендованные производителем устройства батареи? 3) В мой термометр вставляется элемент AAA, я мог поставить туда NiMH (мог поставить свежекупленный, мог поставить полудохлый), мог щелечную батарейку - разрядные характеристики у них различаются. Работает и ладно, когда скажет, что пора менять - заменю.
Если есть желание дать пользователю больше информации, нарисуй на экране напряжение батареи - пусть он сам решает, сколько ей жить осталось
Если интерес чисто академический, то как подсказал Starichok51, приближайся к реальной характеристике: Спойлер Зеленая линия - линейный закон. Видно, что получиться именно "показометр", причем очень плохой "показометр". Синяя (три линейных отрезка) - намного лучше, можно и на этом остановиться. По разрядным графикам видно, что температуру учитывать обязательно, иначе опять получится "показометр". Можно добавлять точек, можно даже сплайнами апроксимировать. Только надо прикинуть-посчитать будет ли иметь эффект такое усложнение: 1) батареи разных производителей имеют разброс характеристик, если найти в интернете разрядные характеристики для батарей различных производителей - можно прикинуть, как они согласуются с типовой. 2) Вы считаете что опорное напряжение у Вас 1.1V, резисторы в делителе напряжения точные. А в даташите: Internal Voltage Reference Vref,min=1.0V, Vref,max = 1.2V, Vref,typ=1.1V (т.е. точность опоры примерно 9%). Резисторы в делителе у Вас 5%, 1% или еще какие? Как-то калибровать Ваш измеритель напряжения батареи собираетесь? Без специальных мер вы сможете измерить напряжение батареи с точностью порядка 10%-15%. Ваши проценты остаточной емкости батареи опять оказываются "показометром". 3) Если в батарее несколько последовательных элементов, то напряжение батареи - плохой показатель. Пример: устройство питается от 3xNiMH, пользователь установил два только что заряженных (1.4V) и один "дохлый" 1V. Такая батарея долго не проживет, а напряжение батареи 3.8V (1.27V на банку) - устройство покажет, что батарея практически полная. 4)...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 32
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения