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

 
 
> mega2561, проблема в АЦП с ADMUX, проблема в АЦП со считыванием нескольких каналов
AngelChik
сообщение May 11 2011, 09:28
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 26-04-07
Пользователь №: 27 336



Всем доброго времени!!! Помогите пожалуйста разобраться в проблеме... Устал, уже весь мозг сломал, всё перепробовал. Устройство: АЦП контроллера измеряет сигнал через делитель напряжения (47/10 кОм), уровень сигнала после делителя - 2 вольта (к примеру). Таких три входа - ADC0-2. Проблема заключается в том, что если считывать только один канал, то всё измеряется на ура, всё (почти) точно по вольтметру. НО! Если в процессе измерения добавить второй канал (или любой другой), то отконвертированное напряжение становится "не правильным", например вместо 12,6 вольт начинает показывать 9.5. Тем не менее, считанное значение остаётся пропорциональным сигналу. Вот код:
CODE
void ADC_task()
{
if(!bMeasure)
return;
__disable_interrupt(); - это я добавил только для пробы, влияет ли таймер динамической индикации на работу АЦП...

samples1 = 0;

ADCSRA &= ~(1<<ADSC);
ADMUX = (1<<REFS1) | (1<<REFS0) + 0;

for(U8 i=0;i<5;i++)
{
ADCSRA |= (1<<ADSC);
while(ADCSRA & (1<<ADIF));
U8 low = ADCL;
U16 ADCResult = low + (ADCH<<8);
samples1 += (ADCResult*2.56)/1024;
}
samples1 = samples1/5;
fU = samples1*5.7; - компенсация делителя

ADCSRA &= ~(1<<ADSC); - это тоже уже от нечего делать...
ADMUX++; если закомментировать эту строчку, то напряжение fU - в норме,
совпадает с реальным, а если не комм. -
то меньше реального на некоторое значение


samples2 = 0;
for(U8 i=0;i<5;i++)
{
ADCSRA |= (1<<ADSC);
while(ADCSRA & (1<<ADIF));
U8 low = ADCL;
U16 ADCResult = low + (ADCH<<8);
samples2 += (ADCResult*2.56)/1024;
}
samples2 = samples2/5;

bMeasure = false;
__enable_interrupt(); - аналогично disble'у...
}


После смены каналов (ADMUX) вставлял задержки __delay_cycles(), самые разные, даже до 1 секунды... Пробовал клокить АЦП по таймеру... От чипа к чипу не меняется ничего (таких 10 плат). Ничего не помогает... У меня осталось только одно подозрение. Как Вы считаете, может делитель 47/10 кОм имеет слишком большое сопротивление для нормальной работы АЦП? Дело в том что сейчас по факту, на втором канале (ADC1) 0 вольт (делитель пустой), ни к чему не подсоединён ("пирожок ни с чем" sm.gif))... Вот я и подумал, переключение коммутатора с 2 вольт на 0 и обратно, поэтому надо вставить задержки после модификации ADMUX... Хрена. Не помогло никак.

Есть интересное наблюдение: если просмотреть самое первое считанное значение fU, то оно будет нормальным в любом случае, так как сразу после запуска проги на контроллере, первым измеряется именно ADC0, но после него идёт переключение канала ADMUX++ (раньше задавал жёстко, без считывания). Отсюда вывод: как только происходит хотя бы одно переключение, то следующие считывания канала ADC0 становятся испорченными... ПОЧЕМУ???

Снимал кондёр с риференс (был 1 нФ), пробовал увеличивать до 1 мкФ, ноль эмоций sad.gif(

К меге подсоединено восемь семисегментных индикаторов, реализована динам. индикация через таймер с прерыванием.

Что скажете? Что непонятно - спрашивайте. Могу выложить фотки устройства...

Сообщение отредактировал AngelChik - May 11 2011, 09:37
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- AngelChik   mega2561, проблема в АЦП с ADMUX   May 11 2011, 09:28
- - Alex_1811   После смены канала перед запуском следующего преоб...   May 11 2011, 09:46
|- - AngelChik   Цитата(Alex_1811 @ May 11 2011, 13:46) По...   May 11 2011, 09:50
- - oran-be   Явно имеет место недозаряд емкости внутреннего УВХ...   May 11 2011, 09:56
- - AngelChik   Эгеее... Спасибо, ща попробую. Ну вот, "пере...   May 11 2011, 10:12
- - oran-be   В принципе п. 2 можно опустить - не дожидаться ко...   May 11 2011, 10:15
- - AngelChik   Спасибо ещё раз за мнение и совет. Снижу сопротивл...   May 11 2011, 11:11
|- - =GM=   Неплохо бы и флаг ADIF сбрасывать после чтения рег...   May 11 2011, 11:12
- - AngelChik   Точняк! Забыл, спасибо. Сброс производится зап...   May 11 2011, 11:19
|- - =GM=   Цитата(AngelChik @ May 11 2011, 10:19) AD...   May 11 2011, 11:49
|- - AngelChik   Цитата(=GM= @ May 11 2011, 15:49) Так. Е...   May 11 2011, 11:56
- - oran-be   Операцию ADMUX = (1<<REFS1) | (1<<RE...   May 11 2011, 11:23
- - нечитатель   Там эта. На всякий случай. Когда АЦП, то надо не т...   May 12 2011, 08:31
- - GYUR22   была подобная фигня на mega128 - ref был с AVCC вс...   May 12 2011, 09:02


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

 


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


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