PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AD Wandlung mit ATMega8



Andy79
31.03.2008, 08:19
Hallo zusammen !

Bin relativer "C" Frischling und bräuchte Hilfe bei einer AD Wandlung.
Ich möchte an Portpin C0 eine Spannung zwischen 0 und cirka 3 Volt in den Prozessor geben, wandeln und diese dann auf dem Display ausgeben.

Kann mir jemand evtl. mit einem Quellcode dazu dienen ?

Oder ein paar Tips/Hilfen geben ?

Danke Euch allen !!!

Gruss Andy

robocat
31.03.2008, 08:47
ADCSRA=(1<<ADSC)| // start conversion
(1<<ADEN)| // enable converter
(1<<ADFR)| // free running (kontinuierliche wandlungen)
(1<<ADPS2)| // prescaler bit2
(1<<ADPS1)| // prescaler bit1 (siehe datenblatt, S.208, hier clk/64)
(1<<ADIE); // interrupt enable, nur notwendig, wenn du eine ISR hast
als referenzspannung der wandlung wird die spannung an Aref genommen, als eingang C0. deshalb muss man ADMUX hier nicht setzen.

(1<<ADIE) kann evtl. weg, dann liegt dennoch das ergebnis der wandlung in ADCH (high byte) und ADCL (low byte).

mit ADMUX=(1<<ADLAR); hast du das ergebnis left adjusted, also liegt in ADCH ein wert von 0-255 (bei Vmess=Vref). damit hast du ohne bitschubserei eine 8bit wandlung, wenn du ADCL einfach vernachlässigst.

lies das datenblatt. der AD-wandler teil ist nicht schwierig.

gruesse

Franzibua
27.06.2008, 19:03
als referenzspannung der wandlung wird die spannung an Aref genommen, als eingang C0. deshalb muss man ADMUX hier nicht setzen.


Hi, möchte hier gern näher drauf eingehn:
Habe -zugegeben- die fertige Funktion aus dem Forum kopiert, möchte allerdings 5V als Referenzspannung verwenden. Hab also den Code etwas verändert und bei ADMUX |= (1<<REFS1) | (1<<REFS0); das 1<<REFS1) rausgenommen. Schaut dann so aus:



uint16_t ReadChannel(uint8_t channel)
{
uint8_t i;
uint16_t result = 0;

ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADFR); // enable converter | prescaler bit2 | prescaler bit1 | kontinuierliche wandlungen
ADMUX = channel; // Kanal des Multiplexers waehlen
ADMUX |= (1<<REFS0); // Referenzspannung 5 V
ADCSRA |= (1<<ADSC); // Dummyreadout
while(ADCSRA & (1<<ADSC));
result = ADCW;
result = 0;
for(i=0; i<3; i++) // 3x auslesen
{
ADCSRA |= (1<<ADSC);
while(ADCSRA & (1<<ADSC));
result += ADCW;
}
ADCSRA &= ~(1<<ADEN); // ADC wieder deaktivieren
result /= 3; // Durchschnittswert ausrechnen.
return result;
}

Ist das denn so weit richtig??


Zweite Frage:
Im Funktionsaufruf habe ich als Parameter lediglich eine 0 übergeben. Reicht das aus um den AD Pin PC0 dafür auszuwählen?

danke schon mal im Voraus,

Franz

robocat
27.06.2008, 21:06
sieht gut aus. REFS0 ist "AVCC with external capacitor at AREF pin". es wird also deine betriebsspannung, die an AVcc anliegt, als referenz hergenommen. beim atmega8 ist es zumindest so, im zweifelsfall räumt ein blick ins datenblatt alle klarheiten aus ;)
zweite frage: ja, das passt so.

kurz gesagt seh ich grade nichts, warum es so nicht gehen sollte.

gruesse und viel erfolg

Franzibua
29.06.2008, 20:29
Danke fürs Drüberschaun!

Bin begeistert wie schnell man in diesem Forum kompetente Antworten bekommt!

danke,

franz