Hallo Leute,
Habe mich noch einmal intensivst damit beschäftigt, edlich den ADC meiner AVRs bedienen zu können...
Nun habe ich einiges herausgefunden, doch ein paar Fragen habe ich noch.
Hier mal der gesamte Beispielcode (Auszug aus http://www.rn-wissen.de/index.php/ADC_%28Avr%29 )
Der 'Kanal des Multiplexers' heißt in diesem Fall PortB1 oder auch ADC1 ??#include <avr/io.h>
#include <inttypes.h>
uint16_t readADC(uint8_t channel ) {
uint8_t i;
uint16_t result = 0;
// Den ADC aktivieren und Teilungsfaktor auf 64 stellen
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);
// Kanal des Multiplexers waehlen
// Interne Referenzspannung verwenden (also 2,56 V)
ADMUX = channel | (1<<REFS1) | (1<<REFS0);
// Den ADC initialisieren und einen sog. Dummyreadout machen
ADCSRA |= (1<<ADSC);
while(ADCSRA & (1<<ADSC));
// Jetzt 3x die analoge Spannung and Kanal channel auslesen
// und dann Durchschnittswert ausrechnen.
for(i=0; i<3; i++) {
// Eine Wandlung
ADCSRA |= (1<<ADSC);
// Auf Ergebnis warten...
while(ADCSRA & (1<<ADSC));
result += ADCW;
}
// ADC wieder deaktivieren
ADCSRA &= ~(1<<ADEN);
result /= 3;
return result;
}
int main(void) {
uint16_t result = readADC(0); //Auslesen der analogen Spannungen an Pin 0,
// also ADC0. In result steht das Ergebnis.
return 0;
}
Die interne Referenz ist 2,56 V. Dazu muss ich noch einen Kondensator (mit 15pF ?) an AREF schalten?
Wohin gibt die Funktion die Variable 'result' eigentlich zurück?
Hier... Im letzten Absatz, für was ist der gut?? Da ruft man einfach eine neue Funktion auf, die das Ergebnis ausliest? Wieso heißt das result = read ADC(0)? Wieso fragt man nicht direkt die Variable ab? Oder fragt man hier den AD-Converter, welchen Wert er als letzten draufhatte?? Und das return 0 heißt, er springt wieder zum Anfang zurück und misst wieder die Spannung (Endlosschleife?)??
Ist dies eine Funktion? Die Schreibweise sieht so aus...
Was heißt hier das Channel?
Auf jeden Fall Danke im Vorraus!!
Lesezeichen