Atmega128: Problemy z odczytem temperatury z czujnika LM35 - jakie ustawienia?





Poprzedni Następny
Wiadomość
Spis treści
From: "drozdu" <lbajger_at_nospam_wp.pl>
Subject: atmega128 & adc
Date: Fri, 7 Feb 2003 14:04:03 +0100


Witam!

Czy ktos bawil sie tym ustrojstwem ? Podlaczylem agnd, avcc, podpiolem lm35
i za cholere nie moge zczytac temperatury. Jesli ktos ma doswiadczenie,
prosze o odpowiedz. W tej chwili nie pamietam dokladnie ale mniej wiecej
zczytwywanie wyglada tak:

(prescaler ustawiony)

ADCSRA = (1 << ADCEN) | (1 << ADCSC);
value = ADCL | ADCH << 8;

pozdr.
LB



========
Path: news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!news.onet.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Sebastian Charlak" <sq5axi_at_nospam_poczta.onet.pl>
Subject: Re: atmega128 & adc
Date: Fri, 7 Feb 2003 14:30:44 +0100



Użytkownik "drozdu" <lbajger_at_nospam_wp.pl> napisał w wiadomości
news:b20ang$bpj$1_at_nospam_atlantis.news.tpi.pl...
Witam!

Czy ktos bawil sie tym ustrojstwem ? Podlaczylem agnd, avcc, podpiolem
lm35
i za cholere nie moge zczytac temperatury. Jesli ktos ma doswiadczenie,
prosze o odpowiedz. W tej chwili nie pamietam dokladnie ale mniej wiecej
zczytwywanie wyglada tak:

(prescaler ustawiony)

ADCSRA = (1 << ADCEN) | (1 << ADCSC);
value = ADCL | ADCH << 8;

Witam.
Tak odczytuje z ATmega103, pewnie u Ciebie bedzie tak samo:

#define _GET_BIT4__ & 0x10
#define _CLR_BIT4__ &= 0xef
#define _SET_BIT6__ |= 0x40

