Gast
#690219
Hallo Leute,
ich setze mich im Moment mit ADC auseinander, zum größten Teil verstehe
ich es, ich hätte jedoch trotzdem paar Fragen.
Dieses Außenrum verstehe ich nicht.
Das ist dieses Beispiel aus dem Tutorial:
uint16_t ReadChannel(uint8_t mux)
{
uint8_t i;
uint16_t result;
ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler
// setzen auf 8 (1) und ADC aktivieren
(1)
ADMUX = mux; // Kanal waehlen
ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
/* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man
liest
also einen Wert und verwirft diesen, um den ADC "warmlaufen zu
lassen" */
ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
while ( ADCSRA & (1<<ADSC) ) {
; // auf Abschluss der Konvertierung warten
}
result = ADCW; // ADCW muss einmal gelesen werden,
// sonst wird Ergebnis der nächsten Wandlung
// nicht übernommen.
/* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden
Wandlungen */
result = 0;
for( i=0; i<4; i++ )
{
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while ( ADCSRA & (1<<ADSC) ) {
; // auf Abschluss der Konvertierung warten
}
result += ADCW; // Wandlungsergebnisse aufaddieren
}
ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2)
result /= 4; // Summe durch vier teilen = arithm.
Mittelwert
return result;
}
...
/* Beispielaufrufe: */
void foo(void)
{
uint16_t adcval;
adcval = ReadChannel(0); /* MUX-Bits auf 0b0000 -> Channel 0 */
...
adcval = ReadChannel(2); /* MUX-Bits auf 0b0010 -> Channel 2 */
...
}
Wenn ich es richtig verstanden habe, ist es wie eine Funktion aufgebaut,
mit der Variable "mux" wird der analoge Pin übergeben, an dem gemessen
werden soll, und in die Variable "ReadChannel" das Ergebniss der Messung
an
das eigentliche Programm.
Ich bin mir aber gar nicht sicher weil ich so eine Schreibweise noch
nicht gesehen habe "uint16_t ReadChannel(uint8_t mux)"
Was haben die Klammern zusagen??
Muss ich "mux" eine Nummer zuweisen? (Welcher Pin)und in welcher
Schreibweise 2 oder 0b00000010.
Ich Verwende ein ATmega 32, habe ich es richtig verstanden dass man die
Taktung von 0-16 MHz einstellen kann? Ich weis nicht wie der jetzt
getaktet wird, wo finde ich es? dann muss ich doch auch den
Frequenzvorteiler im ADCSRA verändern.
Mit dem Quellcode von Oben funktioniert es noch nicht.
Ich hoffe die Fragen sind nicht all zu doof und dass ihr einem Anfänger
helfen könnt. (Wäre sehr nett)