ADC-Wandler-Konfiguration+Auslesen

Gast #1983442
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
#1983471
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?
Gast #1983552
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.
#1983556
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
Gast #1983569
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 ?
#1983577
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
Gast #1983603
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 ?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren