АЦП в AVR (Atmega8)

Обсуждаем контроллеры компании Atmel.
Ответить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 301
Зарегистрирован: Пт сен 23, 2011 13:13:51
Откуда: Минск

Сообщение Volgol_555 »

Всем привет. Воспользовался АЦП в Atmega8 для замера напряжений на входах. Напряжение я подаю на VCC и AVCC - 5В. - все работает, но появились вопросы:
1) Если питание на МК подавать через диод Шоттки (падение напряжения 0.3 В), то АЦП выдает мне напряжение на входах с большой погрешностью. Например, напряжение аккумулятора 3.71В, а он показывает 4.56. Напряжение питание 5, а он выдает 5.08. Хотя без этого диода (питание напрямую) АЦП работает с точностью до десятой! Почему так происходит?

2) Обнаружил, что можно узнавать напряжение не только на входах ADC, но ещё и на входе опорного источника напряжения (т.е. на AVCC и AREF), по сути можно только при помощи ноги AVCC с подведенным питанием 5В, узнать, что туда подведено 5В. Но когда я подвожу на VCC и AVCC питание в 3.7 В (резервное питание). То метод проб и ошибок показал, что питание на AVCC по прежнему 5В!!! Как такое возможно?

AVCC я подключал как указано в даташите на Atmega8 - на питание дроссель в 100мкГн, на землю конденсатор в 100мкФ(вроде бы, но это сейчас не важно).
Объясните, пожалуйста мне что происходит в этих двух случаях...и кстати вот как я читаю напряжение на AVCC:

unsigned int read_power()
{
ADMUX=(ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

Для сравнения, как читает CVAVR напругу на портах
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

Может быть я не правильно читаю напряжение на AVCC?.
Самое гениальное - всегда самое простое
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

сложно что-то советовать любителям CVAVR... я лично не могу понять смысла вот этого действия (выделил подчеркиванием):
Volgol_555 писал(а):ADMUX=(ADC_VREF_TYPE & 0xff);
а вообще, если вы хотите измерить напряжение питания, то надо в качесвте ОПОРНОГО использовать AVCC, а ИЗМЕРЯТЬ напряжение VREF или BANDGAP - это смотря по типу МК. только учтите, что зависимость будет хитрая, вывернутая наизнанку: чем больше намеряете, тем ниже на самом деле будет напряжение. но можно и формулу вывести - это уж сами...
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 301
Зарегистрирован: Пт сен 23, 2011 13:13:51
Откуда: Минск

Сообщение Volgol_555 »

Что CVAVR творит непонятное при создании своих кодов это понятно... Здесь дело темное)
Но вот может быть я не знаю каких-то хитростей с АЦП? Почему хотя бы с диодом такая фигня выползает? Есть ли какие-то нюансы в структуре самого МК? Я видел статью, где парень писал, что Atmega8 чем-то отличается, в том смысле, что у него внутр. резюк между VCC и AVCC - 5 Ом, когда в других МК он порядка МОм. Может это как-то сказаться на работе АЦП?
Самое гениальное - всегда самое простое
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Я видел статью, где парень писал, что Atmega8 чем-то отличается, в том смысле, что у него внутр. резюк между VCC и AVCC - 5 Ом, когда в других МК он порядка МОм.
Не надо слушать парней, надо читать даташиты.

Часть кристалла у этих МК питается именно от AVCC, при чём и порты ввода-вывода, к ним относящиеся. Если не запитать AVCC или запитать от другого напряжения - пойдёт рассогласование уровней внутри самого МК, что не есть хорошо. Для защиты от ошибок VCC и AVCC соединены внутри через диод, обычный кремниевый диод.
У меги8 был косяк - диода там не было, AVCC и VCC были просто замкнуты внутри кристалла.
Почему хотя бы с диодом такая фигня выползает?
Потому, что вы неправильно понимаете суть измерений. Если на входе АЦП напряжение больше или равно AREF, на выходе вы получите число 1023. Всегда. Независимо от того, какое реальное напряжение туда подведено.
Если в качестве AREF использовать AVCC, и сигнал на АЦП так же пропорционален питанию, то напряжение питания никак не скажется на показаниях - такой способ включения используют для снятия показаний с аналоговых датчиков, питаемых тоже от AVCC.
Для измерения самого напряжения питания надо задействовать внутреннюю опору. Но придётся всё пересчитывать.
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 301
Зарегистрирован: Пт сен 23, 2011 13:13:51
Откуда: Минск

Сообщение Volgol_555 »

Я же ведь считывал напряжение питания! Тем более, что AREF я не использую - он в "воздухе висит". VCC соединены c AVCC через дроссель. К ним подведены 2 питания: 5В и 3.7В. Когда пропадает 5В. Остается 3.7В, но АVCC показывает 5В дальше!
Самое гениальное - всегда самое простое
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

А что он должен показывать? У тебя VCC и AVCC равны, АЦП всегда даст 1023. В пересчёте на вольты - будет пять. Хоть от скольки вольт запитай - показания не изменятся.
ем более, что AREF я не использую - он в "воздухе висит"
- он внутри должен быть подключен к AVCC. Либо к внешней опоре, но у тебя её нет.
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 301
Зарегистрирован: Пт сен 23, 2011 13:13:51
Откуда: Минск

Сообщение Volgol_555 »

ploop писал(а):А что он должен показывать? У тебя VCC и AVCC равны, АЦП всегда даст 1023. В пересчёте на вольты - будет пять. Хоть от скольки вольт запитай - показания не изменятся.
ем более, что AREF я не использую - он в "воздухе висит"
- он внутри должен быть подключен к AVCC. Либо к внешней опоре, но у тебя её нет.
Хорошо. Отвлечемся от проверки напруги на ноге AVCC. Другая ситуация. Схема та же. Когда я питаю от 5В - напруга на аккумуляторе 3.71 (это он показывает). Когда питаю от 3.71 В - он все показывает 5. Т.е. я так понимаю когда измеряемая напруга совпадает с питаемой - как ни крути будет 1023?
Блин я забыл, что это я задаю конвертер напряжения, ахахаха)))) Спасибо, тупанул я однако).

