реклама на сайте
подробности

 
 
> Проблема с разрядностью АЦП
simer
сообщение Jan 5 2011, 18:14
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 22-01-08
Пользователь №: 34 312



АЦП на 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;
}


Проверено при любых вариантах опорного напряжения.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
Сергей Борщ
сообщение Jan 5 2011, 18:32
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (simer @ Jan 5 2011, 23:14) *
Но по непонятным мне причинам значение поднимается только до 200 (0x00C8)
А частота тактирования АЦП находится в допустимых пределах?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jan 5 2011, 18:41
Сообщение #3


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Слишком рано считываете. Ждать надо не исчезновения бита ADIF (0x10), а исчезновения бита ADSC (0x40).
Т.е. вместо
while ((ADCSRA & 0x10)==0);
надо ждать
while ((ADCSRA & 0x40)==0);

А бит ADIF (0x10) никогда не появится, т.к. разрешения на прерывание вы не давали (не устанавливали ADIE). Поэтому ожидание у вас отсутствует и АЦП не успевает накопить число.
И вот этого
ADCSRA|=0x10;
делать не надо.
Go to the top of the page
 
+Quote Post
simer
сообщение Jan 5 2011, 18:58
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 22-01-08
Пользователь №: 34 312



Цитата(Сергей Борщ @ 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
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jan 5 2011, 18:59
Сообщение #5


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Возможно, что я была неправа. Давно встроенным АЦП ничего не измеряла sm.gif
Go to the top of the page
 
+Quote Post
simer
сообщение Jan 5 2011, 19:06
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 22-01-08
Пользователь №: 34 312



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


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


P.S. Тему можно закрывать.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 22:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01391 секунд с 7
ELECTRONIX ©2004-2016