Страница 1 из 2
Измерение заряда батарейки - кто делал? Нужен совет.
Добавлено: Пт май 29, 2020 11:36:35
ARV
коллеги, наверняка вы в курсе, как без внешних компонентов (всяких делителей) можно измерять уровень питающего напряжения: в качестве "опорного" для ADC включаем AVCC, а "измеряем" напряжение источника BANDGAP; поскольку источник BANDGAP достаточно стабилен, то показания ADC будут зависеть только от уровня AVCC.
но это в теории. а на практике так кто-то делал? я столкнулся с тем, что то ли из-за шума на AVCC, то ли еще по неизвестно какой причине, показания скачут просто неприемлемым образом! сделав три замера с интервалом в 1 секунду можно получить значение "заряда" батарейки в 90%, 30% и 75%!
нужен совет от бывалых, теоретиков прошу не беспокоиться, теорию я и сам могу придумать любую.
Re: Измерение заряда батарейки - кто делал? Нужен совет.
Добавлено: Пт май 29, 2020 12:51:51
oleg110592
применял лично практически (делал управление сведодиодом ультрафиолетовым для зубников) - отлично работало. Теорию брал у практика с сайта klim.in.ua в 2011г., который сейчас вроде мертвый - там был фонарик светодиодный sepic на тини25, где это применялось + сама теория. Оттуда (с сайта):
Спойлер
В современных микроконтроллерах AVR есть недокументированная возможность, про которую почему-то мало пишут в интернетах. Есть возможность в качестве опорного напряжения выбрать AVCC, а в качестве измеряемого – опору Vbg (обычно, 1.1В) В таком случае имеем несколько плюсов: не требуется постоянная утечка тока на делителе, экономится, как минимум одна нога (что очень критично в восьминогих tiny-контроллерах) и не требуется никаких внешних компонентов.
Пока что этот вариант был опробован на МК ATTiny25V. Для вычисления напряжения питания можно воспользоваться слудующей формулой
Uavcc = 1.1*1024/ADC
Конечно, тут требуется калибровка, потому можно не заниматься вычислениями, а просто забить в EEPROM несколько значений, соответствуюзих различным уровням напряжения батареи.
Еще одно важное замечание. Переключение мультиплексора АЦП в таком режиме происходит не сразу, из-за чего первые 5-6 результатов измерения будут недостоверными (в режиме Free-Run). У меня обычно АЦП работает в непрерывном режиме с усреднением. И при переключении входов отбрасываются 1-2 выборки, но в данном случае пришлось отбрасывать 8 первых выборок.
Осталось проверить, как это будет работать на других контроллерах.
есть с того сайта исходники кодевижн, для фонарика тоже есть кодевижн, орел (плата), протеус. Надо?
Re: Измерение заряда батарейки - кто делал? Нужен совет.
Добавлено: Пт май 29, 2020 13:07:23
ARV
oleg110592 писал(а):Переключение мультиплексора АЦП в таком режиме происходит не сразу, из-за чего первые 5-6 результатов измерения будут недостоверными (в режиме Free-Run)
вот тут парадокс.
для экономии энергии free-run делать нельзя - это раз.
первые 5-6?! это два - не правда. во всяком случае в моих опытах любое количество раз дает непредсказуемо разные результаты. ЛЮБОЕ. я делал скользящее среднее на 16 и 32 выборки - даже в этом случае иногда проскакивает значение на 20-25% отличающееся от среднего!
Re: Измерение заряда батарейки - кто делал? Нужен совет.
Добавлено: Пт май 29, 2020 13:43:48
КРАМ
Батарейки измеряю через встроенный опорник регулярно (3 проекта точно есть). Но не на AVR. Собственно для ответ на вопрос "почему не работает" нужно сначала перевести МК на стационарное питание (не от батарейки) и измерять прямые показания АЦП, а не пересчетные проценты.
Конечно желателен дебаг, но можно вывести ШИМ и смотреть осциллографом дьюти равное значению АЦП.
После этого можно о чем то говорить.
ЗЫ. Даю 50% на разряженную вконец батарею, которая плохо блокирована и при пуске из слипа проваливается и не успевает выйти на номинальное значение. Какая частота осциллятора МК?
Re: Измерение заряда батарейки - кто делал? Нужен совет.
Добавлено: Пт май 29, 2020 13:54:30
ARV
КРАМ писал(а):Какая частота осциллятора МК?
32768 гц
КРАМ писал(а):Даю 50% на разряженную вконец батарею
Li-Po аккумулятор 120 мач, китайский. я бы не сказал, что никудышний: нечаянно замкнул на макетке питание - перемычка поплавилась...
КРАМ писал(а):пуске из слипа проваливается и не успевает выйти на номинальное значение
формально слипа нет, т.к. на такой частоте МК не успевает заснуть, как пора просыпаться - и это удивительно, но факт! потребление без сна 30 мкА, со сном - 35 мкА
возможные причины мне умозрительно понятны - просадки и т.п., все как бы логично. что делать - вот в чем вопрос. я ж говорю: делаю скользящее среднее на 32 отсчета! и не помогает.
Добавлено after 2 minutes 12 seconds:
кстати, при зарядке аккума индикация процента заряда идет непрерывно, и выглядит это весьма оригинально: секунд надцать показывает 80%, а потом другие надцать 40%, потом сразу 90% с минуту, а потом бац - снова 40%... хрень, короче
Re: Измерение заряда батарейки - кто делал? Нужен совет.
Добавлено: Пт май 29, 2020 14:00:27
КРАМ
[uquote="ARV",url="/forum/viewtopic.php?p=3847727#p3847727"]возможные причины мне умозрительно понятны - просадки и т.п., все как бы логично. что делать - вот в чем вопрос. я ж говорю: делаю скользящее среднее на 32 отсчета! и не помогает.[/uquote]
Еще раз. Не нужно ничего считать. Нужно просто выводить значения АЦП. Усреднение при наличии проблем вносит неопределенность.
Вообще то, подобные вещи делают с использованием осциллографа, как минимум. А лучше еще и в дебаге.
Re: Измерение заряда батарейки - кто делал? Нужен совет.
Добавлено: Пт май 29, 2020 14:11:21
oleg110592
[uquote="ARV",url="/forum/viewtopic.php?p=3847703#p3847703"]для экономии энергии free-run делать нельзя - это раз.[/uquote]
для фонарика до лампочки - он включается кнопкой, смотрим напряжение, если мало - в сон, можно еще дополнительным светодиодом подмигнуть. Нажимать кнопку желание до подзарядки должно отпасть.
У себя глянул - вообще первые 32 измерения отбрасываются, следующие 32 измерения суммируются и сдвигаются нужное количество раз (асм.).
Re: Измерение заряда батарейки - кто делал? Нужен совет.
Добавлено: Пт май 29, 2020 14:18:46
ARV
да я могу прямо на дисплей выводить значения АЦП... не проблема. вы лучше скажите технологию: куда смотреть, какие предположения строить? потому как я основные предположения и проверки уже делал... ну, что на ум пришло: смотрел шум по питанию осциллографом, батарейку замерял приличным тестером...
oleg110592 писал(а):для фонарика до лампочки
вот то-то и оно... я разве что первые 32 измерения не отбрасывал пока. но что-то мне подсказывает, что причина в ином.
я делаю так.
0. исходно АЦП выключено (регистром управления питанием PRR).
1. когда надо змерить - включаю питание АЦП,
2. разрешаю его работу,
3. настраиваю режим однократного замера,
4. делаю N замеров, усредняя результат,
5. выключаю питание АЦП,
6. индицирую полученное значение.
поскольку тактовая частота мизерная, никаких пауз между перечисленными этапами не делаю. тактовая АЦП такая же, как и у ядра, т.е. длитель не включаю. ADMUX настроен единожды при инициализации программы и не трогается более.
Re: Измерение заряда батарейки - кто делал? Нужен совет.
Добавлено: Пт май 29, 2020 14:33:08
oleg110592
на всякий как делал автор sepic фонарика (не я) - накрутил уж, там, правда ток светодиода еще замеряется
Спойлер
Код: Выделить всё
// -----------------------------------------------
// ADC interrupt service routine
#define FIRST_ADC_INPUT 7
#define LAST_ADC_INPUT 7
#define ADC_VREF_TYPE 0x80
#define ADC_FILTER_COUNT 8
volatile bit adcComplete;
unsigned char adcFilter;
unsigned int adcCurrentValue;
volatile unsigned int adcAvgValue;
interrupt [ADC_INT] void adc_isr(void)
{
if (adcFilter<=ADC_FILTER_COUNT)
adcCurrentValue+=ADCW;
if (!(--adcFilter))
{
adcComplete=1;
adcAvgValue=adcCurrentValue / ADC_FILTER_COUNT;
adcCurrentValue=0;
adcFilter = ADC_FILTER_COUNT+1;
if (!(--batteryTimer))
{
ADMUX= 12; //
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
adcFilter= ADC_FILTER_COUNT+8;
batteryTimer=200;
} else
if (batteryTimer==199)
{
adcComplete=0;
battery = 5;
while ((battery) && (adcAvgValue> batteryLevels[5-battery]))
battery--;
ADMUX = (7 | (ADC_VREF_TYPE & 0xff));
delay_us(1);
adcFilter= ADC_FILTER_COUNT+8;
ADCSRA|=0x40;
}
}
}
Re: Измерение заряда батарейки - кто делал? Нужен совет.
Добавлено: Пт май 29, 2020 14:39:51
КРАМ
[uquote="ARV",url="/forum/viewtopic.php?p=3847743#p3847743"]да я могу прямо на дисплей выводить значения АЦП... не проблема. вы лучше скажите технологию:[/uquote]
Какую еще "технологию", когда вы делаете кучу действий вместо того, чтобы вообще все убрать, включая манипуляции с включением-выключением АЦП и ПРОСТО ИЗМЕРЯТЬ на непрерывно работающем МК встроенный опорник, выталкивая значения АЦП на индикацию?
И только убедившись в том, что показания стабильны в таком простом режиме, переходить к пошаговому добавлению функционала (сначала включать-выключать АЦП, потом падать в слип и лишь потом считать проценты, а в самом конце усреднять)
Re: Измерение заряда батарейки - кто делал? Нужен совет.
Добавлено: Пт май 29, 2020 14:43:40
ARV
КРАМ писал(а):И только убедившись в том, что показания стабильны в таком простом режиме, переходить к пошаговому добавлению функционала (сначала включать-выключать АЦП, потом падать в слип и т.д.)
хорошо, вечерком далеко от компа не отходите - я отчитаюсь о результатах
а пока что задам вопрос: мне нужно измерять именно в том режиме, как я накрутил, а вы говорите - провести тест в идеальном режиме. я не могу понять, чем мне это поможет? при любом раскладе (хоть показания будут стабильны, хоть будут продолжать скакать) ответа на вопрос "что делать?" я так и не получу...
Re: Измерение заряда батарейки - кто делал? Нужен совет.
Добавлено: Пт май 29, 2020 14:52:09
КРАМ
[uquote="ARV",url="/forum/viewtopic.php?p=3847761#p3847761"]я не могу понять, чем мне это поможет? при любом раскладе (хоть показания будут стабильны, хоть будут продолжать скакать) ответа на вопрос "что делать?" я так и не получу...[/uquote]
Сразу видно, что к схемотехнике вы не имеете никакого отношения.
Пока что я не верю в адекватность представленного результата из-за кучи лишних действий, которые могут сами по себе создать десятки разных причин с таким конечным результатом.
Я не собираюсь гадать на кофейной гуще, пользуясь вашими заверениями в том, что вы написали адекватный код.
Задача проста, но это СИГНАЛЬНАЯ задача и формально безупречный код может не работать совершенно из-за неверного его взаимодействия с диаграммами работы устройства, неверно ожидаемых размерностей и много чего еще.
Единственный надежный способ обнаружить проблему - упрощение задачи до предела и разделение тем самым причин возникшей ситуации.
Re: Измерение заряда батарейки - кто делал? Нужен совет.
Добавлено: Пт май 29, 2020 15:24:54
ARV
КРАМ писал(а):разу видно, что к схемотехнике вы не имеете никакого отношения
какое-то все же имею...
ладно, попробую сделать по-вашему, ибо это и в самом деле то, чего я еще не пробовал... ну и отброс первых N значений тоже не пробовал.
вечером проверю
Re: Измерение заряда батарейки - кто делал? Нужен совет.
Добавлено: Пт май 29, 2020 16:28:58
Ivanoff-iv
может экземпляр кривой?
или может попробовать АЛУ отключать на время измерений (усыплять)
ещё может попробовать на более высоких тактовых и с бо́льшим делителем попробовать чтобы исключить влияние импульсных помех (частота хоть низкая, но фронты то по прежнему резкие)
Re: Измерение заряда батарейки - кто делал? Нужен совет.
Добавлено: Пт май 29, 2020 16:34:43
ARV
Ivanoff-iv писал(а):АЛУ отключать на время измерений (усыплять)
попробую, если ничего больше не поможет. накладно это все на моих частотах...
Ivanoff-iv писал(а):попробовать на более высоких тактовых
а вот это и пробовать не буду - тактовая у меня только такая, как я написал. 30 мкА - это важно.
Re: Измерение заряда батарейки - кто делал? Нужен совет.
Добавлено: Пт май 29, 2020 16:45:45
КРАМ
[uquote="ARV",url="/forum/viewtopic.php?p=3847832#p3847832"]а вот это и пробовать не буду[/uquote]
Если отвлечься от скважности активной работы и рассмотреть общий случай, то повышение тактовой частоты в активной работе приводит к уменьшению среднего потребления за счет того, что рост тока потребления нелинейно зависит от частоты из-за ненулевого потребления на низких тактовых. То есть время исполнения кода в активном режиме падает быстрее с ростом частоты, чем увеличивается ток потребления. Так же никто не отменял динамическую редукцию скорости путем переключения осцилляторов на лету.
Re: Измерение заряда батарейки - кто делал? Нужен совет.
Добавлено: Пт май 29, 2020 16:50:01
Ivanoff-iv
если не сильно большая точность нужна... я както делал фонарик на тини 2313 с контролем батареи, замер осуществлялся по скорости заряда конденсатора от батарейки через резистор (в этой тине есть компарктор с опорой и регистр захвата на 16 битном таймере) вот только нужен конденсатор с хорошим ТКЕ...
потребление такой схемы между замерами =0, т.к. конденсатор пост. ток не пропускает
Re: Измерение заряда батарейки - кто делал? Нужен совет.
Добавлено: Пт май 29, 2020 16:58:28
КРАМ
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3847842#p3847842"]замер осуществлялся по скорости заряда конденсатора от батарейки через резистор[/uquote]
Если в МК есть опорник, то это совершенно лишняя сущность и лишняя комплектация.
Re: Измерение заряда батарейки - кто делал? Нужен совет.
Добавлено: Пт май 29, 2020 17:05:45
Ivanoff-iv
Перрреведи...

