Вопрос по analogReference()

nkk
nkk аватар
Offline
Зарегистрирован: 18.03.2016

Можно ли в Ардуино на 3.3В при analogReference(EXTERNAL) подавать на вывод AREF напряжение выше 3.3В ?

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

При понижении напряжения RAW питания Ардуины, рассчитанной на 3.3В, напряжение на VCC "немного меньше" входного. Думаю, организовать отслеживание разряда аккумулятора и самоотключение. Если это правильно делать по-другому, подскажите, как.

 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

В даташите прямо написано: "Voltage on any Pin except RESET with respect to Ground -0.5V to VCC+0.5V". 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

nkk, напряжение на ноге AREF не должно быть менее 1 вольта и более, чем AVCC. Т.е. если у вас ноги  М.К. AVCC и VCC соединены вместе, и на них подано 3,3в -то не более, чем 3.3 вольта.

nkk
nkk аватар
Offline
Зарегистрирован: 18.03.2016

Чё-то я совсем не понимаю. Сложно )))

Проще забить на проблему и пользовать более мощный аккумулятор, заблаговременно его отключая.
Устройство потребляет до 200 мА, ёмкости 2.4 Ач на день точно должно хватить

axill
Offline
Зарегистрирован: 05.09.2011

Ничто не мешает подать напряжение через резистивный делитель. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

axill,

я вот так всегда и делаю, но не могли бы Вы прояснить для меня одну вещь.

В даташите на стр. 244 написано: "The ADC is optimized for analog signals with an output impedance of approximately 10 k or less". Т.е. 10кОм или меньше. Но с другой стороны, чем меньше, тем больше ток через делитель.

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

Правильно ли я поступаю?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ЕвгенийП, по-моему товарищи из Атмела просто забыли уточнить, что всё это желательно только если идёт оцифровка высокочастотных сигналов. Дабы паразитная ёмкость входа АЦП успевала перезаряжаться. Для измерения постоянного напряжения или низкочастотных источников сигнала занижать импенданс уже не нужно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ЕвгенийП, ну да. До единиц МОм проблем не должно быть. Правда коль уж об этом заострилась речь -существуют и другие мнения, что тот конденсатор подключается к входной цепи только на момент измерения, и наоборот не успевает заряжаться. Если это так, то нужно дополнительно поставить ёмкость на аналоговом входе. Она "даст току" той ёмкости, и все всё успеют.  Переменку с ней уже не измерить, зато с постоянкой точно не помешает, будет дополнительным фильтром.   Так что высокоомный делитель + кондюк по входу удовлетворит любым теориям :)

nkk
nkk аватар
Offline
Зарегистрирован: 18.03.2016

Есть такая схема и NPN-транзистор, похожий на BC817:

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

1. Если Ардуино рассчитана на 3.3В, на каком напряжении аккумулятора на выводе, который соединён с базой транзистора, будет такой ток и напряжение, что транзистор "закроется"? Какой нужен резистор?

2. Нужно ли перенастраивать ШИМ на выводе, который соединён с базой транзистора, и нужно ли туда добавить конденсатор для сглаживания колебаний?

nkk
nkk аватар
Offline
Зарегистрирован: 18.03.2016

3. Ардуино "сама отключится", или всё-таки нужно строить делитель, проверять напряжение и отключать программно, но тогда же не получится отключить ровно ари 3.3В так как реверенстное напряжение (питания) тоже будет падать - получится только отсделить состояние, когда разниув напряжения на аккумуляторе и после стабилизатора Ардуино будет составлять некую минимальную величину (3.5В)?

axill
Offline
Зарегистрирован: 05.09.2011

Не надо транзистор

во первых если ставить то полевик, ибо на npn падает до 0.6в

во вторых сам МК достаточно усыпить, чтобы практически ничего не жрал, достаточно позаботиться о переферии

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

nkk
nkk аватар
Offline
Зарегистрирован: 18.03.2016

Ну, так как аккумулятор конкретно в моём случае - от телефона (Nokia BL-5CB), то там есть встроенная защита. А периферия: SD-карта и GPS-модуль, запитаны от VCC Ардуино.

axill
Offline
Зарегистрирован: 05.09.2011

Встроенная зазита должна сама все отключить

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

nkk, вы городите чудовищный колхоз. Вообще ничего не нужно, всё время об этом пишу, но опять и опять народ тычет литий в стабилизатор. Измеряете напругу методом из ссылки, и если ниже 3х вольт то отправляете дуню в сон. Вот и всё.