Тогда остался вопрос. Как можно заставить понять МК от чего он питается, имея только одну ногу AVCC? или AREF (я знаю кучу других способов с другими ногами, но это не катит пока что)
Также тогда встал вопрос. Как мне измерять напругу на аккумуляторе 3.71В, когда питание к МК и к AVCC идет через диод. МК показывает вместо 3.71 - 4.56В!!! вот это остается непонятно(
Самое гениальное - всегда самое простое
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Как можно заставить понять МК от чего он питается, имея только одну ногу AVCC? или AREF
С одной ногой никак. Нужен аналоговый компаратор или свободный вход АЦП, или, на крайняк, свободный IO-порт. На него заводим напряжение питания, которое развязано через диод с самим контроллером, и через другой диод - с резервным питанием. При пропадании первого контроллер легко это увидит.

Однако смотря что ты хочешь этим добиться, а то я недавно наткнулся на один очень неприятный сюрприз...
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 301
Зарегистрирован: Пт сен 23, 2011 13:13:51
Откуда: Минск

Сообщение Volgol_555 »

НУ все эти приколы с ногами, определяющими питание я в принципе знаю! А вообще мне всего лишь надо было, придумать с минимальными затратами ног обнаружение МК'ом пропажу основного питания, чтобы в дальнейшем он мог уйти в "спячку".
Но я нашел один способ: у меня МК связан с дисплеем. Так вот дисплей при напруге 3.8 и ниже начинает тупить, ему не хватает для отображения энергии и он в итоге очень медленно отвечает на запрос готовности. Так вот, если его опрашивать и анализировать задержку на выдачу флага готовности, то можно определить, что питание 3.8.
Но вот обратный процесс не получился - нужно определить, что питание уже не 3.8, а 5. По дисплею это определить не получилось - как показала практика, и я решил попробовать с АЦП это сделать. Но увы тоже не выходит.
Единственный вариант остался: у меня есть реле, которое открывается для заряда аккумулятора. Если его открыть напруга аккума будет выше 4 (вроде 4.1 была все время - хотя не знаю почему). Так вот если есть внешнее питание, то он 4.1В покажет, если нету - 5 В.

А что на счет твоего питания для АЦП...А разве нельзя его отключать программно? Т.е. я так думал: не подводить питание к AVCC, то ничего и не выйдет....А исходя из того, что у них "там диод", AVCC всегда соединено с VCC - вопрос... - зачем подводить питание к AVCC????
И ещё...неужели АЦП кушает около 10 мА????. С таким успехом моего резерва хватит на 1.5 дня(
Самое гениальное - всегда самое простое
Контактная информация:
Мудрый кот
Аватара пользователя
Сообщения: 1800
Зарегистрирован: Вт окт 05, 2010 01:08:57

Сообщение O-LED »

Volgol_555 как минимум одну ногу использовать придется. сделайте как в моих часах, на один вход компаратора, через делитель подайте внешнее питание, а второй подключите к встроенному ИОНу. Работает четко и надежно.
KIT
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 301
Зарегистрирован: Пт сен 23, 2011 13:13:51
Откуда: Минск

Сообщение Volgol_555 »

O-LED писал(а):Volgol_555 как минимум одну ногу использовать придется. сделайте как в моих часах, на один вход компаратора, через делитель подайте внешнее питание, а второй подключите к встроенному ИОНу. Работает четко и надежно.
Твой метод конечно же надеждный, но тут парочка "НО":1) аналоговый компаратор это AIN0 и AIN1 соответственно уже 2 ноги? 2) У меня AIN0 и AIN1 уже заняты под другие цели)
3) ИОН я на Жданах в Минске не нашел - могут только под заказ и цена такая, что мне лучше использовать аккумулятор с mp3.
4) все уже собрано, поэтому остается только надпиливать дорожки и припаивать проводки - если изменять. Поэтому количество вносимых элементов должно быть минимальным!
Самый лучший метод - изворачиваться программно - мне это нравится) Я люблю оригинальные идеи))
Самое гениальное - всегда самое простое
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

