Задача состоит в необходимости быстро сканировать 6 входов АЦП с частотой переключения мультиплексора 1600 Гц. Ранее работая с интегрированными АЦП различных при низких скоростях переключения входа АЦП микроконтроллеров Atmel, каких либо проблем с результатами преобразований не возникало. Но при быстром переключении входов результатом преобразования был "мусор". Вспомнил что необходимо после изменения входа АПЦ выполнить первичное (пустое) преобразование. Для кодов С это выглядит так:
По различным информационным источникам сразу после пустого преобразования рекомендуется выполнить считывание аналогового значения в стандартном порядке:
Код:
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE; // Назначаем вход АЦП + источник опорного напряжения для выполнения считывания аналога
ADCSRA|=0x40; // Запуск преобразования
while ((ADCSRA&0x10)==0); // Ожидание завершения
ADCSRA|=0x10; // Выключаем АЦП
return ADCW; // Возращаем результат
}
Но нигде не сказано о необходимости выполнения задержки дабы завершить пустое преобразование. И о номере входа АЦП по умолчанию назначаемый при "пустом" проеобразовании.
Суть в том что если вход "пустого" преобразования назначен "0", а вход считывания каким-либо другим, то всё равно появляется мусор, поэтому пришлось сделать таким образом, при пустом преобразовании назначать входом АЦП тот который будет использоваться в дальнейшем:
Код:
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE; // Назначаем вход АЦП + источник опорного напряжения для выполнения "пустого" преобразования
ADCSRA=0xC0; // Запус преобразования
delay_us(10); // Задержка 10 мкС
ADMUX=adc_input|ADC_VREF_TYPE; // Назначаем вход АЦП + источник опорного напряжения для выполнения считывания аналога
ADCSRA|=0x40; // Запуск преобразования
while ((ADCSRA&0x10)==0); // Ожидание завершения преобразования
ADCSRA|=0x10; // Выключаем АЦП
return ADCW; // Возращаем результат
}
Задерка delay_us(10); внутри совмещённого преобразования подобрана эксперементально методом "научного тыка" и даёт наилучший результат, но все же, при непрерывном сканировании за период нескольких минут может появлятся цифровой "мусор".
В чём я не прав?
Такт АЦП выбирался в пределах 125 кГц... 1МГц, результат тот же. _________________ Тротила для дураков не бывает® One
Добавлено: Пн Мар 24, 2008 16:50:22 Заголовок сообщения:
С 6 не работал, работал с двухточечным, менял просто вход без всяких пустых преобразований и нормально все работает. преоразования делал с частотой 2Гц. чаще не нада было на ЖК выводил.
т.е. у меня на кварце часовом часики тикали на Т2 и каждые 0,5 секунды происходило переключение пина и преобразование. До сих пор робит под 300 греют датчики при вакууме
Зарегистрирован: Oct 10, 2007 Сообщения: 259 Откуда: Ukraine, Kyiv
Добавлено: Пн Мар 24, 2008 21:51:40 Заголовок сообщения:
ИРБИС, время преобразования АЦП определяется тактовой частотой АЦП и при указанном диапазоне составляет 13... 65 мкс.
Потверждение "данные готовы" происходит на участке:
Код:
while ((ADCSRA&0x10)==0); // Ожидание завершения
через регистр ADCSRA. _________________ Тротила для дураков не бывает® One
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы