Опорное напряжение
- Войдите на сайт для отправки комментариев
Здравия.
Кто подробно объяснит, про "analogReference(EXTERNAL);"?
В сети, так "понятно и подробно" описана эта функция, что слов нет.
К примеру:
"При использовании внешнего источника опорного напряжения, напряжение на выводе AREF должно быть строго в пределах от 0 до 5 В! При этом перед вызовом функции analogRead() нужно обязательно установить тип источника как EXTERNAL. В противном случае, возможно короткое замыкание внутреннего источника опорного напряжения с выводом AREF, что может привести к повреждению микроконтроллера на вашей плате Ардуино.
Подобную ситуацию также можно предотвратить, если внешний источник опорного напряжения соединять с выводом AREF через резистор номиналом 5 кОм. Такое соединение даст возможность переключаться между внутренним и внешним опорным напряжением. Однако, при этом следует иметь ввиду, что резистор изменит величину опорного напряжения, поскольку вывод AREF соединяется с внутренним резистором номиналом 32 КОм. Два резистора образуют делитель напряжения, таким образом, например, 2.5В, приложенные через резистор, в итоге дадут 2.5 * 32 / (32 + 5) = ~2,2 В на выводе AREF."
Это как понимать?
Везде написано, что AREF это "ВЫХОД" и на него подается внешнее опорное напряжение.
Вообще то, " AREF тогда, по логике, должен быть "ВХОДОМ"...
А вот это - " При этом перед вызовом функции analogRead() нужно обязательно установить тип источника как EXTERNAL. В противном случае, возможно короткое замыкание внутреннего источника опорного напряжения с выводом AREF, что может привести к повреждению микроконтроллера на вашей плате Ардуино."
Прежде чем объявить функцию "analogReference(EXTERNAL);", нужно объявить функцию "analogReference(EXTERNAL);"? А это не масло масленное?
Если можно на примере, объяснить...
К примеру:
Если на "выход или все-таки вход" "AREF" подать опорное напряжение с микросхемы "REF03" 2,5 вольта.
И как как в скетче указать, что было подано на " AREF ", именно 2,5 вольта?
Что произойдет с датчиками, подключенными к аналоговым входам?
Нужен ли резистор в 5 кОм?
Ведь по сути, из более-менее точного напряжения, с этим резистором, мы теряем эту точность, даже в описании в сети говорится, что из-за получившегося делителя (с внутренним резистором в 32 КОм), получится примерно 2,2 вольта, то есть" + - "километр.
Тогда какой смысл во всем этом?
И еще,
Функция
float Read_Voltage_Vcc() // Функция расчета и определения напряжения на Vcc Arduino
{
// Read 1.1V reference against AVcc
// set the reference to Vcc and the measurement to the internal 1.1V reference
#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
ADMUX = _BV(MUX5) | _BV(MUX0);
#elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
ADMUX = _BV(MUX3) | _BV(MUX2);
#else
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#endif
delay(75); // Wait for Vref to settle
ADCSRA |= _BV(ADSC); // Start conversion
while (bit_is_set(ADCSRA, ADSC)); // measuring
uint8_t low = ADCL; // must read ADCL first - it then locks ADCH
uint8_t high = ADCH; // unlocks both
long result = (high << 8) | low;
result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
return result; // Vcc in millivolts
}
Вроде бы работает не плохо.
Но ситуация такая.
Если измерять напряжение на любом из аналоговых пинов от 0 до 5 вольт, то проблем нет.
Это выглядит примерно так:
#define Pin_ Akkum A0 // Pin подключенный к +АКБ
float Voltage_Vcc = 0; // Переменная напряжение напряжения на Vcc, входе питания Ардуино
float Voltage_Value_Pin = 0; // Переменная данных с аналогового Pin
float Voltage_Pin = 0; // Переменная напряжение на аналоговом Pin (до 5 вольт без делителя)
void setup()
{
analogReference(DEFAULT); // Настройка источника опорного напряжения по умолчанию
}
void loop()
{
Voltage_ Vcc = Read_Voltage_Vcc() / 1000; /* Присваиваем переменной, значение получаемое из функции в вольтах*/
Voltage_Value_Pin = float (analogRead(Pin_ Akkum)); // Присуаиваем переменной значение получаемое с аналогового Pin
Voltage_Pin = Voltage_Value_Pin * Voltage_Vcc / 1024; /* Присваиваем переменной значение в вольтах (в вычисление подставляем значение Voltage_Vcc, полученные с помощью функции " float Read_Voltage_Vcc ()" */
}
А вот как быть, если нужен делитель напряжения?
Если без этой функции " float Read_Voltage_Vcc ()" то :
Voltage_Akkum = float(analogRead(Pin _Akkum)) / 34,13333333333333; // Считываем значение на пине вольтметра, расчет произведен на предел значений 0-30В. 1024/30 = 34,13333333333333 (резисторы делителя, рассчитаны и подобраны с точностью до десяток).
Показания более менее точные , это если без нагрузок (реле, датчики и прочие) блок питания конечно достаточно мощный , но все же при включении и отключении нагрузок, показания гуляют.
Кто что посоветует?
Как лучше сделать?
Katapuf, возьмем например телевизор. Он показывает каналы с антенного входа. Но иногда надо что бы он например показывал с видиомагнитофона, а иногда с флешки. Странно не правда ли, телевизор и вроде монитор , и вроде флекопроигрыватель. Дичь. Или все же нет. Вот так и Ардуина. У нее есть режим мерять по отношению внутренего напряжения, мерять относительно питания, и мерять относительно поданого напряжения AREF . И изменятся этот режим просто программным переключением. Если это вам сложно понять, то перейдите к сериалу фиксики.
В дополнение к сказанному Квоном: разделение выводов электронного устройства на входы и выходы - некоторый уровень абстракции. И не всегда работает. Бывает, некоторый вывод имет как функции входа, так и функции выхода. А бывает - наоборот, не явлется ни тем, ни другим.
qwone
Что ты накорябал, я и без тебя знал.
Ты вопрос читал?
Я тебе советовал куда пойти?
Нет?
Вот и ты чертила не советуй, всякую хрень.
Блин такой смелый в сети, а как в реале, так язык в жопу и ой не надо, я сам....
В дополнение к сказанному Квоном: разделение выводов электронного устройства на входы и выходы - некоторый уровень абстракции. И не всегда работает. Бывает, некоторый вывод имет как функции входа, так и функции выхода. А бывает - наоборот, не явлется ни тем, ни другим.
Про вход - выход, это к слову.
Если не трудно то дальше по тексту есть несколько вопросов, вот на них и хотелось бы получить ответы.
Если на "выход или все-таки вход" "AREF" подать опорное напряжение с микросхемы "REF03" 2,5 вольта.
И как как в скетче указать, что было подано на " AREF ", именно 2,5 вольта?
Что произойдет с датчиками, подключенными к аналоговым входам?
Нужен ли резистор в 5 кОм?
Ведь по сути, из более-менее точного напряжения, с этим резистором, мы теряем эту точность, даже в описании в сети говорится, что из-за получившегося делителя (с внутренним резистором в 32 КОм), получится примерно 2,2 вольта, то есть" + - "километр.
Тогда какой смысл во всем этом?
И дальше по тексту, первого поста.
Почитал, как Вы реагируете на ответы, и желание отвечать Вам пропало.
Почитал, как Вы реагируете на ответы, и желание отвечать Вам пропало.
Реагирую адекватно ответам.
Принцип относится к людям, так как они относятся к тебе, еще ни разу не подводил.
А вот по рабски - относится к людям так, как хотел бы, чтобы относились к тебе,
это типа тебя оскарбляют, а ты с этой тварью на "будьте любезны" ?
То это к хрестанутым рабам. Это у них принцип получать о мардасам с обоих сторон.
И с вами я общался без оскарблений, если, что.
Но коли нет желания, так нет, вы мне не обязаны.
Это кто это у нас такой бодрый?
Родное сердце, ты советы папке давай, если знаком, ОК?
По делу так:
1. Aref это и вход и выход. Когда выбран не внешний источник опорного Vref, то его можно измерить на AREF высокоомным вольтметром
proof:
V REF can also be measured at the AREF pin
with a high impedance voltmeter. Note that V REF is a high impedance source, and only a capacitive load
should be connected in a system.
2. При подаче на AREF внешнего опорного НЕЛЬЗЯ назначать ничего, кроме внешнего, иначе сожжем АЦП - чесно, я уже сжигал ;). То есть нужно ВНАЧАЛЕ дать команду на использование референс екстернал, а только ПОТОМ реально подключить его.
3. Не наравится 5К поставь 50К - вопрос твоей защиты - это только твой выбор, как гондоны... но это должно быть тебе знакомо, ИМХО.
-----------------
И да, если врдруг мой тон тебя не устраивает, то просто к слову - мне 49 лет и 150 кг. Если что-то захочешь сказать - то лучше тихо постой в углу и подумай о гармонии мира... ведь вдруг я просто упаду... от потери равновесия? ;) ;) ;) Шутка, твоя горячность рассмешила, не обижайся.
wdrakula
Во первых советы не потеме начал давать не я.
Во вторых Когда отвечают на вопрос, то как говорится: "А смысл жаловаться".
А теперь к тексту.
Во 2 пункте "При подаче на AREF внешнего опорного НЕЛЬЗЯ назначать ничего, кроме .."
Может я что не правильно понимаю, но получается так:?
"Устанавливаетм в void setup() значение analogReference(EXTERNAL), далее загружаемся и только после этого, подключаем внешнее опорное напряжение?"
Если так, то как же быть, тоесть перезагружать плату дистанционно или по событию?
По повода резистора, не в наминале дело, дело в том, что с примининием последнего, точность убегает в даль.
И еще как в скетче указать какое напряжение подано на AREF ?
И не совет, а просто мое мнение: я соих предков если пользоваться "официальным летоисчислением" то до 1698 года знаю, в отличии от большинства кто "без роду без племени". А постоянно из поста в пост, (я прочитал почти весь форум) пользоваться "приколом" который может оскорбить кого то, я про "знакомство с оцом", много говорит о аворе.
И то что ты старше меня на 3 лета, ну возьми с полки пирожок, а уж вес...
Интересно когда падаешь, сам то встаешь, аль краном поднимают?
Ты не обижайся, это шутка....
analogReference(EXTERNAL) Вот ссылка http://arduino.ru/Reference/AnalogReference Вот текст.
Больше других входных значений у функции нет. Это и есть как пульт у телевизора на переключения что смотреть. Что здесь непонятно. Меряете по напряжению питания переключили на эталон питания. Меряете по внешнему. Так подключите туда стабилитрон и у вас нужный эталон. Есть же у вас рулетка - надо в дюймах меряете в дюймах, надо в метрах меряете в метрах. Или вы поймали цифру, а дюймы или метры для вас не важно.
ПС: Если у человека в голове заведется вопрос(чаще всего глупый или тупой), то всегда найдутся уникумы которые их задали и не раз. Осталось просто найти и прочитать. И там точно также объсняли про глубину понимания вопросавшего и давали развернутый ответ. Но вы хотели видно стать на место вопрошавшего и получить поучения индивидуально. То кто я такой, что отказать вам в такой малости.
Зачем так все уложнять. Подаешь внешнее питание на aref если планируешь использовать внешний опорник, тогда соответственно в сетапе указываешь внешний. А по поводу где указать что внешний опорник на 2.5В. Ты ведь не говоришь что сейчас опорное напряжение 5В (по умолчанию). Просто использовать напряжение питания. Но по факту ардуина не знает 5В там ли точно, да и ей без разницы какое напряжение по факту. Это твои проблемы. Ардуина просто выдает значения, ты задаешь например формулы пересчета едениц АЦП в вольты. И вот в этой формуле только присутствует напряжение опорника. И неважно какой он, внеший или внутренний
qwone
А вот это уже нормальный диалог.
По перечисленные варианты опорных напряжений, я вкуре, читал.
Меня интересует, как я уже говорил "EXTERNAL".
По поводу велечены напряжения... Если опорное напряжение к примеру равно 2, 5 вольта, то аналоговый пин 2, 5 вольта и все, что выше, воспринимает как 1023, это я тоже знаю.
Про возможность переключения опорных напряжений это понятно.
Я же писал есть мелкосхема опорного питания REF03 выход 2,5 вольта.
В setup указываю analogReference(EXTERNAL);
Подключаю на ногу AREF , эти 2,5 вольта.
Где в скетче указать, что я подал, именно 2,5 вольта? Не 1.1, не 5, а 2,5.
И как будут себя вести аналоговые датчики?
И как в скетч вписать делитель?
Подключаю на ногу AREF , эти 2,5 вольта.
Где в скетче указать, что я подал, именно 2,5 вольта? Не 1.1, не 5, а 2,5.
Укажите в 16-й строке.
И как будут себя вести аналоговые датчики?
Аналоговые датчики об этом догадаться не могут.
Никак.
Поэтому будут вести себя точно так же, как если в режиме по умолчанию.
И как в скетч вписать делитель?
Зависит исключительно от скетча.
Возможно, Вы будете удивлены, но в некоторыфе скетчи это вообще никак вписывать не нужно.
Подключаю на ногу AREF , эти 2,5 вольта.
Теперь если на пине А0 будет 2.5 вольта то analogRead(A0); вернет 1023. Если будет 1.25В то 512 .Так же и на остальных выводах. Ведь все просто.
/**/ #define Pin A0 // Pin подключенный к +АКБ //------------------------------------------- void setup() { Serial.begin(9600); analogReference(EXTERNAL);/*на внешний вывод 2,5 В*/ } void loop() { float V = float (analogRead(Pin)) * 2.5 / 1023; Serial.println(V); delay(1000); }Подключаю на ногу AREF , эти 2,5 вольта.
Где в скетче указать, что я подал, именно 2,5 вольта? Не 1.1, не 5, а 2,5.
Укажите в 16-й строке.
Я про этот прикол уже читал.
Я не правильно, может выразился, не где, а как указать, что я подал, именно 2,5 вольта? Не 1.1, не 5, а 2,5. Еще вариант вопроса как Ардуино поймет, что на AREF подано именно 2, 5 вольта? Как указать Ардуино, что на AREF подано 2,5 вольта? Какая структура этой записи?
укажите в комментарии к строке analogReference(EXTERNAL); // опора 2,5В
Ардуина понимает только то, что ей к АЦП нужно подключить внешнюю опору, больше она ничего не понимает.
Потом она просто делит опору на 2e10.
Все аналоговые сигналы выше опоры (2,5В) будут трактоваться как 3FF, что меньше Uan*1023/2,5
Правильно интерпретировать код полученный с АЦП это задача не ардуины, а разраработчика схемы и прошивки.
Я не правильно, может выразился, не где, а как указать, что я подал, именно 2,5 вольта? Не 1.1, не 5, а 2,5. Еще вариант вопроса как Ардуино поймет, что на AREF подано именно 2, 5 вольта? Как указать Ардуино, что на AREF подано 2,5 вольта? Какая структура этой записи?
Нигде это не нужно указывать. И Ардуина этого понять не способна. В принципе.
О том, что это именно 2.5 В должен знать разработчик устройства и использовать эти знания при написании скетча. Будут ли эти 2.5 В фигурировать в скетче в виде предопределенной константы либо никак не будут фигурировть в явном виде - дело исключительно программиста. Соответственно, никакой структуры для несуществующей записи также не существует. Ардуино - это не разумное существо, а простенький программируемый автомат. Не следует приписывать ей элементы интеллекта (даже искусственного) и, в частности, способность что-либо понимать.
Ты ведь не говоришь что сейчас опорное напряжение 5В (по умолчанию). Просто использовать напряжение питания. Но по факту ардуина не знает 5В там ли точно, да и ей без разницы какое напряжение по факту. Это твои проблемы. Ардуина просто выдает значения, ты задаешь например формулы пересчета едениц АЦП в вольты. И вот в этой формуле только присутствует напряжение опорника. И неважно какой он, внеший или внутренний
Уточню, если позволите - правильно ли я понял, что если у меня напряжение питания по факту не ровно 5 вольт, а скажем 4.9, и AnalogReference стоит по умолчанию в DEFAULT, то адруино при чтении через analogRead будет на 1024 части делить не сферические 5 вольт, а имеющиеся в наличии 4.9 (при условии что питание ардуины и источника сигнала общее, понятное дело)?
Просто пытаюсь понять, надо ли мне отслеживать точность напряжения и вносить поправку в случае чего, или analogRead сам разберется?
Конечно не сферические. Адруина же будет кажным своим компаратором АЦП внимательно присматриваться к измеряемой напруге и сравнивать с имеющимся в наличии рефренсным. А ежели рефренсное у вас 4.9, то как глупая мелкосхема его за пять примет? Это как при зарплате в 49 тыщ пропивать 50.
А отслеживать или нет - зависит от того, какой результат на выходе собираетесь получить. Ежели абстрактный, то нет никакой нужды.
Ты ведь не говоришь что сейчас опорное напряжение 5В (по умолчанию). Просто использовать напряжение питания. Но по факту ардуина не знает 5В там ли точно, да и ей без разницы какое напряжение по факту. Это твои проблемы. Ардуина просто выдает значения, ты задаешь например формулы пересчета едениц АЦП в вольты. И вот в этой формуле только присутствует напряжение опорника. И неважно какой он, внеший или внутренний
Уточню, если позволите - правильно ли я понял, что если у меня напряжение питания по факту не ровно 5 вольт, а скажем 4.9, и AnalogReference стоит по умолчанию в DEFAULT, то адруино при чтении через analogRead будет на 1024 части делить не сферические 5 вольт, а имеющиеся в наличии 4.9 (при условии что питание ардуины и источника сигнала общее, понятное дело)?
Просто пытаюсь понять, надо ли мне отслеживать точность напряжения и вносить поправку в случае чего, или analogRead сам разберется?
Да. Но тут вопрос необходимой точности. Надо ли оно действительно так точно
А отслеживать или нет - зависит от того, какой результат на выходе собираетесь получить. Ежели абстрактный, то нет никакой нужды.
Ну, что значит абстрактный... Под отслеживанием я подразумеваю именно внесение поправки на просадку напряжения, не более того. Какая при этом будет погрешность скажем у аналогового датчика 0-5 вольт - это надо индивидуально проверять с эталонным, и в зависимости от этого уже плясать. :)
Это как использовать время с неправильных часов сверяя их с правильными. И находить точное прибавив к неправильному разницу между правильными и неправильными. Если у тебя будет с чем сравнивать, то есть опорник, почему его не использовать вместо неправильного?)))
Абстрактный - это в единицах analogRead(). Или в милливольтах, посчитанных через пропорцию для выдуманного напряжения.
Чтобы ШИМ переменником рулить - зачем точные милливольты? Отмапил одно в другое и радуешься.
Напляжение у меня одно на всех. Я просто задумался, если у меня аналоговый датчик, который на входе по даташиту должен получать 5 вольт, а на выходе дает от 0.25 до 4.85, то надо ли мне делать поправку в его показания, если я ему скормил не 5, а 4.9. Как я понимаю - только опытным путем понять можно, экспериментируя и сравнивая показания.
Если питание аналогового датчика и ардуины одинаковое и провода между ними короткие, значит никакие поправки не нужны
Напляжение у меня одно на всех. Я просто задумался, если у меня аналоговый датчик, который на входе по даташиту должен получать 5 вольт, а на выходе дает от 0.25 до 4.85, то надо ли мне делать поправку в его показания, если я ему скормил не 5, а 4.9. Как я понимаю - только опытным путем понять можно, экспериментируя и сравнивая показания.
А функция analogRead() никаких вольт не знает и знать не хочет. Она делит измеряемое напряжение на опорное и выдает результат - безразмерную величину!
что-то вроде rezult = 1024*Uin/Uref, и какое там при этом Uref - ей фиолетово.
при этом в массе публикаций в формуле для напряжения тупо фигурирует константа 5 вольт, без каких либо оговорок. особо эротично выглядят подобные формулы при питании нано от юсб.