axill
Offline
Зарегистрирован: 05.09.2011

Кстати кроме сна еще есть вариант активировать BOD. Тогда ничего замерять не нужно. Это плюс. Еще плюс в том, что потребление МК в состоянии ресет не зависит от ошибок программы и меньше, чем потребление в режиме power-down. Минус тоже есть - BOD кушает свои 5-10мкА

nkk
nkk аватар
Offline
Зарегистрирован: 18.03.2016

Понял, спасибо, прикльно оно выводит напряжение на VCC!

Но sd-карта и gps-модуль смогут нормально работать при напряжении 3.5-4.2В?

Может, лучше на RAW подавать и так же отслеживать, когда напряжение ниже 3.15В опустится?

857869318a.png
^- так разряжался у меня 18650, но, думаю, с телефонным li-po будет похожий график,
то есть, при 3.15 или при 3.0 отключать разница не большая, но при 3.3 может еще минут 10 поработать.

А при напряжении на стабилизаторе ниже 3.3В, напряжение на VCC будет где-то на 0.15 В меньше (кажется)

nkk
nkk аватар
Offline
Зарегистрирован: 18.03.2016

Включил сейчас модуль этот http://www.aliexpress.com/item/Free-Shipping-Pro-Mini-168-Mini-ATMEGA168-5V-16MHz-For-Arduino-Compatible-With-Nano/32551909986.html

5V подал на RAW - получил ~3.677

Получается, он не на 5В? или это из-за того, что напряжение 5V, а не 7? У Ардуино на 3.3 не такая большая разница!

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

nkk пишет:

5V подал на RAW - получил ~3.677
 
Получается, он не на 5В? или это из-за того, что напряжение 5V, а не 7? У Ардуино на 3.3 не такая большая разница!

RAW - это вход линейного стабилизатора напряжения. С него нельзя снять на выходе столько же, сколько подано на вход. Потому что у линейного стабилизатора есть некоторое падение напряжения, обычно около 1-2В. Поэтому на 5В стабилизатор надо подавать минимум 7В.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Здравствуйте.

Ардуино нано питается от 4 Вольт, нужно измерять напряжение 0-20Вольт

использую резисторный делитель 1к/20k (при 20 Вольтах на входе ардуино будет ~952мВ)

analogReference(INTERNAL);
#define R1 20000.0
#define R2 1000.0


void voltmeter () {
  float Vbat = (analogRead(A1) * 1.1) / 1024.0;
  float del = R2 / (R1 + R2);
  float Vin = Vbat / del;
  Serial.println(Vin);
}

В протеусе получаю 11,96 Вольт (батарейка 12 Вольт)

Это верно?

Еще, R2/(R1+R2) или (R1+R2)/R2 и почему?

И ещё вопрос, если при использовании analogReference(INTERNAL) на аналоговый вход попадет напряжение более 1,1 Вольт но менее 5 вольт я получу только неверные показания, со входом ничего не случится?

 

 

nik182
Offline
Зарегистрирован: 04.05.2015

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

Точность всех элементов не велика. 11.96 вполне нормально.

Напряжение на нижнем резисторе равно ток цепи (напряжение делённое на сумму резисторов) умноженный на номинал резистора. Поэтому R2/(R1+R2) 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Спасибо. Как быстро ответ получила.))))

SAB
Offline
Зарегистрирован: 27.12.2016

Вот видите, как важно вопрошать глядя в глаза:)

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

SAB пишет:

Вот видите, как важно вопрошать глядя в глаза:)


Ахахах, где Вы были раньше, я бы давно так вопрошала XDDDD
Pyotr
Offline
Зарегистрирован: 12.03.2014

Правильней 

float Vbat = ((analogRead(A1) + 0.5) * 1.1) / 1024.0;

nik182
Offline
Зарегистрирован: 04.05.2015

А 0.5 объяснить можешь?

b707
Offline
Зарегистрирован: 26.05.2017

nik182 пишет:
А 0.5 объяснить можешь?

не стоит, опять будет флейм на 2 страницы

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

nik182 пишет:
А 0.5 объяснить можешь?

не стоит, опять будет флейм на 2 страницы

да ладно уж, пусть объяснит

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

nik182 пишет:
А 0.5 объяснить можешь?