Volgol_555 писал(а):А исходя из того, что у них "там диод", AVCC всегда соединено с VCC - вопрос... - зачем подводить питание к AVCC????
не слушайте никого, верьте только тому, что написано в даташитах. а там написано, что AVCC должно всегда подключаться к источнику питания, отличающемуся от VCC не больше, чем на 0,6 вольта. все, никаких "почему" или "а может быть".

потребление модуля ADC где-то в документации тоже попадалось - но уверяю вас, это не 10 мА однозначно, хотя точную цифру я и не помню.

как контролировать напряжение питания МК я вам уже объяснял, повторю снова: надо в качестве опорного задать AVCC, а измерять - VREF или BANDGAP. пожалуйста, прочтите еще раз и подумайте над сказанным, прежде чем начнете снова фантазировать. мой метод не требует использования внешних выводов МК, но, разумеется, требует периодического запуска АЦП. кстати, в режиме экономии питания использование компаратора даст вам большее потребление, нежели активация раз в секунду (или даже реже) модуля АЦП.
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Мудрый кот
Аватара пользователя
Сообщения: 1800
Зарегистрирован: Вт окт 05, 2010 01:08:57

Сообщение O-LED »

Volgol_555

1. используется только вывод аin0. аin1 подключается к ИОНу внутри контроллера, т.е. вывод аin1 остаётся свободен, и его можно использовать по своему усмотрению.
2. не обязательно использовать именно вывод аin0. вместо него можно использовать любой свободный вывод АЦП.
3. внешний ион здесь не нужен

Мастер Ломастер
1. расскажи поподробней о своем методе.
2. вывод опоры VREF цеплять к батарейке крайне не желательно. у него малое входное сопротивление, порядка 30к (вроде). получится что от батарейки будет тупо потребляться 170мка, что в 10-20 раз больше чем сам контроллер во сне.
KIT
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 301
Зарегистрирован: Пт сен 23, 2011 13:13:51
Откуда: Минск

Сообщение Volgol_555 »

Всем спасибо! Я нашел свое решение! И реле здесь нафиг не надо (хотя мне нужно только для заряда). Один выход АЦП вешаем на +3.7В аккумулятора, который соединен через диод Шоттки в общее питание. В итоге имеем: когда есть внешнее питание в 5В, на аккумуляторе покажет 3.7В или ниже (зависит от заряда). Если внешнего питания нету - покажет все 5В, т.е. цифру 1023. Отсюда и делаем реакцию МК на питающее напряжение! Обошлось всего одной ногой и без лишнего гемора, т.к. АЦП по-любому нужен для замера других напруг!.
А что касается компаратора, то я с ним просто не работал, да и не вижу нужным использовать делители напряжения - резисторы. Я за простоту и минимизацию схем!!!))
Самое гениальное - всегда самое простое
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

O-LED писал(а):Мастер Ломастер
1. расскажи поподробней о своем методе.
2. вывод опоры VREF цеплять к батарейке крайне не желательно. у него малое входное сопротивление, порядка 30к (вроде). получится что от батарейки будет тупо потребляться 170мка, что в 10-20 раз больше чем сам контроллер во сне.
я был уверен, что рассказал все понятно... видимо, я заблуждался. итак, рассказую подробнее на примере atmega8.

