mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega16 ADC result = 2557?


Autor: Stephan S. (tantal)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Stephan S. (tantal)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok ich habs selber herausbekommen. Der ADC Kanal ist im A....!

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
result = ADCW;
//...
for(...){
    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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> AREF auf 0V.

Wie ist das zu verstehen?
Ich hoffe mal das soll heissen, dass du AREF mit
einem Kondensator nach Masse abgeblockt hat.

Autor: Stephan S. (tantal)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja stimmt, brauche nur ein uint8_t als parameter!

AREF durch 100nF geblockt.

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.