Округляем до ближайшей линии сетки V/1024 или округляем вниз. Статистический анализ из очень старого срача с моим участием показал, что +0.5 чуть-чуть адекватнее! ;)))))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

wdrakula пишет:

nik182 пишет:
А 0.5 объяснить можешь?

Округляем до ближайшей линии сетки V/1024 или округляем вниз. Статистический анализ из очень старого срача с моим участием показал, что +0.5 чуть-чуть адекватнее! ;)))))

тогда наверное analogRead(A1) * 1.1 +0.5?

nik182
Offline
Зарегистрирован: 04.05.2015

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

Pyotr
Offline
Зарегистрирован: 12.03.2014

Впервые это увидел у Ника Гаммона. Но он не объяснял почему так, насколько помню.

При опорном 5 В analogRead()  возвращает целое количество "кусочков" напряжения по 4.8828мВ. При входном 4.8 В этих кусочков будет ноль. Это не совсем правильно.

При входном 5 В analogRead() возвращает 1023. 1023 * 5 / 1024 = 4.995 В. Опять не хватает этих 4.88 мВ.

Прибавляя к analogRead() 0.5, расчетные напряжения будут приходиться на середину этих кусочков. 

Также, при оверсемплинге, читая например четыре раза analogRead() значением по 1023, получим 4092, а не 4095. А прибавляя к analogRead() 0.5, получим 4094, что ближе к максимальному 12-битному значению.

Если мутно написал, то берем однобитный АЦП - digitalRead() и измеряем напряжение на пине (0-5 В). Это даст либо 0 В, либо 2.5 В.
А вот 
digitalRead()+0.5 даст 1.25 или 3.75 В, что ближе к истине. Это и есть середина одного из двух кусочков по 2.5 В.
 

nik182
Offline
Зарегистрирован: 04.05.2015

Подели на 1023 и не будет необходимости 0.5 вставлять. Но если взять есп32 то все эти рассуждения вообще далеко от реалий оцифровки.

Pyotr
Offline
Зарегистрирован: 12.03.2014

nik182 пишет:
Подели на 1023 и не будет необходимости 0.5 вставлять. Но если взять есп32 то все эти рассуждения вообще далеко от реалий оцифровки.

Значений 1024, а делить на 1023? Выше мой пост точно читали?))

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

b707
Offline
Зарегистрирован: 26.05.2017

я ж говорил что будет срач :)

Честно говоря, мне кажется разница +0,5 и наоборот настолько несущественна, что не стоит обсуждения. Надо просто выбрать любую из двух систем и всегда ее придерживаться. 

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

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

ua6em пишет:

тогда наверное analogRead(A1) * 1.1 +0.5?

а вот это бред :)

Надеюсь с этим согласны все и срача не будет:)

nik182
Offline
Зарегистрирован: 04.05.2015

Исключительно для размышления. Точек 1024 а интервалов между точками, которые собственно и являются теми ячейками, куда АЦП во время работы складывает результат 1023. То есть если АЦП залито по полной, значение 1023. Или 4095 для 12 битного. Что соответствует референсному напряжению.
Отвечать на этот пост можно не надо. Я уже писал, что как то всё это перешло в раздел веры. Вот только обидно когда адепты 1024 агитируют молодёжь в свои ряды, закрывая глаза на явные ляпы.

b707
Offline
Зарегистрирован: 26.05.2017

nik182 пишет:
Отвечать на этот пост можно не надо. .

Мнение это руками обеими поддерживаю я...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

я ж говорил что будет срач :)

Честно говоря, мне кажется разница +0,5 и наоборот настолько несущественна, что не стоит обсуждения. Надо просто выбрать любую из двух систем и всегда ее придерживаться. 

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

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

ua6em пишет:

тогда наверное analogRead(A1) * 1.1 +0.5?

а вот это бред :)

Надеюсь с этим согласны все и срача не будет:)

цитирую - Напряжение  поданное на аналоговый вход, обычно от 0 до 5 вольт будет преобразовано в значение от 0 до 1023... видим - целочисленные значения и как к ним добавить 0,5? А вот когда переведём во float - видимо можно округлить до целых в большую сторону, если напряжение попадает в диапазон выше чем  ххх.5 до ххх.9

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

dimax пишет:

е

Тсссс! Это новая традиция рождается! На 31-ое января. Как баня у Лукашина.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