1. задаем в качестве опорного AVCC, для чего устанавливаем бит REFS0 в регистре ADMUX
2. измерять будем напряжение BANDGAP, для чего в ADMUX выбираем 14-й канал, т.е. устанавливаем биты MUX3, MUX2 и MUX1
3. напряжение BANDGAP для меги8 равно 1,3 вольта, оно стабильно. при питающем напряжении 5 вольт (не забываем - оно же и есть опорное АЦП) мы намеряем примерно 1,3 / 5 * 1023 = 265
4. если питающее напряжение вдруг упадет до 3 вольт, то замер BANDGAP даст уже 1,3 / 3 * 1023 = 443

таким образом, при питании от источника мы будем получать результат не более 270 (с запасом), а при питании от батарейки - обязательно более 270. этого вполне достаточно для того, чтобы определить, надо ли, например, усыпить МК или нет.

вот как-то так.
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

О как! Хитро! Спасибо!
На самом деле я и забыл, что вход АЦП можно зацепить либо на внутреннюю опору, либо на ноль.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 301
Зарегистрирован: Пт сен 23, 2011 13:13:51
Откуда: Минск

Сообщение Volgol_555 »

Мастер Ломастер писал(а):
O-LED писал(а):Мастер Ломастер
1. расскажи поподробней о своем методе.
2. вывод опоры VREF цеплять к батарейке крайне не желательно. у него малое входное сопротивление, порядка 30к (вроде). получится что от батарейки будет тупо потребляться 170мка, что в 10-20 раз больше чем сам контроллер во сне.
я был уверен, что рассказал все понятно... видимо, я заблуждался. итак, рассказую подробнее на примере atmega8.

1. задаем в качестве опорного AVCC, для чего устанавливаем бит REFS0 в регистре ADMUX
2. измерять будем напряжение BANDGAP, для чего в ADMUX выбираем 14-й канал, т.е. устанавливаем биты MUX3, MUX2 и MUX1
3. напряжение BANDGAP для меги8 равно 1,3 вольта, оно стабильно. при питающем напряжении 5 вольт (не забываем - оно же и есть опорное АЦП) мы намеряем примерно 1,3 / 5 * 1023 = 265
4. если питающее напряжение вдруг упадет до 3 вольт, то замер BANDGAP даст уже 1,3 / 3 * 1023 = 443

таким образом, при питании от источника мы будем получать результат не более 270 (с запасом), а при питании от батарейки - обязательно более 270. этого вполне достаточно для того, чтобы определить, надо ли, например, усыпить МК или нет.

вот как-то так.
Это очень интересно. А можно поподробнее, что такое BANDGAP? Если статьи про это?
Самое гениальное - всегда самое простое
Контактная информация:
Друг Кота
Сообщения: 6014
Зарегистрирован: Чт ноя 26, 2009 11:16:50
Откуда: Москва

Сообщение SmarTrunk »

Volgol_555
BANDGAP - это некий внутренний источник опорного напряжения, 1,23В, из которого получается выведенный наружу источник опорного напряжения Internal Voltage Reference 2,56В. Если они не используются (выключены АЦП, компаратор, Brown-out...), то они отключаются, для экономии энергии. До сих пор не знаю, зачем их два разных.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 301
Зарегистрирован: Пт сен 23, 2011 13:13:51
Откуда: Минск

Сообщение Volgol_555 »

SmarTrunk писал(а):Volgol_555
BANDGAP - это некий внутренний источник опорного напряжения, 1,23В, из которого получается выведенный наружу источник опорного напряжения Internal Voltage Reference 2,56В. Если они не используются (выключены АЦП, компаратор, Brown-out...), то они отключаются, для экономии энергии. До сих пор не знаю, зачем их два разных.
Ясно. Я не знал, что он так называется)). НО...если я включу АЦП от внутр. источника, то я не смогу делать замер напряжения выше 2.56 В, верно? Если да - мне это не подходит, т.к. мне нужны некоторые выводы АЦП для замера до 5В.
Порылся в настройках CV: есть две галки - 1) прерывание и 2) использовать 8 бит.
Что значит в случае с АЦП прерывание? и 8 бит?
Самое гениальное - всегда самое простое
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

Volgol_555 писал(а):НО...если я включу АЦП от внутр. источника, то я не смогу делать замер напряжения выше 2.56 В, верно? Если да - мне это не подходит, т.к. мне нужны некоторые выводы АЦП для замера до 5В.
а про делитель напряжения слыхали? можно с его помощью с опорным 2.56 вольт измерять даже до 100 вольт :)))
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Ответить

Вернуться в «AVR»