Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/22: Рейтинг темы: голосов - 22, средняя оценка - 4.73
putmom
0 / 0 / 0
Регистрация: 05.02.2012
Сообщений: 35
1

Проблемы с АЦП.

10.08.2012, 02:06. Просмотров 4068. Ответов 8
Метки нет (Все метки)

Здравствуйте.
У меня есть датчик тока напряжение с которого идёт на ADC0, напряжение оцифровывается и оседает в переменной tok.
Ещё есть 3-х позиционный переключатель, в среднем положении он никуда ничего не подключает, всё висит в воздухе. В положении 1 на ногу ADC1 через сопротивление 1К идёт 5 вольт (до ноги доходит 5 вольт), в положении 2 на ногу ADC1 через делитель 1К / 1К идёт 2.5 вольт (до ноги доходит 2.5 вольт).
Проблема в том, что значение переменной tok зависит от того какое напряжение приходит на ADC1, тоесть если переключатель в среднем положении то значение переменной допустим 50, если в положени 1 то в переменной уже 70, а если 2 положение переключателя, то в переменной 60. С датчика тока идёт во всех случаях одинаковое напряжение.
Причём с датчика тока оцифровывается подряд 128 замеров, потом 1 замер с переключателя и так по кругу.
Делитель частоты АЦП стоит 128, 2 младших бита откидываю. Ток усредняю по 16-ти значениям.

Создаётся впечатление, что есть какое то влияние каналов АЦП друг на друга.
Подскажите как добиться одинаковых результатов.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2012, 02:06
Ответы с готовыми решениями:

возможные проблемы с АЦП
Здравствуйте! Через пару дней хочу начать разбираться с АЦП (МК Atmega16). С какими возможными...

Atmega328, проблемы с АЦП
Здравствуйте, народ. Какие могут быть идеи по следующим симптомам: - всегда 1023 - сам МК...

АЦП+ UART на ATmega16: проблемы
Добрый день. Имеются следующие проблемы. 1. При попытке наладить передачу значения АЦП по UART...

АЦП AVR, проблемы с компиляцией
Всем доброго времени суток! Помогите пожалуйста разобраться с кодом (WinAvr для Atmega8). Мне нужно...

Расширение АЦП микроконтроллера и подключение к АЦП датчиков
Здравствуйте. У меня встала задача сделать устройство для элеватора, для контроля температуры в 864...

8
itysiy
0 / 0 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
10.08.2012, 02:52 2
код в студию. Опорное напряжение откуда берется? к пину AVCC подлючено 5 вольт?
0
putmom
0 / 0 / 0
Регистрация: 05.02.2012
Сообщений: 35
10.08.2012, 03:08 3
Опора внутренняя, 2.56, в 1 посте неправильно написал, на ADC1 приходит 1.25 вольта и 5 в зависимости от того как нажат переключатель, но на предыдущей плате опора была 5 вольт и то же самое, показания зависели от соседнего канала АЦП.
К AVCC подключено 5 вольт через 5-7 мкг и кондёр 0.1 мкф на землю.
Код очень большой, нужно вырезать кусочек отвечающий за АЦП, завтра сделаю.
0
putmom
0 / 0 / 0
Регистрация: 05.02.2012
Сообщений: 35
10.08.2012, 13:22 4
;******** Обработка прер.по АЦП *************************************

ADC_CC :sbi PORTC, 5

cpi selacp, 1 ;если селектор АЦП =1 то идём на контроль тока
breq tok

cpi selacp, 2 ;если селектор АЦП =2 то идём на опрос кнопок
breq key

cpi selacp, 3 ;если селектор АЦП =3 то идём на опрос кнопок
breq akb

akb: ldi selacp, 1

in tempdiv,ADCL ; просто формальность (первым всегда читается ADCL)
in temp, ADCH ; читаем напряжение на АКБ