в смысле не понял, какая сущность лишняя и как обойтись без неё?
Re: Измерение заряда батарейки - кто делал? Нужен совет.
Добавлено: Пт май 29, 2020 17:15:34
serg_svd
ARV, не стоит этим методом пользоваться. Он весьма не точный, так величина BANDGAP хоть и заявлена в даташите, но ее величина нестабильна и сильно зависит от питающего напряжения, которое Вы собственно говоря, и пытаетесь измерять. Я подобный вопрос поднимал на этом форуме. С ходу не найду. И если не ошибаюсь, то Вы мне еще и помогали советами. Я тогда помучался прилично и забросил эту идею. Хоть и промелькнула такая идея в интернете и многие сайты ее перепечатывают, но что-то никто не применяет. даже на нашем форуме я не припомню таких схем, где бы применялся этот метод.
Гораздо надежнее измерять обычным методом, подав напряжение с батареи на делитель напряжения. При этом, для экономии заряда батареи, нужно выделить еще один порт МК, который бы управлял подачей напряжения батареи на делитель через полевик только в моменты измерения. Так как использовать порт микроконтроллера напрямую уже нельзя. Появляется дополнительная погрешность.
На крайнем конкурсе была статья про карманную метеостанцию. Её автор так и измерял напряжение на батарее.