Forum: Mikrocontroller und Digitale Elektronik Was mache ich falsch ?


von P.K. (Gast)


Lesenswert?

Hallo alle !

Ich versuche gerade mit meinem LM335 Temperaturen zu messen, aber zeigt 
mein DVM mir zu viel V an.

Ich habe mir dieses hier durchgelesen:
Beitrag "LM335 an Mega8"


Und habe die Schaltung so aufgebaut:

  5V
  |
  |
  |
  |
  2.2k
  |
  |            >Es müssen ja c.a. 3-5 k Ohm sein, da habe ich zwei 2.2
  |              genommen... müsste doch gehen...
  2.2k
  |
  |----------------- + an DVM
  |
  |
 LM335
  |
  |
  |
  |
  GND und GND vom DVM

Ich bekomme bei 25.8C eine Spannung von 4.79V... das müssten etwas mit 
2.9xx sein. Was ist da los ?

Mein Netzteil hat 5V (DVM misst aber 5.12).



von P.K. (Gast)


Lesenswert?

LOL

Ich habe GND und ADJ vertauscht... jetzt zeigt er bei 26.2 C 2.99V an.

Das stimmt mit der Gleichung:

T(X) = 0.010V * X + 2.7315

wobei: X = Grad ist.
       X => 0

Wie kann ich das jetzt am ADC auswerten ? Ich weiß wie ich die Daten 
annehmen kann und so nur mir fehlt die Rechnung..

von Msp 4. (msp430_crew)


Lesenswert?

Wo liegt jetzt das Problem?
T(X) ist deine Spannung die du mit deinem A/D-Wandler misst und jetzt 
brauchst du nur die Gleichung umstellen!

von P.K. (Gast)


Lesenswert?

Nene der ist net gehimmelt.

Genug Strom bekommt er.

Ich habe folgendes getestet:

Ich habe mir meinen Wecker genonnem, der auch einen Temperatursensor 
besitzt.
Dann habe ich meine LM335 Schaltung neben den Wecker gestellt.

Jetzt habe ich meine Tischlampe genommen (Keine HAlogen) sondern diese 
alten Birnen die sehr sehr viel Hitze ausstoßen (Tut mir leid für diese 
CO2 Emission... ;) ).

Die Spannung stieg von 2.98 auf 3.01.

Hab dann mal so getestet:

T(X) = 0.010V * Grad vom Wekcer + 2.7315. Raus kam: 3.01 3.02... also 
kann man doch davon ausgehen das der Sensor noch lebt. Beim abschaltet 
der Lampe wurde die Spannung 3.00 und dann 2.99... Normal.. es kühlt ja 
ab.

Mein Problem liegt, wie ich das jetzt durch das Ergebnis vom AD Wandler 
in Celsius umwandeln kann. Bräuchte da eine Gleichung mit der ich das 
umwandeln kann.
Habe da aber keine Idee. Hab sogar im Deutsch Unterricht (Film: Kabale 
und Liebe aneguckt... x( )  aus langeweilige etwas rum probiert 
(Rechnerisch), aber ohne Erfolg kam auf keine Formel.

von -bjoern- (Gast)


Lesenswert?

wenn ich es noch richtig weiß hat der lm335 ja eine spannung von 2,7315 
V bei 0°C also ist die spannung die rauskommt der wert der temperatur in 
kelvin... von kelvin nach °C umrechnen ist ja nicht so schwer ;-)

und die spannung mit dem ADC zu ermitteln auch nicht
je nach dem ob du 8 oder 10bit verwendest kannst du ja mittels der 
referenz spannung und dem maximalen adc wert die schrittweite ausrechnen 
z.B. 5V referenzspannung bei 8 bit sind 5/255 ungefähr 0,02V pro schritt 
bei 10Bit dann halt 5/1023 ungefär 0,005V pro schritt...

also ist die Formel (5/1023*ADC)-273,15

von Msp 4. (msp430_crew)


Lesenswert?

Siehe oben! Hab meine Antwort geändert!

von -bjoern- (Gast)


Lesenswert?

Ok da ist natürlich nen kleiner fehler in der formel ;-)
müsste dann heißen (500/1023*ADC)-273,15

von -bjoern- (Gast)


Lesenswert?

ok zu spät gesehen sorry ;-)

von P.K. (Gast)


