Обсуждаем контроллеры компании Atmel.
Ответить

АЦП Атмега16 сигналы на входах

Чт май 09, 2019 02:58:32

Всем здравствуйте.
Подали на вход ноги 39 (ADC1) постоянку через делитель 600К+200К. Индикатор показывает корректно то, что в прошивке "заказали". Потом подали на ногу 38 (ADC2) другую постоянку через свой делитель 56К+5,1К и хотели на индикатор выводить соответствующую информацию. Коды измерений для обоих входов одинаковые по сути. Но возникла проблема: Напряжение, поданное на вход 38 (ADC2) начинает как-то "пролазить" на вход 39 (ADC1). По отдельности входы корректно читают постоянку и выводят на индикатор то, что должны, а если одновременно подаем сигналы на входы, то они смешиваются. Входы включены как входы, подтягивающие резисторы не включены. Проверили правильность сборки делителей, косяков не нашли. Я новичок в теме AVR. Может надо как то АЦП настроить, чтобы входы независимо работали? Подскажите где искать. :?

Re: АЦП Атмега16 сигналы на входах

Чт май 09, 2019 06:19:55

плату отмыть от флюса спиртом или бензином. дважды )). и код в студию. и схему. информация со входом АЦП не смешивается. возможно в программе ошибка

Re: АЦП Атмега16 сигналы на входах

Чт май 09, 2019 10:36:31

информация со входов может смешиваться, потому что на первый вход сигнал подан неверно. по даташиту источник сигнала на входе АЦП должен иметь внутреннее сопротивление не более 10К, у вас же минимум в 60 раз больше. теперь смотрите: каждй вход имет собственную емкость - несколько пик. и существует емкостная связь между соседними выводами - те же несколько пик. а теперь внимание: вы подали напряжение на вход 2, при этом за счет емкостной связи оно в виде импульса проникло и на вход 1 и зарядило его. когда вы включаете 1-й канал, то из-за большого сопротивления источника питания он намного хуже перезаряжает все эти емкости, в итоге что-то "от второго" остается. особенно, если на первом входе уровень ниже, чем на втором. эти процессы практически незаметны, если параметры измерительных каналов одинаковы и корректно выбраны, но на высоких скоростях семплирования они все равно возникают.
борьба с ними может быть разными способами, но начать надо с правильного сигнала. затем можно попробовать проводить измерения "через один раз": после измерения на 1-ом канале переводить его на выход, выводить в него 0, затем делать "пустой цикл" измерения второго канала, затем "правильный цикл измерений" второго канала, потом то же самое со 2-ым каналом и т.д.
то есть принудительно обеспечивать разряд паразитнх емкостей на за счет того, что соседние пины заземлены.
наконец, можно работать не с каналами 1 и 2, а с каналами 1 и 3, а второй держать в нуле принудительно.
и да, я не говорю, что плату мыть не надо от флюса и т.п. - вероятно, одним этим все может и вылечиться...

Re: АЦП Атмега16 сигналы на входах

Пт май 10, 2019 17:45:51

из личного опыта. когда разбирался с АЦП на Atmega8 то тоже получил кашу на двух каналах. но по отдельности работали норм. решил внедрить "фильтр" среднее арифметическое. один буфер на оба канала. вот и каша получилась

Re: АЦП Атмега16 сигналы на входах

Пт май 10, 2019 18:21:09

ARV писал(а): но начать надо с правильного сигнала.

Первый делитель у меня действительно с завышенными номиналами. Я такой поставил, потому что хотел исключить влияние этого делителя на работу источника сигнала. там тоже есть делитель с не большими номиналами.
А проблему удалось решить путем добавления задержки 1 мс между выбором входа АЦП и запуском измерения. Теперь ничего не смешивается и индикатор все показывает корректно.
Вот кусочек прошивки:

Сразу поясню: Вместо котика в очках в прошивке стоит цифра 8 и потом ). Редактор превращает эту 8 и ) в котика в очках :))
Комменты через // написаны как памятки для себя лично, не обращайте на них внимание....

// чтение напряжения из АЦП (нога 39)
ADMUX:=%11000001;
delay_ms 1;
ADCSRA.6:=1; //запускаем аналоговое измерение
delay_ms 1;

adcread:= ADCL; //сначала читаем младший регистр
adcread:= ((ADCH shl 8) + adcread);


// чтение напряжения из ноги 38
ADMUX:=%11000010;
delay_ms 1;
ADCSRA.6:=1; //запускаем аналоговое измерение
delay_ms 1;

adcvolt:= ADCL; //сначала читаем младший регистр
adcvolt:= ((ADCH shl 8) + adcvolt)/3.65 + 17;

Re: АЦП Атмега16 сигналы на входах

Сб май 11, 2019 09:47:45

в качестве антикотика в редакторе есть кнопка CODE, добавляющая соответствуюшие теги:
Код:
adcread:= ADCL; //сначала читаем младший регистр
adcread:= ((ADCH shl 8) + adcread);

Re: АЦП Атмега16 сигналы на входах

Вс май 12, 2019 19:22:12

Кстати, такой проблемы на новых Аттинях нет. Я пробовал переключать каналы с частотой 70 кГц - на даташитовских 10к "уход" всего 1 значащий бит. На старом атмеловском хламе о таком только мечтать.
Ответить