Forum: Mikrocontroller und Digitale Elektronik ADC-Wandler-Konfiguration+Auslesen


von Andreas (Gast)


Lesenswert?

Hallo
ich möchte über eine interruptgesteuerte Werteeinlesung machen. Er soll 
sozusagen, ein Signal abtasten und mir alle Werte in eine Variable 
speichern. Das Einlesen macht er schon, aber irgendwie bekomm ich da 
einen falschen Wert. Vielleicht weiß jemand, was ich da falsch 
eingestellt habe. Schick mal den nötigen Teil des Quelltextes:

  //Initialisierung des Analog Digitalwandler
  ADMUX = 1<<REFS0 | 1<<MUX2 | 1<<MUX0;
  ADCSRA= 1<<ADEN | 1<<ADATE | 1<<ADIE;
  DIDR0|= 1<<ADC5D;
  ADCSRA |= 1<<ADSC;

ISR(ADC_vect)
{

   messsig=(ADCL) +(8<<ADCH);      //Messwerte werden in Register 
geschrieben
   messsigmV=messsig*5000/1027;       //Umwandeln der Messwerte in mV
   messsigmV=messsigmV-1367;       //Offset wird abgezogen
}

Irgendwo muss da jetzt ein kleiner Fehler sein. Aber ich find den gerade 
nicht. Hat jemand eine Idee, wäre super nett :)

P.S. Das ist ein ATMEGA328

von André W. (sefiroth)


Lesenswert?

Andreas schrieb:
>    messsig=(ADCL) +(8<<ADCH);      //Messwerte werden in Register

Du schiebst die 8 um ADCH-Schritte nach links :-)

--> (ADCH * 0x100) ist besser

von spess53 (Gast)


Lesenswert?

Hi

> messsig=(ADCL) +(8<<ADCH);

-> messsig=(ADCL) +(ADCH<<8);

MfG Spess

von André W. (sefiroth)


Lesenswert?

spess53 schrieb:
> Hi
>
>> messsig=(ADCL) +(8<<ADCH);
>
> -> messsig=(ADCL) +(ADCH<<8);
>
> MfG Spess

Hmm, erfolgt ein automatischer Typcast auf 16-Bit, wenn das 8-Bit 
Register ADCH nach links geschoben wird?

von spess53 (Gast)


Lesenswert?

Hi

>Hmm, erfolgt ein automatischer Typcast auf 16-Bit, wenn das 8-Bit
>Register ADCH nach links geschoben wird?

Weiss ich nicht. Benutze kein C.

MfG Spess

von André W. (sefiroth)


Lesenswert?

Hehe ^_^

@Andreas: Wenn Du AVR-GCC benutzt, kannst Du stattdessen auch ADCW 
benutzen. Das gibt Dir den 10 Bit Wert schon richtig zusammengebaut 
zurück. Ist eigentlich ein Funktionsmakro in der Bibliothek was ADCL und 
ADCH richtig zusammensetzt.

->> messsig = ADCW;

/edit: Welcher Variablentyp ist eigentlich Deine messigmV-Variable? 
Double oder 32-Bit Integer?

von Bernd N (Gast)


Lesenswert?

Oder gleich ADC.

von Andreas (Gast)


Lesenswert?

Also zu Zeit hab ich das Ding als float, bin mir aber nicht sicher, ob 
das so gut ist :P . Über dieses ADCW liest er schon was ein. Aber die 
Werte passen kein Stück zu meinem eingelesenen Signal. Mein Signal liegt 
zwischen 1120mV und 1330mV und momentan bekomm ich da Werte zwischen 
300mv und 8000mV. Das macht irgednwie keinen Sinn.

von Karl H. (kbuchegg)


Lesenswert?

Andreas schrieb:

> zwischen 1120mV und 1330mV und momentan bekomm ich da Werte zwischen
> 300mv und 8000mV. Das macht irgednwie keinen Sinn.


Dann lass dir erst mal die ADC Werte als Rohwerte anzeigen.

Welchen Datentyp hat messig?


> Also zu Zeit hab ich das Ding als float, bin mir aber nicht sicher,
> ob das so gut ist :P

Macht wahrscheinlich wenig Sinn

http://www.mikrocontroller.net/articles/FAQ#Datentypen_in_Operationen

von Andreas (Gast)


Lesenswert?

Also meiner Meinung nach müssten die digitalen Werte des ADC hinkommen. 
Hab jetzt einfach mal so aus Spass gesagt, er soll das jetzt mal mit 4 
multiplizieren. Der offizielle Umrechnungsfaktor von Digitalwerten auf 
mV liegt ja irgendwie bei 4,87 (5000/1027) oder so. Und da gibt er mir 
schon völligen Mist aus. Seiner Meinung nach ist 4*100(digital)= 1680 
oder so in der Art, also völliger Mist. Anscheinend muss der Fehler bei 
der Umrechung von Digitalwerten auf mV passieren. Liegt das vll am 
Variablentyp ?

von Karl H. (kbuchegg)


Lesenswert?

Andreas schrieb:
> Also meiner Meinung nach müssten die digitalen Werte des ADC hinkommen.

Kommen sie oder kommen sie nicht?
Im Vertrauen: Nichts gegen deine Meinung aber hier sind Fakten gefragt.

Wenn ich für jeden Fall, bei dem sich hinterher rausgestellt hat, dass 
schon die Eingangswerte nicht stimmen einen Euro bekommen hätte, wäre 
ich heute ein reicher Mann.

Da ich aber zu dämlich war, dafür jedesmal einen Euro zu verlangen, bin 
ich dazu übergegangen in einer Berechnung erst mal die Eingangswerte zu 
überprüfen. Das bringt mir zwar auch keinen Reichtum, spart aber Zeit, 
wenn wieder mal so ein Fall vorliegt.

In der Kette

   Eingabe - Berechnung - Ausgabe

ist nun mal 'Eingabe' der erste Schritt, bei dem schon Unsinn passieren 
kann. Und wie sagt schon der Volksmund so schön:
  garbage in - garbage out

von Karl H. (kbuchegg)


Lesenswert?

PS:

Dass 1023 * 5000 den Rechenbereich von int verlässt, stört dich 
irgendwie nicht besonders? (1023 ist der größte überhaupt mögliche Wert 
vom ADC)

von Andreas (Gast)


Lesenswert?

Also ich habe jetzt messsig und messsigmV erstmal double gesetzt und 
dann kann er schon mal auf jeden Fall mit 4 multiplizieren. Das klappt 
schon mal.
So mein Signal liegt also zwischen 1230 und 1460 mV. Meine digitalen 
Werte liegen jetzt zwischen 290 und 512, ab und zu kommt da mal sowas 
zwischen wie 1038 oder so. Wenn ich das jetzt mal so umrechne mit dem 
Faktor 5000/1027 passen die nicht dazu. Nur woran kann das liegen ?

von Andreas (Gast)


Lesenswert?

Naja messsig und messsigmV sind ja jetzt double. Und das 5000/1027 ist 
ja nur für die Umrechnung da und hat letztendlich doch nichts mehr mit 
dem Einlesen vom ADC zu tun oder seh ich das falsch.

von Karl H. (kbuchegg)


Lesenswert?

Nochmal bitte den aktuellen Code.
Aber diesmal mit den tatsächlichen Datentypen

Dazu die Analyse, was bei einem Messwert von 290 eigentlich rauskommen 
müsst und was tatsächlich rauskommt.

von Andreas (Gast)


Lesenswert?

Hat sich alles geklärt. Danke für die Hilfe ;)

von tox (Gast)


Lesenswert?

ja was war?

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.