Как измерять напряжение автономного питания на Arduino Nano.
- Войдите на сайт для отправки комментариев
Втр, 01/02/2022 - 13:45
Я сейчас делаю что-то наподобие геймпада на Arduino Nano. Питается в се это дело от аккумулятора 3.7V. Как измерять напряжение на аккумуляторе, не подключая внешний источник питания?
AnalogRead()
При таком способе всегда возвращается значение 1023.
И analogReference(INTERNAL)
И через делитель
При таком способе всегда возвращается значение 1023.
Потому что по умолчанию в качечтве опорного напряжения используется напряжение питания.
Делитель на резисторах 1кОм-1кОм подойдет?
Делитель нужно такой что бы 4.2 привелось к 1.1
Делитель на резисторах 1кОм-1кОм подойдет?
нет
Делитель на резисторах 1кОм-1кОм подойдет?
Нет. Внутренний источник опорного - 1,1В, поэтому на аналоговый вход должно приходить не больше. Нужен делитель 1/4 хотя бы.
И еще - раз делается автономное устройство, то нужно понимать, что через делитель постоянно будет протекать ток, что не есть хорошо для автономности. Стало быть и сопротивления делителя нужно подбирать для минимизации этого тока
Гугль: секретный вольтметр.
Какой делитель? Ничего не нужно!
Замеряешь внутренне опорное напряжение как можно тщательнее, записываешь. Это можно сделать очень просто, установить аналогрефференс на внутреннее 1,1В и на пине реф замерить сколько там на самом деле. Как можно точнее. Лучше несколько раз и усреднить.
Затем, уже в коде, программно измеряешь значение внутреннего опорного (от питания) и, зная какое там опорное (не зря измеряли), вычисляешь питание. Делов-то на копейку.
Функции нужно передать замеренное ранее значение внутреннего опорного напряжения, умноженное на 10000 (т.е. если оно 1,1В, то передавать надо 11000).
Строка №10 может и не нужна, у меня просто прямо здесь же включается питание ADC через PRR. Вот и даю ему время стабилизироваться.
... и на пине реф замерить сколько там на самом деле...
Физически (прибором) замерить как я понимаю.
только вчера же был вопрос про то как измерить напряжение питания на СТМ32 :
http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/izmerenie-vdd-na-stm32-v-arduino
на Нано все измеряется точно по такому же принципу, никакие внешние делители нафик не нужны
ЕвгенийП, а зачем измеряемое значение adc описано const? (строка 15)
Какой делитель? Ничего не нужно!
Замеряешь внутренне опорное напряжение как можно тщательнее, записываешь. Это можно сделать очень просто, установить аналогрефференс на внутреннее 1,1В и на пине реф замерить сколько там на самом деле. Как можно точнее. Лучше несколько раз и усреднить.
Затем, уже в коде, программно измеряешь значение внутреннего опорного (от питания) и, зная какое там опорное (не зря измеряли), вычисляешь питание. Делов-то на копейку.
Функции нужно передать замеренное ранее значение внутреннего опорного напряжения, умноженное на 10000 (т.е. если оно 1,1В, то передавать надо 11000).
Строка №10 может и не нужна, у меня просто прямо здесь же включается питание ADC через PRR. Вот и даю ему время стабилизироваться.
Евгений! Вы старому киповцу сломали мозг, я то по наивности думал, что AREF аналогичен ИОНу, ан нет... )))
... и на пине реф замерить сколько там на самом деле...
Физически (прибором) замерить как я понимаю.
Да, там по даташиту 1,1В но допустим разброс от экземпляра к экземпляру. Так чтобы результат был точнее, лучше замерять у конкретного экземпляра.
ЕвгенийП, а зачем измеряемое значение adc описано const? (строка 15)
Ну, мы же не собираемся его менять? Просто, общеполезное правило: не собираешься менять - пиши const. Чаще всего не влияет ни на что, но бывают случаи, когда это помогает оптимизатору.
Евгений! Вы старому киповцу сломали мозг, я то по наивности думал, что AREF аналогичен ИОНу, ан нет... )))
Так, вроде, так и есть. А в чём беда?
Замеряем внутреннее опорное мультиметром, потом замеряем внутреннее опорное программно и, зная внутреннее опорное (замеренное), вычисляем напряжение питания... Мой мозг никак не вернётся в исходное состояние после таких вывертов. А можно поподробнее, для нубов? ))
Какой делитель? Ничего не нужно!
Замеряешь внутренне опорное напряжение как можно тщательнее, записываешь. Это можно сделать очень просто, установить аналогрефференс на внутреннее 1,1В и на пине реф замерить сколько там на самом деле. Как можно точнее. Лучше несколько раз и усреднить.
Затем, уже в коде, программно измеряешь значение внутреннего опорного (от питания) и, зная какое там опорное (не зря измеряли), вычисляешь питание. Делов-то на копейку.
Функции нужно передать замеренное ранее значение внутреннего опорного напряжения, умноженное на 10000 (т.е. если оно 1,1В, то передавать надо 11000).
Строка №10 может и не нужна, у меня просто прямо здесь же включается питание ADC через PRR. Вот и даю ему время стабилизироваться.
А не так давно у меня поломался мультиметр... Ладно, буду другой платой замерять.
ЕвгенийП В формуле из 16 строки нет ошибки ??? если adc в диапазоне 0-1023, то результат очень странный !
ЕвгенийП В формуле из 16 строки нет ошибки ??? если adc в диапазоне 0-1023, то результат очень странный !
да, какая-то странная формула. Я обычно считаю проще
VCC = Vref *1024/adc;
тююю мужики...
вы что, в первый раз этот способ видите? Он же во всех книжках "ардуино для чайников" есть...
тююю мужики...
вы что, в первый раз этот способ видите? Он же во всех книжках "ардуино для чайников" есть...
Первый. Но мне физика процесса непонятна. Я считал, что внутреннее опорное напряжение от напряжения питания не зависит ))
так этот способ и основан именно на том, что опорное от питания не зависит.
А математически это обычная пропорция. Измеряем опорник относительно питания. Получаем, скажем, 200 единиц. Зная. что эти 200 единиц должны соответвовать опорному напряжению 1.1в , легко посчитать. сколько вольт соответвуют полной шкале ADC 1023 единицы
b707 именно по этому и усомнился в формуле
Ага, значит в описании таки пропущено, что программно меряем опорное при analogReference(DEFAULT). Тогда все становится на свои места ))
Не, приписку "от питания" я видел, но не сообразил...
Евгений! Вы старому киповцу сломали мозг, я то по наивности думал, что AREF аналогичен ИОНу, ан нет... )))
Так, вроде, так и есть. А в чём беда?
да думал, что опорные напряжения подгоняются на каждом экземпляре контроллера, наивен был...
PS вот вчера, впервые за 7 лет выбил один порт, A0, а до сего момента не сжёг ни одной ардуины и ни одного порта... )))
Какой делитель? Ничего не нужно!
Замеряешь внутренне опорное напряжение как можно тщательнее, записываешь. Это можно сделать очень просто, установить аналогрефференс на внутреннее 1,1В и на пине реф замерить сколько там на самом деле. Как можно точнее. Лучше несколько раз и усреднить.
Затем, уже в коде, программно измеряешь значение внутреннего опорного (от питания) и, зная какое там опорное (не зря измеряли), вычисляешь питание. Делов-то на копейку.
Функции нужно передать замеренное ранее значение внутреннего опорного напряжения, умноженное на 10000 (т.е. если оно 1,1В, то передавать надо 11000).
Строка №10 может и не нужна, у меня просто прямо здесь же включается питание ADC через PRR. Вот и даю ему время стабилизироваться.
Сейчас проверил. Оно возвращает всегда 0...
Сейчас проверил. Оно возвращает всегда 0...
а так:
Сейчас проверил. Оно возвращает всегда 0...
пробуйте вот это
взято вот отсюда:
https://blog.unlimite.net/?p=25
ЕвгенийП В формуле из 16 строки нет ошибки ??? если adc в диапазоне 0-1023, то результат очень странный !
да, какая-то странная формула. Я обычно считаю проще
VCC = Vref *1024/adc;
Точно такая же формула, только прежде, чем делить на adc я прибавляю половину adc - для более точного округления
А потом делю на 1000 (предварительно прибавив 500, тоже для более точного округления).
Деление на 1000 объясняется так. Vref мы взяли умноженным на 10000, а результат делим на 1000. Значит, окончательный результат получается в десятых долях вольта, что мне и нужно было.
Сейчас проверил. Оно возвращает всегда 0...
Вы бредите. У меня это работает годами во всех батарейных устройствах.
Давайте Ваш код целиком.
ЕвгенийП а умножение на 1024? посмотрите #24
а так:
С float? Не стыдно?
ЕвгенийП а умножение на 1024? посмотрите #24
Что умножение? Так же, как и у b707
А что в №24, я не знаю про что это.
Сейчас проверил. Оно возвращает всегда 0...
пробуйте вот это
взято вот отсюда:
https://blog.unlimite.net/?p=25
Результат есть. Но он "прыгает" с одного значения на другое, но это не критично (~+-15mV). Про точность значения я еще не знаю, не проверял, но полуразряженный аккумулятор показывает более-менее корректно.
...результат получается в десятых долях вольта...
Вот этого не разглядел и запутался
...результат получается в десятых долях вольта...
Вот этого не разглядел и запутался
Вы не один такой)
aloyen, так где Ваш код, какие там нули? Или сами разобрались с косяками?
Komandir, так это удобно, точнее-то нафиг не нужно.
aloyen, так где Ваш код, какие там нули? Или сами разобрались с косяками?
Я делал замеры в loop() каждые 0.5 секунд, затем их выводил на oled экран (библа OLED_I2C), предварительно переведя все это в String. На экране просто выводилось значение 0.00 и ничего более.
Я делал замеры в loop() каждые 0.5 секунд, затем их выводил на oled экран (библа OLED_I2C), предварительно переведя все это в String. На экране просто выводилось значение 0.00 и ничего более.
Я же Вам сказал, что если она выводит 0, значит Вы что-то накосячили с её использованием. Покажете код - скажу где косяк. Не покажете - мне пофиг.
Я делал замеры в loop() каждые 0.5 секунд, затем их выводил на oled экран (библа OLED_I2C), предварительно переведя все это в String. На экране просто выводилось значение 0.00 и ничего более.
Я же Вам сказал, что если она выводит 0, значит Вы что-то накосячили с её использованием. Покажете код - скажу где косяк. Не покажете - мне пофиг.
int
volt = getBatteryVoltage(110000);
int
volt = getBatteryVoltage(110000);
Воо. Теперь заработало и довольно точно (погрешность около 10mV). Спасибо.
int
volt = getBatteryVoltage(110000);
Нет. 11000
Я же писал
Функции нужно передать замеренное ранее значение внутреннего опорного напряжения, умноженное на 10000 (т.е. если оно 1,1В, то передавать надо 11000).
Чего ж никто читать-то не умеет?
С float? Не стыдно?
ни капельки, идея была чтобы ТС удостоверился, что накосячил... и таки да, тут косячить практически негде, а вот если подставить измеренное значение ИОН будет даже почти прилично считать...
В общем, мне это надоело. Я добавил полную инициализацию ADC, чтобы ни от кого и ни от чего не зависеть (какой там референс до меня был и т.п.) и убрал маленькие функции.
Вот полный, готовый для запуска тест - всё нормально работает.