www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik [ATMega32] ADC Überlauf?


Autor: Uwe H. (mistert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum,

ich hab hier ein kleines Problem. Ich will mit dem ADC einen Poti 
auswählen. Momentan hab ich ein 50:50 Spannungsteiler mit 5V 
angeschlossen. Ich lese also max 5V aus, so dass ich die interne 
Referenzspannung verwenden kann.

Den gelesenen Wert lasse ich mir per utoa auf dem LCD anzeigen. Nur 
Leider geht der Wert bis 16368 und erzeugt damit insgesamt 3 mal einen 
Überlauf. Nur wieso? Bei einem 10Bit ADC müsste der maximalwert doch 
1023 sein?!

Hier mein Code:
ADC
uint16_t readADC(uint8_t channel){

  uint8_t i;
  uint16_t result;

  ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); //ADC aktiviert, prescaler 128
  ADMUX = channel; //Kanal auswählen
  ADMUX |= (1<<REFS1)|(1<<REFS0)|(1<<ADLAR); //interne Referenzspannung 2,65V


  ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
  while ( !(ADCSRA & (1<<ADIF)) ); //warte auf Konvertierung
  result = ADC;  // ADCW muss gelesen werden
 
  result = 0; 
  for( i=0; i<4; i++ )
  {
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
    while ( !(ADCSRA & (1<<ADIF)) ); //warte auf Konvertierung
    result += ADC;        // Wandlungsergebnisse aufaddieren
  }
  ADCSRA &= ~(1<<ADEN);             // ADC deaktivieren
 
  result /= 4;                     // Summe durch vier teilen = arithm. Mittelwert

  return result;
}

und die routine zum lesen und ausgeben auf dem LCD:
    while(1){  
    lcd_clrscr(); //display löschen
    uint16_t adcvalue = readADC(7);
    char adcstring[6];
    lcd_puts(utoa(adcvalue, adcstring, 10));
    _delay_ms(400);
    }
jemand ne Idee? Ist bestimmt nur ein doofer Fehler den ich vor lauter 
Bäumen nicht sehe...

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

ADMUX=  ... (1<<ADLAR) ... bewirkt, daß das Ergenis linksbündig
ausgegeben werden. Dadurch kann das natürlch größer als 1023 werden.
Wenn du den o.g. Therm weglässt liegt dein Wert im Bereich
0..1023.

MfG Spess

Autor: Uwe H. (mistert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super dankeschön! Das wars! Ich wusste doch es war nur eine Kleinigkeit 
:)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.