Błędy przy pomiarze napięć na wejściu ADC PA0-PA7 w ATmega8535 - co sprawdzić?
Problem z ADC w ATmega8535
From: "ZyLex" <pzylka_at_nospam_polbox.com>
Subject: Problem z ADC w ATmega8535
Date: Fri, 4 Feb 2005 18:11:26 +0100
Witam !
Mam problem z pomiarem napięć na wejściach PA0-PA7 w ATmega8535. Program
banalny - zmierz napięcie
w jednym kanale, wyślij ADCH i ADCL przez UARTA i tak 200 razy. Niby podczas
symulacji
(kompilowane pod WinAVR i symulowane w VMLab dla ATmega16) wszystko jest OK.
Natomiast w "żywym" układzie (zaprogramowanym już po kompilacji pod
ATmega8535, bo VMLab
nie wspiera jeszcze ATmega8535) dostaję zawsze tą samą wartość, bliską
napięciu odniesienia (0x3FF).
Używam wewnętrznego źródła napięcia odniesienia 2,56V, zewnętrzny oscylator
12MHz, zasilanie +5V
podłączone na Avcc, wy. Vref "wisi" - nie jest odsprzęgnięte kondensatorem
(ale to chyba nie grzech ? :-))).
Sprawdzałem na kilku kanałach i nic... Kod wyglada tak:
unsigned char uc;
ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1); //preskaler 1:64 -> ADC clock 188kHz
UBRRL=UBRRL_VALUE;
sbi(UCSRB,TXEN); // włącz nadajnik UART
sbi(UCSRB,RXEN); // włącz odbionik UART
for (uc=0;uc!=200;uc++) {
ADMUX=0xC0; // podłącz kanał 0ADC, Vref=2.56V
ADCSRA|=(1<<ADSC); // rozpocznij konwersję
while(!(ADCSRA&0x10)); // i poczekaj na jej zakończenie
loop_until_bit_is_set(UCSRA,UDRE); // czekaj na koniec nadawania
UDR=ADCH;
loop_until_bit_is_set(UCSRA,UDRE); // czekaj na koniec nadawania
UDR=ADCL;
}
Czy port A należy w jakiś specjalny sposób konfigurować, gdy jest używany
jako we. analogowe ?
Wszelkie uwagi i sugestie mile widziane - równiez na priva:
wkwj_et_gazeta.pl.
zylex
From: "sgx" <_no_spm__lukasz_at_nospam_bravonet.org_>
Subject: Re: Problem z ADC w ATmega8535
Date: Fri, 4 Feb 2005 20:44:03 +0100
Mam problem z pomiarem napięć na wejściach PA0-PA7 w ATmega8535. Program
Witam
tak bez dalszej analizy przy okazji opisu pecela w EdW kiedys pisali ze dla
adc trzeba obnizyc napiecie - nie moze byc 5V
nie wiem czy pomoze ale sprobuj, przejzyj pdf'a i moze jak mozesz art. o
pecelu moze pomoze ;]
pozdr.
szogun
From: "Piotrek Sz." <zumek_at_nospam_WYTNIJ.gazeta.pl>
Subject: Re: Problem z ADC w ATmega8535
Date: Fri, 4 Feb 2005 20:54:16 +0000 (UTC)
sgx <_no_spm__lukasz_at_nospam_bravonet.org_> napisał(a):
Mam problem z pomiarem napięć na wejściach PA0-PA7 w ATmega8535. Program
Witam
tak bez dalszej analizy przy okazji opisu pecela w EdW kiedys pisali ze dla
adc trzeba obnizyc napiecie - nie moze byc 5V
...
szogun
Tak , tylko to chodziło o AT90S8535 i o wewnętrzny zegarek(timer) napędzany
zewnętrznym kwarcem 32768 kHz ,jeśli mnie pamięc nie myli ;-)
Piotrek
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
From: "sgx" <_no_spm__lukasz_at_nospam_bravonet.org_>
Subject: Re: Problem z ADC w ATmega8535
Date: Sat, 5 Feb 2005 20:54:27 +0100
Tak , tylko to chodziło o AT90S8535 i o wewnętrzny zegarek(timer)
napędzany
zewnętrznym kwarcem 32768 kHz ,jeśli mnie pamięc nie myli ;-)
hehe prawda ;)
sorki za zamet ;]
pozdro.
szogun
From: "wkwj" <wkwj_at_nospam_gazeta.pl>
Subject: Re: Problem z ADC w ATmega8535
Date: Sat, 5 Feb 2005 13:03:13 +0100
"Datasheet" Atmela do ATmega8535 mówi, że:
- noga AVCC ma być podłączona do Vcc przez low-pass filter (stosuję
sugerowane tamże
rozwiązanie 10uH + 100nF),
- napięcie na AVCC nie może różnić się od Vcc o więcej niż +/-0.3V ( u mnie
różni się o 1mV)
I tyle - nic o obniżaniu napięcia zasilania części analogowej (a
powiedziałby, że wprost przeciwnie :-).
Czy nikt nie próbował używać (i udało mu się to !) ADC w ATmega8535 ???
zylex (wciąż poszukujący rozwiązania :-))))
From: JS <_do_not_use__at_nospam_polbox.com>
Subject: Re: Problem z ADC w ATmega8535
Date: Sat, 5 Feb 2005 19:15:49 +0000 (UTC)
W artykule <cu0a9k$7ee$1_at_nospam_panorama.wcss.wroc.pl>
autorem którego mieni się ZyLex, napisano:
Mam problem z pomiarem napięć na wejściach PA0-PA7 w ATmega8535. Program
[...]
nie wspiera jeszcze ATmega8535) dostaję zawsze tą samą wartość, bliską
napięciu odniesienia (0x3FF).
Używam wewnętrznego źródła napięcia odniesienia 2,56V, zewnętrzny oscylator
12MHz, zasilanie +5V
podłączone na Avcc, wy. Vref "wisi" - nie jest odsprzęgnięte kondensatorem
Na Vref jest ok. 2.6V ?
while(!(ADCSRA&0x10)); // i poczekaj na jej zakończenie
W ATmedze128 (nie wiem, jak tu) ADIF pozostanie ustawiony i trzeba go
skasować ręcznie:
ADCSRA |= 0x10;
loop_until_bit_is_set(UCSRA,UDRE); // czekaj na koniec nadawania
UDR=ADCH;
loop_until_bit_is_set(UCSRA,UDRE); // czekaj na koniec nadawania
UDR=ADCL;
W ogólności (dla free-run mode) lepiej odczytywać najpierw ADCL,
a po nim ADCH, bo wtedy odczyt jest spójny (oba bajty pochodzą
z tej samej konwersji).
Niestety powyższe uwagi IMO nie wyjaśniają Twojego problemu.
Czy port A należy w jakiś specjalny sposób konfigurować, gdy jest używany
jako we. analogowe ?
Bezpiecznie będzie ustawić jako wejścia.
--
Moje konto na Polboksie to jar0sz
Pozdrawiam
Jarosław Szynal
From: "ZyLex" <wkwj_at_nospam_gazeta.pl>
Subject: Re: Problem z ADC w ATmega8535
Date: Tue, 8 Feb 2005 14:23:51 +0100
No, problem "się" rozwiązał po kilku nocnych godzinach:
- przesiadłem sie na ATmega16 (z innych powodów) - początkowo problem ten
sam,
- wygląda na to, że OBOWIĄZKOWO należy czytać najpierw ADCL a potem ADCH
nie tylko ze względu na możliwość "korupcji" wyniku przy pracy "free run"
ale ze względu
na blokowanie dostepu do rejestrów ADCH i ADCL przy odczycie z ADCL (o czym
"delikatnie" wspomina dokumantacja). Jak się najpierw odczyta z ADCH a potem
z ADCL,
to te rejestry przestają być dostępne dla układu ADC i pomimo, że ADC
pracuje i mierzy,
to nowego wyniku po prostu nie ma, no bo nie może być tam zapisany. Odczyt z
ADCH
odblokowuje dostęp ale odczyt z ADCL zaraz go znowu blokuje...
- wydaje się, że jeżeli nie jest używane przerwanie od ADC, to w trybie "one
shot"
najwygodniej jest sprawdzać flagę ADCS, która jest gaszona sprzętowo po
zakończeniu
przetwarzania - nie trzeba niczego "gasić" ręcznie,
Pozdrawiam,
ZyLex