Also ich habe mir jetzt ca. 10 mal ein ADC Tutorial durchgelesen und glaube ich habe es verstanden (wenn ja dann ist das ja gar nicht soo schwer)
Code:uint16_t ReadChannel(uint8_t mux) { uint8_t i; uint16_t result; ADMUX = mux; // Kanal waehlen ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler // setzen auf 8 (1) und ADC aktivieren (1) /* 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 */ ... }
So in etwa könnte das dann auch in mein Programm eingebaut werden um die werte der Liniensensoren auszulesen .
Statt ReadChannel würde ich die Funktion z.B. Linie nennen
und die Werte von Linie(0) Linie(1) Linie(2) Linie(3) messen und verarbeiten (Reglung...)






Zitieren

Lesezeichen