mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit ADC des ATmega644


Autor: Hans H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag zusammen,

ich hab ein Problem mit dem ADC des ATmega644:

Ich möchte analoge Werte von 0V bis Vcc einlesen und auf ein LCD (0 bis 
255) ausgeben. Wenn ich nun die Spannung langsam erhöhe sind immer Werte 
von 0 bis 25 zu lesen. Und dies zyklisch bis Vcc erreicht ist. Die 
Rechnerei zum Visualisieren ist Fehlerfrei. Ich komm aber nicht drauf, 
was da sein könnte. Evtl. Bits verschoben, Register nicht richtig 
gesetzt o. ä.

HILFE!!

Folgendermaßen ist der ADC initialisiert:

uint16_t ReadChannel(void)
{
    uint8_t i;

  ADCSRA |= (1<<ADEN) | (1<<ADPS2) | (1<<ADPS0);
    ADMUX |= (1<<REFS0) | (1<<ADLAR);

    //nachfolgend wird eine Wandlung durchgeführt. Dies wird
         empfohlen, um den Wandler "warmlaufen" zu lassen
  ADCSRA |= (1<<ADSC);                      // eine ADC-Wandlung
    while ( ADCSRA & (1<<ADSC) )
    {
       ;                         // auf Abschluss der Konvertierung 
warten
    }
    result = ADCH;                  // ADCW muss einmal gelesen werden,
                                    // sonst wird Ergebnis der nächsten 
Wandlung
                                    // nicht übernommen.




    // Eigentliche Messung - Mittelwert aus 10 aufeinanderfolgenden 
Wandlungen
    result = 0;
    for( i=0; i<10; i++ )
    {
      ADCSRA |= (1<<ADSC);                  // eine Wandlung "single 
conversion"
      while ( ADCSRA & (1<<ADSC) )
    {
          ;                     // auf Abschluss der Konvertierung 
warten
      }
      result += ADCH;                  // Wandlungsergebnisse 
aufaddieren
    }
    ADCSRA &= ~(1<<ADEN);                     // ADC deaktivieren

    result /= 10;
                             // Summe durch zehn teilen = arithm. 
Mittelwert

    return result;
}




Danke im Voraus.

Gruß

Autor: Raimund Rabe (corvuscorax)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch wenn ich jetzt nicht 'die' Ahnung von C habe, so würde ich mal 
nachschauen, was in "result" steht bevor es durch 10 geteilt wird.
Ich vermute "result" ist nur 8 Bit (oder eben 1 Byte) lang und nicht, 
wie benötigt, mindestens 12 Bit (oder eben 2 Byte). Da 255*10=2550 ist, 
und dieser Wert nun beim besten willen nicht in einem einzigen Byte 
unterzubringen ist, wird das Ergebnis logischerweise fehlerhaft sein.
Vermutlich steht z.B. nach 10*255 der Wert "F6" hexadezimal in "result", 
was 246 dezimal entsprechen würde. Nu weiß ich net wie in C die Division 
gemacht ist, aber entweder es kommt dann nach der Division durch 10 eine 
24 oder (wie in Deinem Fall) eine 25 bei raus. Damit wäre das Phänomen 
erklärt.

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.