Lesenswert?

Juchu !

Ich weiß nicht woran das Problem lag.. ich kam einfach nicht drauf. Mein 
Problem ist, das ich bei einfachen Aufgaben (Gleichungen) immer mehr 
Probleme habe als bei schweren Aufgaben... K.a. woran das liegt, 
vielleicht denk ich immer nur so komplex obwohl es einfach ist...

Vielen dank !

von P.K. (Gast)


Lesenswert?

Eine Frage:

Wie lang darf der Kabel vom Sensor bis zur Platine sein ? Gibt es da ein 
Verlust wenn der Kabel zu lang ist =?

von P.K. (Gast)


Lesenswert?

Hallo !

Habe jetzt das Programm geschrieben:
 $regfile = "m8def.dat"
 $crystal = 8000000


 '// LCD Display einstellungen
 Config Lcd = 16 * 1a
 Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , 
Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
 Config Lcdbus = 4
 Cls
 Locate 1 , 1
 '\\

 Dim Ad As Word
 Dim Temp As Long
 Config Adc = Single , Prescaler = Auto , Reference = Avcc


Start Adc

Do

 Cls
  Ad = Getadc(0)


  Temp = 500 / 1023
  Temp = Temp * Ad
  Temp = Temp - 273.15


  Locate 1 , 1
  Lcd "Temp:" ; Temp

  Wait 1

 Loop

Er zeigt bei mir nur -27 Grad an g... so kalt ist es aber nicht ^^...

Ich sehe da keinen Fehler.... ihr ?

von Roland P. (pram)


Lesenswert?

Ich weiß jetzt nicht ob deine Formel stimmt, aber ich weiß was definitiv 
nicht stimmt:

Dim Temp As Long
...
Temp = 500 / 1023

Das ergibt nämlich 0kommanix. Du musst die Formel so umstellen dass du 
die Division (wenn du eine brauchst) erst ganz zum Schluss ausführst.

Gruß
Roland

von P.K. (Gast)


Lesenswert?

Also ich habe mein Source so  gelassen:

Habe nur Dim Temp As Single gemacht und jetzt zeigt der mir 22 Grad 
an... wenn ich den Sensor anfasse... 24 Grad...

Aber die Temperatur stimmt nicht ganz.

Meine beiden Wecker zeigen 25.9 an... dann musst der Sensor auch 25 oder 
26 anzeigen.. eine kleine Abweichung gibt es immer... aber von 25 bzw. 
26 auf 22..... Woran kann das liegen ? Muss ich den AD Wandler noch in 
10Bit Modus einstellen odr macht er das von allein ?

Wie soll ich den diese Formel bitte umstellen... Dann würde doch ein 
falsches Eregbnis herauskommen.

von Roland P. (pram)


Lesenswert?

Der Tempsensor hat eine Empfindlichkeit von 0.010V/K


0 = 0 V = 0K (Kelvin)
1024 = 5V = 500K

Somit folgt:

Temp = AD-Wert/1024 * 500K

Da du vermutlich gern noch ne Komma-Stelle hättest, und nicht mit 
Fließkomma-Arithmetik den Controller zustopfen willst, würd ich mit 
1/10K rechnen. Dann ergibt sich:

Temp10 = AD-Wert*5000 / 1024

Temp10 = Temp10 - 2731 (auf 1/10 Grad umrechnen)

Vorkomma = Temp10 / 10;
Nachkomma = Temp10 % 10;

Wie man in Basic den AD Wandler initialisiert weiß ich nicht. Uund ob 
der da 8 oder 10 Bit macht leider auch nicht

von Roland P. (pram)


Lesenswert?

Übrigens
Anstatt den 5000 (für 5 V) würd ich eher 2560 einsetzen und auf die 
interne Referenzspannung (falls der Controller sowas hat) zurück 
greifen.
Da ja wie du schon bemerkt hast, deine 5V nicht sooo stabil sind.

Gruß
Roland

von P.K. (Gast)


Lesenswert?

Hallo Roland !

Danke für deine Erklärung. Ich habe die interne Referenz eingestellt.
Durch: Reference = Avcc. Damit nimmt er die Referenz von VCC des AD 
Wandlers.

von P.K. (Gast)


Lesenswert?

Also irgendwie bin ich net in der Lage deine Rechnungen in BASCOM zu 
übersetzen....

Ich habe mal den AD Eingang gecheckt bei mir kommt 604 raus... das 
umgerechnet in V also:

5/1024 * 604 = 2.94921V.  Sind 21 Grad.

Probe = 0.010 * 21 + 2.7315 = 2.9415.

Aber beide Wecker zeigen: 26.1 Grad an.... Was ist bloß los ?

von P.K. (Gast)


Lesenswert?

Ich habe mal die Versorgungsspannung beim laufenden Betrieb der Platine 
gemessen:

Diese schwankt "nur" zwischen 5.08 und 5.09.

Jetzt habe ich folgendes getestet:

5.09/1024 * 604 = 2.9964V

Probe:

0.010 * 26 + 2.7315 = 2.9915 V   Also 26 Grad. Stimmt mit den Weckern 
ein.

So gut und schön... was mache ich jetzt  :(.  Zur Info: Ich benutze den 
Atmega8.

Da ich mich für die interne Referenzspannung entschieden habe, habe ich 
AREF mit 100nF mit Masse verbunden und mit Bascom: Reference = Avcc 
gemacht. Ist das nicht die interne Referenz ? Soweit ich weiß schon.

von P.K. (Gast)


Lesenswert?

Wenn ich mich auf die obere Formel beziehe:

(500/1023*ADC)-273,15

Ist 500 iine Referenzspannung von 5V. Wenn mein Netzteil aber zwischen 
5.08 oder 5.09 schwankt könnte ich doch 508 oder 509 benutzen oder nicht 
?

Ich habe das Probiert, jetzt ist das Ergebnis: 26.7 Grad.

Wecker: 26.6.

Ist das zufall ? Oder nur eine gute Problemlösung von mir ? :).

von Roland P. (pram)


Lesenswert?

Avcc ist die Spannung die am Avcc Pin anliegt, also 5.? Volt.


Schau dir mal das Datenblatt an.
http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf
Seite 197. Da siehst du wie der DAC intern aufgebaut ist und wie das mit 
Aref funktioniert und dass da eine 2,56V Referenz eingebaut ist

Probier mal folgendes um diese zu aktivieren
Reference = Ainternal (oder so, kann kein bascom)

Du hast wahrscheinlich dann noch ein Problem, das nennt sich Rauschen, 
d.h. deine untersten Bits "wackeln" hin und her.

hierzu kann man die Werte mitteln, dazu macht man einfach mehrere (z.B. 
4) Messungen hintereinander:


Adc = 0;
for i = 1 to 4
  Adc = Adc + GetADC(0)
next

d.h. dein Temp hat jetzt eine "Auflösung" von 12 Bit (0..4096)

Um die Temperatur jetzt auszurechnen müsstest du erst mal auf Spannung 
umrechnen:
Vref = 2.56
U = (Adc / 4096) * Vref;

Kelvin = U / 0.010V/K

=> Kelvin = Adc / 4096 * Vref / 0.01 =
            Adc / 4096 * 2.56 * 100  =
            (Adc * 256) / 4096.
=> Grad = Kelvin - 273;

Da ich aber an deiner Stelle auf Fließkommaarithmetik verzicheten würde,
und einfach immer mit Zehntelgrad rechnen würde und dies nur bei der 
Anzeige entsprechend umrechnen würde ( 214 entspricht dann 21.4 
Grad)ergibt sich folgende Formel:

ZehntelKelvin =  (Adc * 2560) / 4096.
ZehntelGrad =  ZehntelKelvin - 2731

GradVorkomma = ZehntelGrad / 10
GradNachkomma = ZehntelGrad % 10


Hoffe das hast jetzt verstanden, wie das mit Einsetzen und umstellen 
funktioniert. Die Division sollte man halt erst nach allen 
Multiplikationen ausführen, weil es sonst zu großen numerischen Fehlern 
kommt .

Gruß
Roland




von -bjoern- (Gast)


Lesenswert?

Ich will jetzt nichts falsches behaupten aber wenn er 2,56V als 
Referenzspannung nimmt kann er doch nur noch bis zu einer bestimmten 
Temperatur messen oder? Er misst ja bei 26°C schon ca. 3V...

von Roland P. (pram)


Lesenswert?

Hi Bjoern, ja hast natürlich recht

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.