lds suml, suml2 ;накопленую сумму напряжения на АКБ в быстрые регисты
lds sumh, sumh2
lds sumak, sumak2

add suml, tempdiv ;двухбайтное сложение накопленного значения с
adc sumh, temp ;только что полученым из АЦП

yms sumak ;N - раз сложили ?
mov temp, sumak ;если нет то идём далее
cpi temp, 32
breq wozv1 ;иначе переход

sts suml2, suml ;сохраняем значения
sts sumh2, sumh
sts sumak2, sumak

ldi temp, 0b11100001;запуск преобразования АЦП-1 для тока на диодах
out ADMUX, temp
ldi temp, 0b11001111
out ADCSR, temp

cbi PORTC, 5

reti
;-------------------------------------------------------------------------------
tok: rjmp tok1 ;не хватает длины перехода, перевалочная
key: rjmp key1 ;не хватает длины перехода, перевалочная
;-------------------------------------------------------------------------------
wozv1:

lsr sumh
ror suml
lsr sumh
ror suml
lsr sumh
ror suml
lsr sumh
ror suml

mov temp, suml ;вычитаем 160 из переменной АКБ
subi temp, 80 ;подгоняем 13.3v к нулю по нашей шкале.
mov suml, temp
mov temp, sumh
sbci temp, 3
mov sumh, temp

sts akbh, sumh ;temp
sts akbl, suml

rcall akbzn
;mov akk, sumh

clr sumak
clr suml
clr sumh

sts suml2, suml
sts sumh2, sumh
sts sumak2, sumak

ldi temp, 0b11100001 ;запуск преобразования АЦП-1 для тока на диодах
out ADMUX, temp
ldi temp, 0b11001111
out ADCSR, temp

cbi PORTC, 5

reti

key1: ldi selacp, 3
in temp, ADCL ; просто формальность (первым всегда читается ADCL)
in tacp, ADCH ; wreg contains result
mov t, tacp
lsr t
lsr t
lsr t
lsr t
lsr t

ldi temp, 0b11000000 ;запуск преобразования АЦП-0 для аккумулятора(температура ацп-4)
out ADMUX, temp
ldi temp, 0b11001111
out ADCSR, temp

cbi PORTC, 5

reti

tok1: lds temp, tk
yms temp
cpi temp, 250
breq tk2
sts tk, temp
ldi selacp, 1
ldi temp, 0b11100001 ;запуск преобразования АЦП-1 для тока на диодах
out ADMUX, temp
ldi temp, 0b11001111
out ADCSR, temp
rjmp tk3

tk2: clr temp
sts tk, temp
ldi selacp, 2
ldi temp, 0b11100111 ;запуск преобразования АЦП-7 для кнопок
out ADMUX, temp
ldi temp, 0b11001111
out ADCSR, temp

tk3: in temp, ADCL ; просто формальность (первым всегда читается ADCL)
in temp, ADCH ; wreg contains result

lds suml, suml1
lds sumh, sumh1
lds sumak, sumak1

add suml, temp
clr temp
adc sumh, temp

yms sumak
mov temp, sumak
cpi temp, 8
breq wozv

sts suml1, suml
sts sumh1, sumh
sts sumak1, sumak

cbi PORTC, 5

reti

wozv:
;ror sumh
;ror suml
;ror sumh
;ror suml
ror sumh
ror suml
ror sumh
ror suml
ror sumh
ror suml

mov a, suml
clr sumak
clr suml
clr sumh

rcall ktok

sts suml1, suml
sts sumh1, sumh
sts sumak1, sumak

ldi temp, 0b11100111 ;чтение, АЦП-7
out ADMUX, temp
ldi temp, 0b11001111
out ADCSR, temp

cbi PORTC, 5

reti
;----------------------------------
mov temp, a
cpi temp, 80
breq off

mov temp, shim
cpi temp, 30
brcc tk4

off: cbi PORTB, 1 ;выключаем диоды
cbr flag, 1 ;снимаем флаг включенных диодов
ldi temp, 196
mov kshim, temp

tk4:

cbi PORTC, 5

reti
0
10.08.2012, 13:22
itysiy
0 / 0 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
10.08.2012, 14:02 5
ох уж этот асм, забыл совсем его

Код
ldi temp, 0b11000000 ;запуск преобразования АЦП-0 для аккумулятора(температура ацп-4)
out ADMUX, temp
ldi temp, 0b11001111
out ADCSR, temp
Вот тут при выборе нулевого канала включаешь выравнивание по правому краю, в то время как при преобразовании для других каналов, выравнивание по левому краю, так как ты и говорил. Но при этому младший байт ацп ты вроде нигде не используешь. Чето я запутался в коде уже, мож из за этого белиберда такая?
0
_pv
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,515
10.08.2012, 14:22 6
возможно УВХ не успело установиться после переключения мультиплексора.
можно попробовать добавить задержку между переключением ADMUX и запуском преобразования.
или измерять два раза и выкидывать первое измерение,
либо опрашивать их в другом порядке, чтобы перед ответственным измерением на ADC0 в мультиплексор никто не дергал достаточно долго.
0
putmom
0 / 0 / 0
Регистрация: 05.02.2012
Сообщений: 35
10.08.2012, 14:31 7
Цитата Сообщение от _pv
возможно УВХ не успело установиться после переключения мультиплексора.
можно попробовать добавить задержку между переключением ADMUX и запуском преобразования.
или измерять два раза и выкидывать первое измерение,
либо опрашивать их в другом порядке, чтобы перед ответственным измерением на ADC0 в мультиплексор никто не дергал достаточно долго.
В том то и дело, что я 128 раз подряд измеряю один и тот же канал.
0
putmom
0 / 0 / 0
Регистрация: 05.02.2012
Сообщений: 35
10.08.2012, 14:36 8
Цитата Сообщение от itysiy
Вот тут при выборе нулевого канала включаешь выравнивание по правому краю, в то время как при преобразовании для других каналов, выравнивание по левому краю, так как ты и говорил. Но при этому младший байт ацп ты вроде нигде не используешь. Чето я запутался в коде уже, мож из за этого белиберда такая?
Это другой вход, на него тоже влияет, выравниваю по правому, потому что так задумано.
Вход с датчика тока ADC1.
Может быть если поставить внешний ИОН проблема решится ?
Мне кажется это из-за ИОНа.
Если я не ошибаюсь, то к выходу AREF подключен внутренний ИОН, он у меня висит на землю через 10 мкф, замеряю его точным тестером, напряжение во всех переключениях одинаковое 2.655 в., значит не ИОН.
Чем большее напряжение приходит на один канал АЦП, тем больше значение преобразования на другом канале. Получается они все друг от друга зависят, тогда полная каша получится если все каналы опрашивать.

Нашел ещё про эту проблему, чувак тоже в шоке.
http://itistromyx.ru/forum/lofiversion/index.php/t101048.html
0
putmom
0 / 0 / 0
Регистрация: 05.02.2012
Сообщений: 35
10.08.2012, 16:01 9
Простите дурака, почитал пост чела по ссылке выше, у него проблема исчезла после нескольких замеров подряд, кондёр УВХ не успевал зарядиться/разрядиться.
Снова полез смотреть свой код где я так же подряд читаю показания с датчика тока, в одном месте переключаю ADMUX на нужный канал для повторного замера, а ниже в коде опять на замер переключателя меняю. Билбес.
0
10.08.2012, 16:01
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2012, 16:01

Mega16 и неиспользуемый АЦП (питание ацп?)
Если я не использую АЦП контроллера нужно ли подавать на АЦП питание? Если нет, то просто оставить...

АЦП
Недавно начал изучать мк AVR. Написал программу для работы с АЦП. Ее работу проверяю в протеусе....

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.