Forum: Mikrocontroller und Digitale Elektronik ADC-Kanäle an Atmega168 auswerten


von paul (Gast)


Lesenswert?

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

von Richard U. (ronw)


Lesenswert?

Was funktioniert denn an dem Programm nicht, wenn es mit einem anderen 
Kanal als 0 aufgerufen wird?

von gast (Gast)


Lesenswert?

DAS MUSS VOR DER DUMMY WANDLUNG STEHEN.

//Kanal wählen
  ADMUX  =  channel;

von paul (Gast)


Lesenswert?

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.

von Richard U. (ronw)


Lesenswert?

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)?

von paul (Gast)


Lesenswert?

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?

von Richard U. (ronw)


Lesenswert?

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...

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
Noch kein Account? Hier anmelden.