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

Atmega8A и АЦП скачут показания

Пт янв 10, 2020 12:59:00

Доброго времени всем!
На Atmega8A использую АЦП со скоростью преобразования около 80кгц, опорное 5вольт. Делаю 64 измерения, потом усредняю. И в итоге показания могут отличаться в 3-4 раза. Проверял мультиметром и осциллографом входное напряжение стоит на месте. У кого какие идеи есть, как это исправить?

Re: Atmega8A и АЦП скачут показания

Пт янв 10, 2020 13:44:57

RUNA писал(а):У кого какие идеи есть, как это исправить?
Надо найти причину такого поведения и устранить ее.

Re: Atmega8A и АЦП скачут показания

Пт янв 10, 2020 13:56:11

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

Re: Atmega8A и АЦП скачут показания

Пт янв 10, 2020 14:22:19

Измеряю напряжение от датчика температуры lm135 подключен по стандартной схеме из ДШ. Преобразование запускаю по таймеру, каждые 8мс.
Вложения
LM335.jpg
(5.77 KiB) Скачиваний: 258

Re: Atmega8A и АЦП скачут показания

Пт янв 10, 2020 14:58:52

МК покупали у китайцев? Покупал я как-то у китайцев ATMega8A-PU, всё вроде бы нормально, но вот с работой АЦП были подобные проблемы у всей партии. :evil: :kill: Покупка партии МК здесь на базаре радиокота решила все проблемы. :)) Партия МК с китая успешно работают в других устройствах, где не задействован АЦП. :roll: :dont_know:

Re: Atmega8A и АЦП скачут показания

Пт янв 10, 2020 15:01:34

Я не знаю откуда партия. Покупал в Микронике СПб.

Re: Atmega8A и АЦП скачут показания

Пт янв 10, 2020 16:10:14

откуда берется опорное для АЦП?

Re: Atmega8A и АЦП скачут показания

Пт янв 10, 2020 16:58:20

Опорное внутреннее.

Re: Atmega8A и АЦП скачут показания

Пт янв 10, 2020 18:19:18

RUNA, такое ощущение, что вы комсомолец на допросе в гестапо.
Как подключен AVCC, AREF ?
Покажите фрагмент кода, где вы инициализируете АЦП, где читаете и как усредняете...
В перерывах между измерениями с АЦП что то делается? ADCSRA и ADMUX остаются те же, что и при инициализации?
Дорожки от вашего датчика и к ноге МК длинные? Не могут ли быть на них наводки от соседних дорог ?
Какой резистор подтяжки у вашего термодатчика ?
Суть - чем больше вы покажете информации, тем быстрее вам помогут локализовать проблему.

Есть ли у вас возможность проверить ваш алгоритм на другом МК? На той же меге в макетке или андурине ?

Re: Atmega8A и АЦП скачут показания

Пт янв 10, 2020 20:22:23

Раньше не мог выложить, был на работе.

Инициализация
clr temp
sbr temp,(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)
out ADCSRA,temp
clr temp
sbr temp,(1<<REFS0)
out ADMUX,temp

Считывание показаний и усреднение когда сложим 64 показания
sbi ADCSRA,ADIF
ldi ZL,Low(Summa_ADC_t)
ldi ZH,High(Summa_ADC_t)
in r20,ADCL
in r21,ADCH
ld temp1,Z+
ld temp,Z
add temp,r20
adc temp1,r21
st Z,temp
st -Z,temp1

lds temp,Counter_ADC
inc temp
sts Counter_ADC,temp

cpi temp,64
breq PC+2
ret;

ldi ZL,Low(Summa_ADC_t)
ldi ZH,High(Summa_ADC_t)
ld temp1,Z+
ld temp,Z
ldi temp2,6
ADC_in_000://Усреднение
lsr temp1
ror temp
dec temp2
cpi temp2,0
brne ADC_in_000

Сопротивление к датчику 2ком питание 5в

Между измерениями и в момент измерений может работать SPI и UART
Вложения
Захват-2.jpg
(95.59 KiB) Скачиваний: 228

Re: Atmega8A и АЦП скачут показания

Пт янв 10, 2020 20:57:28

так. Пишем в ADCSRA делитель (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0) - это делитель тактовой 128.
При 8 МГц / 128 тактовая АЦП - 62.5 кГц. При 16МГц - 125 кГц. Норм.

Далее. Поднимаем в ADMUX бит REFS0. Ок, опора - питальник с кондером на AREF. Вход исключительно PORTC0. (хотя судя по обрывку схемы, вы планируете читать 8 датчиков)

Вопрос номер раз. PORTC0 сконфигурирован как вход без подтяжки?

Вопрос номер два. Я не вижу в инициализации поднятия бита ADEN в регистре ADCSRA. Т.е. после инициализации АЦП остается выключен!.

Вопрос номер три. Я нигде не вижу запуск преобразования АЦП (установка ADSC в ADCSRA).

Замечание номер четыре. После включения АЦП (ADEN) нужно выполнить холостое преобразование, ибо его результат будет далек от ожидаемого.....
Кстати, где то на просторах сети натыкался, что если мерять несколько разных аналоговых сигналов, то после переключения входа АЦП тоже нужно запустить холостое преобразование... Какое то объяснение этому тоже вроде было - перезарядка входной емкости устройства выборки-хранения АЦП....

Re: Atmega8A и АЦП скачут показания

Пт янв 10, 2020 21:14:21

Код:
sbr temp,(1<<REFS0)
out ADMUX,temp

Кондер на Aref нужен.

Re: Atmega8A и АЦП скачут показания

Сб янв 11, 2020 07:54:45

Возможно, нет начальной установки, типа
Код:
;Инициализация

   clr temp
   STS   Counter_ADC,temp
   STS   Summa_ADC_t+0,temp
   STS   Summa_ADC_t+1,temp

sbr temp,(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)
......
......

Re: Atmega8A и АЦП скачут показания

Сб янв 11, 2020 12:51:31

так. Пишем в ADCSRA делитель (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0) - это делитель тактовой 128.
При 8 МГц / 128 тактовая АЦП - 62.5 кГц. При 16МГц - 125 кГц. Норм.

Далее. Поднимаем в ADMUX бит REFS0. Ок, опора - питальник с кондером на AREF. Вход исключительно PORTC0. (хотя судя по обрывку схемы, вы планируете читать 8 датчиков)

Вопрос номер раз. PORTC0 сконфигурирован как вход без подтяжки?

Вопрос номер два. Я не вижу в инициализации поднятия бита ADEN в регистре ADCSRA. Т.е. после инициализации АЦП остается выключен!.

Вопрос номер три. Я нигде не вижу запуск преобразования АЦП (установка ADSC в ADCSRA).

Замечание номер четыре. После включения АЦП (ADEN) нужно выполнить холостое преобразование, ибо его результат будет далек от ожидаемого.....
Кстати, где то на просторах сети натыкался, что если мерять несколько разных аналоговых сигналов, то после переключения входа АЦП тоже нужно запустить холостое преобразование... Какое то объяснение этому тоже вроде было - перезарядка входной емкости устройства выборки-хранения АЦП....


Частота 11.0592Мгц
Да планирую 8 входов измерять, но пока с одним маюсь.
PORTC0 вход без подтяжки.
Запуск АЦП происходит в прерывание таймера.

Холостое преобразование не делал. Попробую. Но врятли это поможет. Даже если первое преобразование кривое то на сумму в 64 измерения сильно не повлияет. Сумма измерений скачет от 40600 до 0.
Кондер на AREF вешал, не помогает.
Сейчас поеду куплю новый мк, но mega8. И попробую. Может действительно глючная.

Re: Atmega8A и АЦП скачут показания

Сб янв 11, 2020 13:29:46

RUNA, Включите АЦП при инициализации и больше его не выключайте.
В прерывании дергайте только старт преобразования.

И, кстати, вы окончание преобразования продолжаете ждать там же, в прерывании таймера ?
Если да, то это не совсем правильно. У вас всё стоит, пока вы ждете результат АЦП.
Лучше сделайте отдельное прерывание для АЦП.

Тогда в таймере дёрнете старт. А АЦП как посчитает - вызовет свое прерывание, где вы уже и будете суммировать результат.
Там же потом можете переключать MUX.

Кондер на AREF повесьте - это прямое требование даташита. 0.1 мкф керамику.

Re: Atmega8A и АЦП скачут показания

Сб янв 11, 2020 16:42:49

Думаю, для начала нужно вообще убрать усреднение. 4, 5 разрядов будут болтаться от помех, можно будет вычистить аппаратно. Сейчас непонятно. По мне, дело в программе. Не может так работать АЦП.

Re: Atmega8A и АЦП скачут показания

Сб янв 11, 2020 17:07:07

Преобразование запускаю по таймеру, каждые 8мс.

На сколько я могу предположить, для 64 измерений (преобразований) потребуется более 8 мс… или 8 мс это между каждым единичным измерением?

Re: Atmega8A и АЦП скачут показания

Сб янв 11, 2020 19:07:58

Самсусамыч, тактовая 11 мгц, делитель АЦП 128. Тактовая для АЦП = 11 мгц/128 = 85,9 кгц, соответственно, период тактовой чуть менее 12 мкс. АЦП для первого измерения надо 25 тактов - это около 290 мкс, для последующих - 13 тактов - это порядка 150 мкс.
так что в 8 мс уложится. Я так думаю, что это единичные измерения каждые 8 мс.
тем более на фрагменте кода автор показывал, что сбрасывает флаг ADIF, т.е. он его где то проверяет

Вообще тут приходится гадать на кофейной гуще - ибо весь код, относящийся к работе с АЦП, автор так и не показал.
Мне что то подсказывает, что если автор включает АЦП перед каждым измерением, а потом тут же выключает - то это тоже может влиять.

Re: Atmega8A и АЦП скачут показания

Сб янв 11, 2020 19:57:56

Самсусамыч, тактовая 11 мгц

Откуда взяли такую тактовую частоту? Я просмотрел сообщения и не увидел где это указанно. :dont_know:
АЦП для первого измерения надо 25 тактов - это около 290 мкс, для последующих - 13 тактов - это порядка 150 мкс.
так что в 8 мс уложится.

Может и так, но в прерывании по АЦП как правило ещё дополнительно что-то делают… выгружают в стек, а затем возвращают необходимые данные обратно… переключают входа мультиплексора и тп. Хотя да полной картины нет, а гадать на кофейной гуще дело не благодарное.

ЗЫ. Можно было бы лучше написать тестовую прошивку для проверки работы АЦП с выводом информации по UART… тогда было бы виднее что происходит со значениями. :)
Последний раз редактировалось Самсусамыч Сб янв 11, 2020 20:10:49, всего редактировалось 1 раз.

Re: Atmega8A и АЦП скачут показания

Сб янв 11, 2020 19:59:07

Самсусамыч, на два сообщения выше вашего вопроса про 8 мс
Ответить