Страница 1 из 1

[решено] ADC в atmega16 возвращает значения от 0 до 200

Добавлено: Вт фев 01, 2011 19:03:35
xray
Приветствую!

Пытался найти здесь, или нагуглить подобную проблему где-то еще, но это не помогло. Как и не помогло повторное чтение даташита ATMEGA16.
Суть проблемы такова: какие бы я ни задавал частоты ADC (как частотой атмеги (1-8MHz), так и прескалером (upto 128)), он, ADC, измеряет только до 0.5В, что соответствует 200 единицам, несмотря на оговоренную 10-тибитную точность. Дальше он застревает на цифре 200, какое бы напряжение ни было приложено на ногу.
Измеряется в режиме single-ended, то есть от GND, опорное напряжение - встроенное 2.56В.
Проект пишется в CodeVisionAVR, функция read_adc создана самой CodeVisionAVR и выглядит следующим образом:

Код: Выделить всё

// 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;
}
Также к проекту подключен модуль для работы с экраном от LCD Nokia 1100, однако, он практически полностью уже переписан мной, и ничего кроме простого ногодрыгания там нет - никаких прерываний или работы с особенными регистрами, только с портом (PORTC), к которому подключен LCD (используются ноги 0-3).

Начальная инициализация ADC (генерируется мастером cvavr):

Код: Выделить всё

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 250,000 kHz
// ADC Voltage Reference: Int., cap. on AREF
// ADC Auto Trigger Source: None
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x85;
Схема симулируется в протеусе, живой атмеги на руках пока нет.

Пните меня, пожалуйста, в правильном направлении, как правильно задействовать ADC на ATMega16.

Re: ADC в atmega16 возвращает значения только от 0 до 200

Добавлено: Вт фев 01, 2011 19:53:54
Roman Venom
xray
Попробуй внешнее опорное напряжение. У меня мега16 в протеусе и в реале нормально работет. Сперва попробуй включить только один канал АЦП в регистре МУХ. И частоту преобразования поставь не 250кГц, а примерно 100кГц.

Re: ADC в atmega16 возвращает значения только от 0 до 200

Добавлено: Вт фев 01, 2011 20:11:22
xray
Канал АЦП подключен один, он же единственный и подключается в ADMUX (а как иначе в single-ended?)
Попробовал внешний источник - VREF, пробовал различные напряжения, но выяснил интересное: ADC затыкается всегда на 0.5В
соответственно, в зависимости от того, какое количество делений этому соответствует, столько и будет показывать для более высоких значений.
Вне зависимости, стоит 250кГц или 125кГц.

Re: ADC в atmega16 возвращает значения только от 0 до 200

Добавлено: Вт фев 01, 2011 20:14:29
Fasterpast
Попробуйте 8ми битный режим измерения.

Re: ADC в atmega16 возвращает значения только от 0 до 200

Добавлено: Вт фев 01, 2011 20:19:20
xray
В 8-мибитном режиме то же самое - выше 0.5В затык.

Re: ADC в atmega16 возвращает значения только от 0 до 200

Добавлено: Вт фев 01, 2011 20:20:59
xray
Роман, если Вас не затруднит - не могли бы Вы дать образец схемы и прошивки, которые измеряли бы значения ADC от 0 до VREF на всем диапазоне?

Re: ADC в atmega16 возвращает значения только от 0 до 200

Добавлено: Вт фев 01, 2011 21:10:33
xray
Ошибка найдена: необходимо также подавать напряжение на AVCC

Re: [решено] ADC в atmega16 возвращает значения от 0 до 200

Добавлено: Ср фев 02, 2011 00:14:06
Roman Venom
xray
Роман, если Вас не затруднит - не могли бы Вы дать образец схемы и прошивки, которые измеряли бы значения ADC от 0 до VREF на всем диапазоне?
Ещё надо?
Ошибка найдена: необходимо также подавать напряжение на AVCC
Ну вы, блин, даёте!

Re: [решено] ADC в atmega16 возвращает значения от 0 до 200

Добавлено: Ср фев 02, 2011 07:35:31
xray
Бывает :dont_know:
За последний месяц настолько углубился в логическую часть и написание кода, что про элементарные вещи забыл.