ADC-Kanäle an Atmega168 auswerten

Gast #1391648
Hallo,

ich habe ein Programm, in dem ich eine Spannung am AD-Wandeler des 
Atmega168 messen möchte. Bis jetzt funktioniert das Programm auch sehr 
gut. Ich möchte aber einen anderen Pin nutzen, um die Messung 
durchzuführen, dabei gibs aber Probleme. Momentan nutze ich ADC0 (PC0), 
würde aber gerne an ADC6 oder 7 messen. Das Programm funktioniert nur an 
ADC0, an keinem anderen ADC-Pin.
Initialisierung:

//externe Vref nutzen
  ADMUX  =  0;  //kann eigentlich entfallen, da Initial 0x00
                            //externe Vref -> REFS1=0, REFS0=0

//A/D-Wandler: Enable,  Vorteiler auf 128
  ADCSRA  |=  ( (1<<ADEN)  |  (1<<ADPS2)  |
                          (1<<ADPS1)  |  (1<<ADPS0) );

//Dummy-Wandlung
  ADCSRA    |=  (1<<ADSC);
  while (ADCSRA & (1<<ADSC) );
  adc_val_1  =  ADC;

Unterprogramm aus Tutorial:

//Wert von A/D-Wandler lesen
//AD-Pin wird übergeben, AD-Wert zurück
uint16_t ReadADCChannel(uint8_t channel){
  uint16_t result;

//Kanal wählen
  ADMUX  =  channel;

//Messung
  ADCSRA  |=  (1<<ADSC);
  while (ADCSRA & (1<<ADSC) );

  result  =  ADC;

  return result;
}

Aufruf im Hauptprogramm:

adc_val_1  =  ReadADCChannel(0);

Der Aufruf mit 0 funktioniert, schließe ich meine Messleitung an einen 
anderen Pin an und lasse an diesem messen, funktioniert mein Programm 
nicht. Kann mir jemand helfen?
Gruß Paul
Gast
Ich will halt auf einen bestimmte Spannungsschwelle reagieren. Ich messe 
an einen bestimmten Zeitpunkt die Spannung und wenn sie unter einem 
bestimmten Wert liegt, reagiere ich darauf.
gast schrieb:
> DAS MUSS VOR DER DUMMY WANDLUNG STEHEN.
>
> //Kanal wählen
>   ADMUX  =  channel;

Das stimmt nicht. Die Dummy-Wandlung taucht im Datenblatt lediglich in 
Zusammenhang mit der Referenzquelle auf. Den Kanal kann man eigentlich 
problemlos ändern, ohne eine Dummy-Wandlung vorzunehmen.

@paul
Ist der entsprechende Port denn richtig konfiguriert (also als Eingang 
ohne Pull-up)?
Gast
Ja PortC ist als Eingang konfiguriert. Mit der Messung an PC0/ADC0 
funktionierts auch, aber an allen anderen Pins nicht (ADC6 und 7 sind 
nicht am PortC).
@ Richard W: Mir ist grade aufgefallen, dass ich den Dummy-Read-Out 
immer nur für ADC0 mache. Bist du sicher, dass es egal ist an welchem 
Pin der Dummy-Read-Out gemacht wird?
Schau mal ins Datenblatt. Der Dummy-Readout ist nur dafür da, 
fehlerhafte Messungen zu verhindern, wenn die Referenzquelle geändert 
wurde und die Spannung sich noch nicht stabilisiert hat. Ansonsten fällt 
mir so nichts weiteres ein...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.