так пятница жеж, их никто не отменял, да и время есть до НГ )))

Pyotr
Offline
Зарегистрирован: 12.03.2014

wdrakula пишет:

 

Тсссс! Это новая традиция рождается! На 31-ое января. Как баня у Лукашина.

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

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Я утром смешал песто "лайт" заменив кедровые орехи арахисом. Потом подмазку в тарталетки под икру, масло пополам с макарпоне плюс петрушка и чеснока зубок. Тарталетки имеют вкус подмазки, а икра, матьеё не чуствуется вааще, какое-то говно с рынка! Аж зло берет! Потом я нашпиговал кусман лопатки на 4 кг в духовку в качестве буженины и натер её кучей всего (если интересно, то: уцхо сунели. паприка, паприка копченая, черный перец, эстрагон, кайенский перец, соль). Потом сел и стал провожать Старый Год под "Бонда" У меня на диске полна коллекция, выбрал "Завтра не умрет никогда", про газетного  магната.

Еще трезвый почти! Гости только к 21 приедут.

Pyotr
Offline
Зарегистрирован: 12.03.2014

nik182 пишет:
Исключительно для размышления. Точек 1024 а интервалов между точками, которые собственно и являются теми ячейками, куда АЦП во время работы складывает результат 1023. То есть если АЦП залито по полной, значение 1023. Или 4095 для 12 битного. Что соответствует референсному напряжению. Отвечать на этот пост можно не надо. Я уже писал, что как то всё это перешло в раздел веры. Вот только обидно когда адепты 1024 агитируют молодёжь в свои ряды, закрывая глаза на явные ляпы.

Ну если можно)))

первый интервал 0-4.88 мВ. Возвращаемое значение АЦП = 0.

1024-й интервал 4.995-5В. АЦП=1023.

Точек 1025 аж целых штук)))

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Пойду добавлю еще 0.7

С надвигающимся ++! 

nik182
Offline
Зарегистрирован: 04.05.2015

Pyotr пишет:

первый интервал 0-4.88 мВ. Возвращаемое значение АЦП = 0.

1024-й интервал 4.995-5В. АЦП=1023.

Точек 1025 аж целых штук)))


Вот из таких заблуждений и возникают споры. Пока интервал не наполнится значение АЦП не перещёлкнется. Первый интервал верно. До 4.88мВ будет выдавать 0. А вот 1024-го интервала нет. Есть 1023-й. И пока он не наполнен значение АЦП 1022. Соответвенно 1023 случится от 5В и выше.
Про наполнен исключительно ассоциация наливания заряда в ёмкости АЦП STMок.

ddr2
Offline
Зарегистрирован: 27.12.2020

А был ответ что документация Атмеги328 советует делить на 1024 ? )

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А давайте переведём разговор из холиварного в научное русло.

Округление до целого прибавлением 0,5 с последующим отбрасыванием дробной части, это т.н. «привязка к бесконечности» - одно из пяти правил округления, предусмотренных стандартом IEEE 754 (IEC 60559).

Но там есть и другое правило – «привязка к чётному». Разница в том, что делать, когда округляемое число содержит ровно пять десятых.

  1. при «привязке к бесконечности» оно окгруглится к большему по модулю.
  2. а при «привязке к чётному» – до ближайшего чётного.

У кого-нибудь есть идеи для чего эту «привязку к чётному» придумали? Что она даёт и чем так хороша, что даже в стандарт попала? Так-то вроде – она гораздо сложнее и затратнее.

P.S. Виноват, бес попутал (вроде, и не отмечал пока ещё). Прибавление 0,5 и отбрасывание - это привязка к плюс бесконечности (а не просто к бесконечности). А дальше в п. 1 и 2 я описал именно привязку к бесконечности. Извиняйте. Но суть дела не меняется - все эти способы стандартом предусмотрены.

sadman41
Offline
Зарегистрирован: 19.10.2016

Еврейские фокусы, не иначе.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Граф, тут в твой огород чёта полетело. Признавайся, ты придумал?

nik182
Offline
Зарегистрирован: 04.05.2015

Осваивал АЦП МК на MSP430. До сих пор считаю у TI лучшая документация. Например из https://www.ti.com/lit/ug/slau406f/slau406f.pdf . Это параграф про АЦП. 12 бит. Результат оцифровки (1.2.1) N=4095*Vin/Vref . Совсем не 4096.