|
АЦП Tiny13V на входе ноль, а результат преобразования не 0, Как такое может быть? |
|
|
|
Oct 24 2010, 13:14
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Схема влючения простая. Вход АЦП (PB4) зашунтирован на обший резистором 68 Ом и конденсатором 1000 мкф. Осциллограф и тестер утверждают, что там 0 В. Да и по уму ничему другому там взяться неоткуда. Плата мытая. Результатом преобразования имеем значение 15 или около того. Вход АЦП (PB3) зашунтирован на общий резистором 4,7 кОм. Картина примерно таже самая. Суть проблемы в целом такова, что на нижнем пределе нет устойчивой однозначности результата преобразования. Плавно изменяющееся напряжение, снятое с RC-цепочки (время изменения от 1,03 В до 0 В примерно 1,5 с) демонстрирует даже какое-то подмигивание перед выключением светодиода, но не всегда а только примерно в 20% случаев. Из 10 значащих бит АЦП использую только старшие 8. Монтаж СМД, перекосов общего провода вродебы нет. Контроллер управляет MOSFETами, а они светодиодами. Яркость светодиодов управляется аппаратным ШИМом от таймера. Ну вобщем суть вопроса в том, как избавиться от миганий светодиода при нижних значениях яркости, в т.ч. и при нулевой яркости? Спасибо. Код volatile unsigned int c1,c2,adc_data; volatile unsigned char t1,t2,flag1,flag2;
unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input | 0b01100000; ADCSRA |= (1<<ADSC); //начать преобразование while (!(ADCSRA & (1<<ADIF))) {asm("nop");}; //ждем появления флага завершения преобр. ADCSRA |= (1<<ADIF);//сбросить флаг //return ADCW; return ADCH; }
ISR(TIM0_OVF_vect) { if(flag1==1) { OCR0A=t1; flag1=0; } if(flag2==1) { OCR0B=t2; flag2=0; } }
int main(void) { PORTB = 0b00000000; DDRB = 0b00000111; OCR0A = 0; OCR0B = 0; TCNT0 = 0x01; //set count TCCR0A = 0b10100001; TCCR0B = 0b00000100; //start timer TIMSK0 = 0b00000010; DIDR0=0b00011000; ACSR = 0x80;//компаратор выключить
ADCSRA = 0b10000110;
asm("sei");
while(1) { if(flag1==0) { adc_data=read_adc(2); c1=0; for(unsigned char i=0; i<250; i++) { adc_data=read_adc(2); if(adc_data>c1) c1=adc_data; } t1=(unsigned char)c1; if(c1>=250) t1=255; if(c1<4) t1=0; flag1=1; } if(flag2==0) { adc_data=read_adc(3); c2=0; for(unsigned char i=0; i<250; i++) { adc_data=read_adc(3); if(adc_data>c2) c2=adc_data; } t2=(unsigned char)c2; if(c2>=250) t2=255; if(c2<10) t2=0; flag2=1; } // OCR0A=pgm_read_byte(&brightness[t1]); // OCR0B=pgm_read_byte(&brightness[t2]); asm("nop"); } return 0; }
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Oct 24 2010, 17:44
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

|
Цитата(ARV @ Oct 24 2010, 21:29)  сколько встречал, в том числе и в даташитах, всюду конец преобразования определяют по "падению" бита ADSC, а не по установке ADIF. сам всегда так делал и никогда никаких подозрительных вариаций показаний АЦП не видел. может, собака тут порылась? объяснений такого подхода не встречал (но и не искал) - неужели причина лишь в том, что его сбрасывать надо перед очередным замером?! Исключено. А обработка по ADSC - это когда обработка по опросу, ADIF да, надо сбрасывать. Если же обработка по прерываниям - то само собой по ADIF. Но никак это все не может быть связано с таким сильным смещением показаний.
|
|
|
|
|
Oct 26 2010, 06:03
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Резисторы в цепи затворов 68 Ом. MOSFET IRL520. Закоротка входа не дает ничего. На счет переключения каналов, ставил задержку 0,1 с, убирал переключение вообще - изменений небыло. Наверно действительно нужно собрать на другом контроллере с внешней опорой и отдельным питанием аналоговой части. Есть такое наблюдение - после прошивки иногда бывает все правильно, АЦП выдает ноль, но по прошествии времени опять не ноль причем в хаотическом порядке. Или после включения ноль, подать-снять входное напряжение, опять хаотические ненулевые показания.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Oct 26 2010, 10:54
|
Профессионал
    
Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364

|
Цитата 660 Ом (2х330) при питании в 9 В. Подробнее, пли-из, как подключен светодиод!? Причем тут 9В? ЗЫ. А вообще - нет ли у тебя на ногах МК напряжения более чем на 0,2В выше напряжения питания. Если есть - убери. А затем посмотри на результат...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|