/*********************************
ADMUX = i; // ustaw nr wejscia przetwornika
nr 'i'
ADCSR _SET_BIT6__; // rozpocznij pomiar
while((ADCSR _GET_BIT4__) == 0); // czekaj az zakonczy sie pomiar
ADCSR _CLR_BIT4__; // zeruj bit wskazujacy zakonczenie pomiaru
adc[i] = ((unsigned int) ADCW); // wpisz odczytany pomiar do tablicy
/*********************************

Pozdrawiam.
Seba



========
Path: news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!news.atman.pl!newsfeed.gazeta.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!unknown!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: spamtrap_at_nospam_amelek.gda.pl.invalid (Marek Michalkiewicz)
Subject: Re: atmega128 & adc
Date: Sat, 8 Feb 2003 21:43:16 +0000 (UTC)


drozdu <lbajger_at_nospam_wp.pl> wrote:
5) odczytuje wynik: wynik = ADCL | ADCH << 8

Istotna jest kolejność odczytywania (najpierw ADCL, później ADCH)
a taki zapis w C tego nie gwarantuje. Może to by było to?
Ewentualnie jeśli wystarczy tylko 8 bitów, można ustawić bit ADLAR
i czytać tylko ADCH.

niby jakas wartosc tam zciagam z adc, aczkolwiek rozni sie to od moich
oczekiwan.

A dokładniej - jakie napięcie na wejściu i jaka odczytana wartość?

vref to ile ? jesli podlaczone jest np: do vcc to 5000 (5V) ?

Jeśli w tych samych jednostkach podajemy napięcie wejściowe
i odniesienia, to może być nawet 0.005 [kV] :)

jak ustawic prescaler ?

RTFM - tak, by po podziale zegara AVR przez wybrany preskaler,
uzyskać zegar ADC w przedziale 50-200 kHz. Przykładowo, dla
kwarcu 3.6864MHz można ustawić bity ADPS[2...0] na 101 lub 110.

Marek


========
Path: news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!news.onet.pl!newsgate.onet.pl!newsgate.p

Poprzedni Następny
Wiadomość
Spis treści
From: "drozdu" <lbajger_at_nospam_wp.pl>
Subject: Odp: atmega128 & adc
Date: Sun, 9 Feb 2003 13:42:45 +0100


Istotna jest kolejność odczytywania (najpierw ADCL, później ADCH)
a taki zapis w C tego nie gwarantuje. Może to by było to?
Ewentualnie jeśli wystarczy tylko 8 bitów, można ustawić bit ADLAR
i czytać tylko ADCH.

ponoc gcc 'traktuje operacje arytmetyczne od lewej do prawej
wiec to jednoznaczne z :

data = ADCL;
data = data | ADCH << 8;

ale sprawdze to jeszcze.

A dokładniej - jakie napięcie na wejściu i jaka odczytana wartość?

np: 200mV a ADCH + ADCL podaje losowe wartosci np:
1, 38, 79 (to mniej wiecej 200mV ?), 120 etc.

Jeśli w tych samych jednostkach podajemy napięcie wejściowe
i odniesienia, to może być nawet 0.005 [kV] :)

;))

jak ustawic prescaler ?

RTFM - tak, by po podziale zegara AVR przez wybrany preskaler,
uzyskać zegar ADC w przedziale 50-200 kHz. Przykładowo, dla
kwarcu 3.6864MHz można ustawić bity ADPS[2...0] na 101 lub 110.

Czytalem manual 100 razy, aczkolwiek moj angielski (zwlaszcza jesli chodzi o
zwroty techniczne)
jest na dosyc miernym poziomie. Hmm a im wieksza czestotliwosc ADC tym
mniejsza dokladnosc
a wieksza czestotliwosc probkowania ? Jaki prescaler dla 8Mhz

8000000 / 1024 = 7812.5 (kHz ? MHz ?)

Marek

pozdr.
LB




========
Path: news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!news.onet.pl!newsfeed.gazeta.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "drozdu" <lbajger_at_nospam_wp.pl>
Subject: Odp: atmega128 & adc
Date: Sat, 8 Feb 2003 14:58:05 +0100


ADMUX = i; // ustaw nr wejscia
przetwornika
nr 'i'
ADCSR _SET_BIT6__; // rozpocznij pomiar
while((ADCSR _GET_BIT4__) == 0); // czekaj az zakonczy sie pomiar
ADCSR _CLR_BIT4__; // zeruj bit wskazujacy zakonczenie pomiaru
adc[i] = ((unsigned int) ADCW); // wpisz odczytany pomiar do tablicy

Pozdrawiam.
Seba

wlanie nie dziala (chyba dla atmega128 wyglada troche inaczej), robie tak:

1) w ADMUX ustawiam na aref = avcc z kondensatorem przy aref, kanal 0
2) ustawiam prescaler (i tu nie wiem za bardzo jaka wartosc wpisac)
3) ustawiam bity ADEN oraz ADSC
4) czekam na ADIF
5) odczytuje wynik: wynik = ADCL | ADCH << 8
6) wpisuje 1 (zeruje) do ADIF

niby jakas wartosc tam zciagam z adc, aczkolwiek rozni sie to od moich
oczekiwan.
nie jasny jest dla mnie algorytm obliczania wartosci:

Vin * 1024
adc = --------------
Vref

adc to wartosc zciagnieta z kanalu adc ?
vref to ile ? jesli podlaczone jest np: do vcc to 5000 (5V) ?
jak ustawic prescaler ?

dodam ze mam podpiety lm35 bezposrednio do wejscia konwertera

pozdr.
LB




========
Path: news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!newsfeed.gazeta.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: zielpro_at_nospam_cavern.pl (ziel)
Subject: RE: atmega128 & adc
Date: 8 Feb 2003 23:37:41 +0100


Czy ktos bawil sie tym ustrojstwem ? Podlaczylem agnd, avcc,
podpiolem lm35
i za cholere nie moge zczytac temperatury.
Tzn. wychodzą przypadkowe wartości, czy co?

Jesli ktos ma doswiadczenie,
prosze o odpowiedz. W tej chwili nie pamietam dokladnie ale mniej wiecej
zczytwywanie wyglada tak:

(prescaler ustawiony)

ADCSRA = (1 << ADCEN) | (1 << ADCSC);
value = ADCL | ADCH << 8;


To napisz jak sobie przypomnisz dokładniej jak wygląd Twój program.

pzdr
Artur

--
Archiwum grupy: http://niusy.onet.pl/pl.misc.elektronika


========
Path: news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!news.onet.pl!newsgate.onet.pl!newsgate.p

Poprzedni Następny
Wiadomość
Spis treści
From: "drozdu" <lbajger_at_nospam_wp.pl>
Subject: Odp: atmega128 & adc
Date: Sun, 9 Feb 2003 13:44:58 +0100



Dokladnie to jest tak:

void main()
{
u16 data;

/* dla pewnosci */
DDRF = 0x00;
PORTF = 0x00;

/* kondensator 100n podlaczony miedzy aref a agnd */
/* wewnetrzne odniesienie 2.56V */
ADMUX = (1 << REFS1) | (1 << REFS0);

ADCSRA = (1 << ADEN);

for(;;)
{
ADCSRA = ADCSRA | (1 << ADSC);

/* nie mam teraz dostepu do kodu i nie pamietam tej linijki */
/* w kazdym badz razie tu jest na 100% ok a reszta dokladnie tak jak
napisalem */
while (! ADIF)
;

data = ADCL | ADCH << 8;

ADCSRA = ADCSRA | (1 << ADIF);

... outlcd("%.i", data);
}

}

Wyniki sa rozne i dziwne: na wejsciu 200mA a wyniki: 1, 20, 79, 120 etc.

pozdr.
LB




========
Path: news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!newsfeed.gazeta.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai