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

 
 
> tiny 24 глюк АЦП
ventel
сообщение Dec 17 2014, 22:19
Сообщение #1





Группа: Новичок
Сообщений: 9
Регистрация: 5-12-06
Из: Харьков
Пользователь №: 23 153



Народ, помогите найти косяк! уже неделю парюсь...
суть проблемы - на тиньке юзаются 2 канала АЦП, раздельно - работают без проблем, как только включаю их работу по очереди, нормально работаь не хотят, получается какая то завязка друг от друга... оба канала пока на потенциометрах

CODE
clr r20; инициализация АЦП
ldi r20,(1<<ADEN)|(0<<ADSC)|(0<<ADATE)|(0<<ADIE)|(0<<ADPS2)|(1<<ADPS1)|(0<<ADPS0)
out adcsra,r20;

clr r20;
ldi r20,(0<<BIN)|(0<<ACME)|(1<<ADLAR)|(0<<ADTS2)|(0<<ADTS1)|(0<<ADTS0)
out adcsrb,r20;

clr r20;
ldi r20,(0<<REFS1)|(0<<REFS0);
out admux,r20;

test_adc: ;проверка напряжения

clr r20;
ldi r20,(0<<REFS1)|(0<<REFS0)|(0<<MUX5)|(0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(1<<MUX0);
out admux,r20; АЦП для напряжения

ldi r18,0x50;
ps1:
dec r18;
cpi r18,0x00;
brne ps1;

st_adc_u:
sbi adcsra,adsc; запуск АЦП
cadc_1:
ldi R16,adcsra;
sbis adcsra,ADIF; если преобразование закончено, то пропустить след команду
rjmp cadc_1;

in r16,ADCH;
cpi r16,0x3C;0xAA;0xC7; напряжение меньше 12,6B
brlo pt1; если меньше перейти
in r16,ADCH;
cpi r16,0xAA;0xDA;напряжение больше 13,6B
brsh pt01;
rjmp test_adc1;

pt01:
sbi porta,0;
sbi porta,6;

rjmp test_adc1;
pt1:
cbi porta,6;
cbi porta,0;

rjmp test_adc;

;-----------------------------------------
test_adc1: ;проверка температуры

; cbi porta,3;
clr r20;
ldi r20,(0<<REFS1)|(0<<REFS0)|(0<<MUX5)|(0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(1<<MUX1)|(0<<MUX0);
out admux,r20; АЦП для температуры

ldi r18,0x50;
ps2:
dec r18;
cpi r18,0x00;
brne ps2;

st_adc_t:
sbi adcsra,adsc; запуск АЦП
cadc_2:
ldi R16,adcsra;
sbis adcsra,ADIF; если преобразование закончено, то пропустить след команду
rjmp cadc_2;

cbi adcsra,adsc; стоп АЦП

in r16,ADCH;
cpi r16,0x09;0x41; 0x41; Температура больше 75 градусов
brlo pt2; если меньше перейти
in r16,ADCH;
cpi r16,0x2F;0xAA;0x68;
brsh pt02;
rjmp test_adc;

pt02:
sbi porta,5;
sbi porta,4;
rjmp test_adc;

pt2:
cbi porta,5;
cbi porta,4;
rjmp test_adc;

фрагмент схемы, может тут косяк?

еще забыл - кварц - 4МГц, делитель частоты на 8 (FUSE - CKDIV8), и делитель для АЦП - 4, т.е. к теореме Котельникова по частоте выборок притензий нет...
такое ощущение что внутренний конденсатор не разряжается... sad.gif

Сообщение отредактировал IgorKossak - Dec 19 2014, 23:32
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!

Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 2)
Сергей Борщ
сообщение Dec 17 2014, 23:37
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(ventel @ Dec 18 2014, 00:19) *
оба канала пока на потенциометрах
....
такое ощущение что внутренний конденсатор не разряжается... sad.gif
Какое сопротивление у ваших потенциометров? Судя по симптомам ощущение вас не обманывает - не успевает разрядиться/зарядиться конденсатор устройства выборки-хранения. Надо снижать выходное сопротивление источника сигнала или увеличивать время выборки. Поскольку в АВРах нельзя отдельно задать время выборки, у вас есть только две возможности увеличить его - снижать тактовую частоту АЦП или после переключения канала выключать и снова включать АЦП (после включения выборка длится 13.5 тактов АЦП). Вариант с выключением-включением чисто теоретический, живьем не пробовал. А снижение тактовой частоты АЦП помогает.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Dec 18 2014, 07:35
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



Цитата(ventel @ Dec 18 2014, 01:19) *
Народ, помогите найти косяк! уже неделю парюсь...

Вашей теме место в разделе для начинающих, уж не обижайтесь.

Читайте, что пишут про бит ADIF:
This bit is set when an ADC conversion completes and the data registers are updated. The ADC Conversion Complete
Interrupt is executed if the ADIE bit and the I-bit in SREG are set. ADIF is cleared by hardware when executing the
corresponding interrupt handling vector. Alternatively, ADIF is cleared by writing a logical one to the flag.
Beware that if doing a Read-Modify-Write on ADCSRA, a pending interrupt can be disabled.

Не вижу в Вашем коде сброса бита ADIF. А если бы Вы читали даташит, то не стали бы использовать этот бит для определения завершения преобразования (в режиме единичного преобразования). Ибо для этого предназначен бит ADSC, про который, в частности, сказано:
ADSC will read as one as long as a conversion is in progress. When the conversion is complete, it returns to zero.
Writing zero to this bit has no effect.

И почитайте, что делают команды в соответствующем документе. На Ваш код больно смотреть sm.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 17:53
Рейтинг@Mail.ru


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