Hallo zusammen, ich versuche eine AD-Wandlung durchzuführen. Benutze dazu folgenden Code: _____________________________________________________________________ uint16_t ReadChannel(uint16_t mux) { int i; uint16_t result; char dout_1[6]; ADCSRA |= ((1 << ADEN) | (1 << ADPS2) | (1 << ADPS0)); ADCSRA &= ~(1 << ADPS1); ADMUX = mux; // Kanal waehlen ADMUX |= (1 << REFS0); // AVCC als Referenz nutzen ADMUX &= ~(1 << REFS1); 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 LCD_puts(itoa(result,dout_1,10)); //Ausgabe Display for (i=0;i<10;i++) _delay_ms(250); return result; } ______________________________________________________________________ Da ich ein 10 bit Wandler habe, ist normalerweise der Maximalwert 1023. Bei mir wird aber als Maximalwert 2557 ausgegeben, wenn ich 5V an ADC0 anlege. AVCC liegt auf 5V. AREF auf 0V. Hat jemand eine Idee? Was bedeutet das ADCW genau? ADCH + ADCL zusammen wahrscheinlich. An dem wirds aber nicht liegen. Vielen Dank im voraus!!! Stephan
Du machst in dem Code oben ein Dummy-Readout (unnötig!, die Messung solltest starten aber auslesen musst du nicht) und addierst die eigentliche messung da drauf:
1 | result = ADCW; |
2 | //...
|
3 | for(...){ |
4 | result += ADCW //!!!! |
setz entweder result vor der schleife auf 0, oder lass das dummy auslesen weg: einmal Messung starten, warten, bis fertig, "richtig" messe (ADCW wird einfach mit dem nächsten Messwert überschrieben) (die Funktion brauch auch nicht unbedingt einen uint16_t als Parameter, oder?) hth. Jörg
> AREF auf 0V.
Wie ist das zu verstehen?
Ich hoffe mal das soll heissen, dass du AREF mit
einem Kondensator nach Masse abgeblockt hat.
Ja stimmt, brauche nur ein uint8_t als parameter! AREF durch 100nF geblockt.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.