Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с разрядностью АЦП
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
simer
АЦП на ATmega8 насколько я знаю 10-разрядный, т.е. значение регистра ADCW должно достигать 1023 (0x03FF) при максимальном значении напряжения на входе АЦП

Но по непонятным мне причинам значение поднимается только до 200 (0x00C8)

CODE

#define ADC_VREF_TYPE 0xc0

// 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;
}


Проверено при любых вариантах опорного напряжения.
Сергей Борщ
QUOTE (simer @ Jan 5 2011, 23:14) *
Но по непонятным мне причинам значение поднимается только до 200 (0x00C8)
А частота тактирования АЦП находится в допустимых пределах?
Xenia
Слишком рано считываете. Ждать надо не исчезновения бита ADIF (0x10), а исчезновения бита ADSC (0x40).
Т.е. вместо
while ((ADCSRA & 0x10)==0);
надо ждать
while ((ADCSRA & 0x40)==0);

А бит ADIF (0x10) никогда не появится, т.к. разрешения на прерывание вы не давали (не устанавливали ADIE). Поэтому ожидание у вас отсутствует и АЦП не успевает накопить число.
И вот этого
ADCSRA|=0x10;
делать не надо.
simer
Цитата(Сергей Борщ @ Jan 5 2011, 23:32) *
А частота тактирования АЦП находится в допустимых пределах?


Истина была около того.
Похоже глюк протеуса был. Поставил меньше частоту выборки, все заработало.
Спасибо.

Цитата(Xenia @ Jan 5 2011, 23:41) *
Слишком рано считываете. Ждать надо не исчезновения бита ADIF (0x10), а исчезновения бита ADSC (0x40).
Т.е. вместо
while ((ADCSRA & 0x10)==0);
надо ждать
while ((ADCSRA & 0x40)==0);

А бит ADIF (0x10) никогда не появится, т.к. разрешения на прерывание вы не давали (не устанавливали ADIE). Поэтому ожидание у вас отсутствует и АЦП не успевает накопить число.
И вот этого
ADCSRA|=0x10;
делать не надо.



Но такой код генерит CodeVision сам.
Интересно, но все работает sm.gif
Xenia
Возможно, что я была неправа. Давно встроенным АЦП ничего не измеряла sm.gif
simer
Цитата(Xenia @ Jan 5 2011, 23:59) *
Возможно, что я была неправа. Давно встроенным АЦП ничего не измеряла sm.gif


Главное, что все заработало.
Спасибо за советы.


P.S. Тему можно закрывать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.