PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Celsius - Volt umrechnen mit Basom



JeyBee
24.11.2008, 18:21
Hallo Leute,

Ich hab ein Problem, zwar habe ich einen LM335 per Spannungsteiler (Festwiederstand ist 2.2kOhm) mit dem Portc.2 (ADC2) Pin eines Atmega48 verbunden. Später soll die Temperatur über ein bereits angeschlossenes LCD display in °C ausgegeben werden.

Jedoch habe ich keinen Plan, wie ich diese Volt Zahl in °C umrechnen kann. Das ganze kann von mir aus um bis zu 3-5°C ungenau sein. Ich habe gelesen, dass der LM335 bei 25°C 2.92Volt bringt und 10mV/K erhöht bzw. verringert. Diese Daten habe ich im Exel als Tabelle eingegeben und berchnen lassen.

Ich habe die SuFu benutzt und gegoogelt, da habe ich dutzende Beiträge gefunden, jedoch nichts das funktionierte.

Könnt ihr mir bitte helfen?


Mfg JeyBee

Dirk
24.11.2008, 18:40
@JeyBee:
Wenn du die einfachste Schaltung mit Serienwiderstand genommen hast (Datenblatt: Basic Temperature Sensor), dann brauchst du ja nur die Spannung (oder den Digitalwert deines ADC) bei einer bekannten Temperatur zu messen. Je Grad Celsius verändert sich die Spannung dann um 10 mV (0,01 V).
Das ist alles.
Bei einer Referenzspannung von 5 V hast du ca. 2 Digits deines ADCs pro Grad Celsius zur Verfügung.
Bei einer Referenzspannung von 2,5 V sind das schon 4 Digits, also eine theoretische Auflösung von 1/4 Grad.

Gruß Dirk

JeyBee
24.11.2008, 18:50
Hallo Drik,

Dich kenn ich doch ;)

Danke für deine schnelle Antwort. Aber kannst du mir bitte das mit den Digits etwas genauer erklären? Das verstehe ich leider noch nicht ganz.
Das mit den 0.01Volt pro °C habe ich bereits mittels Exel berechnet, ich habe die Tabelle als Anhang hinzugefügt.

Wie kann ich aber Bascom das beibringen? Ich kann ja (leider) nicht die Exel Tabelle ins Bascom kopieren. Kannst du mir dies bitte etwas erläutern?


Mfg JeyBee

Cairol
25.11.2008, 11:10
Naja, wenn du 5V Referenz hast und einen 10-Bit ADC macht das 5.0/1023 = 0,00489 Volt = ca. 5 mV pro ADC-Digit. (am besten vorher messen was dein Spannungsregler ausgibt. Das kann auch 100-200 mV über oder unter den 5V liegen. Dann natürlich mit dem echten Wert rechnen und nicht mit den 5.0 Volt)

D.h. dein ADC zeigt dir Temperaturänderungen von 0,5°C an.
Das ist genauer, als der LM335 selbst überhaupt messen kann, also mehr als ausreichend.

Beispiel: Wenn dein ADC bei 25°C eine Spannung
von 2,920 Volt misst, zeigt er dir bei 5.0V Referenz einen ADC-Wert von 597 an.
von 2,925 Volt misst, zeigt er dir bei 5.0V Referenz einen ADC-Wert von 598 an, was 25,5°C entspricht.

Du musst also nur als Referenzwert die "597" speichern, den aktuell gemessenen ADC-Wert von dieser Referenz abziehen (das Ergebnis ist dann die Differenz zu 25°C) und dann noch *0.5 rechnen (weil ja 1 ADC-Wert = 0,5°C entspricht). Jetzt hast du die Differenz in °C und addierst die noch zu den 25°C. Dann hast du deine Temperatur in °C.

Der ABSOLUT-Wert kann duch die ganzen Ungenauigkeiten (Vorwiderstand, Bauteiltoleranzen des LM335, ect. pp.) mehrere Grad daneben liegen, aber RELATIV misst der Sensor sehr genau.
Das wird dich aber sicher nicht stören, da du es eh nicht kontrollieren kannst - es sei denn du hast zu Hause ein richtiges Präzisions-Thermometer zum Abgleich.

JeyBee
25.11.2008, 12:00
Vielen, vielen dank, Cairol,

Das hat mir sehr weiter geholfen. Jeodoch kriege ich jetzt auf dem LCD einen Wert von 29.89 bzw. wenn ich noch +25(°C) rechne kriege ich 323.5 ausgegeben. Zwei Termometer zeigen allerdings eine termperatur von 22°C.
Wie kann ich diesen Fehler beheben? ich habe diese 597 verändert, jedoch half das nicht wirklich weiter.

P.S: das Multimeter zeigt 5.09Volt als Referenz Spannung an.

Neutro
25.11.2008, 12:16
wähle deinen Multiplikationsfaktor doh einfach so das 2°C angezeigt werden.
Wenn du 2°C Messwert hast und eine Anzeige zeigt ca 30 °C an musst du den Multiplikationsfaktor um 15 nach unten ändern.

JeyBee
25.11.2008, 12:21
Edit schon erstellt sry: ich meinte 22°C

Hier mal den Code: Bitte sagt mir was ich falsch mache, ich komme mir so blöd vor ](*,) Das Problem: Das Projekt ist für die Schule -> begrenzte Frist.


$regfile "m48def.dat"
$crystal = 8000000

Config Pinc.4 = Input
Portc.4 = 0

Config Portb = Output
Config Portd = Output
Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.5 , Db6 = Portb.7 , Db7 = Portb.6 , E = Portd.7 , Rs = Portb.0
Config Lcd = 16 * 2

Config Adc = Single , Prescaler = Auto
Config Portc.0 = Input
Const Ref = 5.09 / 1023


Dim W As Word
Dim Z1 As Single
Dim Z2 As Single
Dim Z3 As Single

Dim Temp As Single

Do
Portb.1 = 1

W = Getadc(2)

Z1 = 597 - W
Temp = Z1 * 0.5



Cls
Lcd Temp
Waitms 300

Loop

Neutro
25.11.2008, 12:38
Als estes kannst du den Wert Const Ref direkt eingeben also 0.004975. Das Spart Speicherkapazität.
Um den angezeigten Wert zu berichtigen änderst du die Zeile
Temp = Z1 * 0.5 in
Temp = Z1 * 0.367
dann sollte der angezeigte Wert mit dem Messwert übereinstimen.

JeyBee
25.11.2008, 12:43
Danke, du bist echt hilfreich. Jedoch hat mir das Sehr Wenig gehohlfen. Ich kriege nun den Wert -63.4xxx zurück.
Langsam fühle ich mich so richtig Miess. Stimmt die Hardware villeicht nicht?

Neutro
25.11.2008, 13:02
Schau dir mal diesen link an:
http://www.mikrocontroller.net/topic/88128
ich denke mal das dir das Weiterhelfen wird. Schreib dein Programm mal an den betreffenden Stellen so um wie es da gemacht wurde, dann muss das funktionieren. Ich selber arbeite auch immer nach diesem Schema und bei mir hat das immer hingehauen.
Hilfreich ist es auch sich den Messwert vom ADC port mal auf dem LCD anzeigen zu lassen und mit dem Multimeter den Angezeigten mit dem gemessenen Wert zu vergleichen. Wenn das übereinstimmt dann kannst du die Umrechnung einfügen und diese anzeigen lassen und dann den Multiplikationsfaktor entspechend anpassen bis der Messwert mit dem angezeigen übereinstimmt (Kalibrieren)

JeyBee
25.11.2008, 13:12
Leider hat mir das wenig weiter geholfen. Kann das Problem an der Hardware Liegen?

Eine andere Frage: Kann ich nicht einfach den Wert der von dem Sensor kommt als Spannung nehmen und damit irgend eine If -then tabelle etc. erstellen?

Beispiel: wenn volt = 3.5 then °C = 25

Neutro
25.11.2008, 13:25
Dim Adw As Word
Dim Wertampin As Single
Dim Umes As Single

Config Adc = Single , Prescaler = Auto , Reference = Internal
Start Adc

Do

Adw = Getadc(5)
Wertampin = Adw * 0.0025
Umes = Wertampin * 10

Cursor Off
Upperline
Lcd "Umes= " ; Fusing(umes , "##.##") ; "V"
'Print "Umes= " ; Fusing(umes , "##.##")
Lowerline
Lcd "Wertampin= " ; Fusing(wertampin , "#.##") ; "V"

If Wertampin >= 2.3 Then
Lowerline
Lcd "Ue zu hoch "
End If



Waitms 100

Loop
End

Versuche mal diesen Code,
aber denke daran das dieser mit der internen Referenz arbeitet und sich den Wert vom ADC 5 holt.
Mir ist auch aufgefallen das in deinem Code nicht die referenzspannungsquelle angegeben ist.

JeyBee
25.11.2008, 13:30
Das ist schön. Umess ist immer zwischen 4.55Volt und 4.8Volt

Wertampin ist zischen 0.45volt und 0.48 Volt.


Was kann ich jetzt daraus schliessen?



Ich danke dir von ganzem Herzen für deine Hilfe.

MeckPommER
25.11.2008, 13:37
Bascom mag es nicht so sehr, wenn du eine Berechnung zusammen mit einer typenkonvertierung in einer Zeile hast.

Bei "Z1 = 597 - W" hast du W als Word und Z1 as Single. Sowas gibt gelegentlich schöne Fehler in den Ergebnissen. Mache daraus mal zwei Schritte:
Z1 = W
Z1 = 597 - Z1

Ferner fehlt es deinem Programm noch an den Angaben für Stacksize, etc.

Eine endlose IF-THEN-Kette ist der Offenbarungseid eines Programmierers ;-) Mache die zur Veranschaulichung mal eine Grafik aus Messwert und Temperatur. Da es sich hierbei annähernd um eine Gerade handelt, sollte es nicht so schwer sein, eine passende Formel zu finden.

Aber immer Stück für Stück vorgehen ... zuerst den Messwert W auf das Display geben und in Relation zu den Angaben eines "echten" Thermometers setzen und schauen, ob die Resultate stimmig sind, was die Messwertänderung bei Temperaturänderungen angeht.

Gruß MeckPommER

P.S.: möglichst 2-3 Messungen machen bei einem möglichst großen Temperaturunterschied ... und dann deine Temperaturen und Messwerte posten ... wäre doch gelacht, wenn wir daraus keine Formel hinbekommen :)

pidi
25.11.2008, 13:43
Probier das mal:

$regfile "m48def.dat"
$crystal = 8000000

Config Pinc.4 = Input
Portc.4 = 0

Config Portb = Output
Config Portd = Output
Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.5 , Db6 = Portb.7 , Db7 = Portb.6 , E = Portd.7 , Rs = Portb.0
Config Lcd = 16 * 2

Config Adc = Single , Prescaler = Auto
Config Portc.0 = Input

Dim W As Word
Dim Z1 As Single

Dim Temp As Single

Do
Portb.1 = 1

W = Getadc(2)

Z1 = 597 - W
Temp = Z1 * 0.5
Temp = Temp + 25



Cls
Locate 1 . 1
Lcd Temp
Locate 2 . 1
Lcd W
Waitms 300

Loop



Verändern sich Deine Werte überhaupt mit der Temperatur?

mfg
Pidi

Neutro
25.11.2008, 13:47
Wie MeckPommER schon sagte musst du dir jetzt min und Max Werte holen.
Dann werden wir schon eine Formel finden.
Dabei kannst du deinen Sensor mal in eine Wasserdichte Tüte Packen und ins Eiswasser ( sollte ca0°C haben) reinhalten. Dabei darau achten das der Sensor direkt an der Tüte anliegt und keine Luft dazwischen ist. Messwert notieren. Dann das gleiche noch einmal bei ca 50°C warmen Wasser.
Schön das erstmal soweit hinhaut....

JeyBee
25.11.2008, 14:18
Vielen Dank, das ihr mir so gut Helft.

Ich habe jetzt gerade mal von 8°C bis 50°C ein paar Werte ausgelesen:

8.5°C = 710
23.3°C = 758
25°C = 786
29.1°C = 805
40°C = 885
50°C = 929

Hoffentlich können wir (Ihr) damit etwas anfangen. Mathe war leider noch nie mein Spezialgebiet...


P.S. Pidi, ja die Werte ändern sich. Aber dein Programm zeigt als Tep auch immer nur -38.5 bei 8°C

P.P.S. die gesammte Elektronik befindet sich in einem Acrylglas Gehäuse. Die Temperatur unteschiede sind so einfach zu machen. Ich habe sogar so weit aufgeheizt, bis mir der Kleber wieder geschmolzen ist....

Neutro
25.11.2008, 14:25
Sind das Widerstandswerte oder Spannungen in mV?
Mach noch mal bitte eine Skizze der Schaltung, dabei reicht mir die Beschaltung deines ADC Ports.

pidi
25.11.2008, 14:26
Hallo JeyBee,

na, da sind wir von falschen werten ausgegangen.

Versuch mal das hier:

$regfile "m48def.dat"
$crystal = 8000000

Config Pinc.4 = Input
Portc.4 = 0

Config Portb = Output
Config Portd = Output
Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.5 , Db6 = Portb.7 , Db7 = Portb.6 , E = Portd.7 , Rs = Portb.0
Config Lcd = 16 * 2

Config Adc = Single , Prescaler = Auto
Config Portc.0 = Input

Dim W As Word
Dim Z1 As Single

Dim Temp As Single

Do
Portb.1 = 1

W = Getadc(2)

Z1 = W
Z1 = 786 - Z1
Temp = Z1 * 0.189
Temp = Temp + 25



Cls
Locate 1 . 1
Lcd Temp
Locate 2 . 1
Lcd W
Waitms 300

Loop

JeyBee
25.11.2008, 14:29
Die Wete sind die Werte "W"

Grobe Skizze:

+5V
|
|
-
| |
| | 2.2K
| |
-
|
|
------------ zum ADC pin (Portc.2)
|
|
-
| |
| | Lm 335
| |
-
|
|
GND



Hilft dir das?

JeyBee
25.11.2008, 14:36
Pidi, das ist so ziemlihc das gleiche wie vorher, ausser das der obere Wert jetzt ca 36.33 anzeigt, bei 19°C.

pidi
25.11.2008, 14:39
Hallo JeyBee,

ich habe da noch einen kleinen Fehler in der Rechnung. Das sollte jetzt funktionieren.

$regfile "m48def.dat"
$crystal = 8000000

Config Pinc.4 = Input
Portc.4 = 0

Config Portb = Output
Config Portd = Output
Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.5 , Db6 = Portb.7 , Db7 = Portb.6 , E = Portd.7 , Rs = Portb.0
Config Lcd = 16 * 2

Config Adc = Single , Prescaler = Auto
Config Portc.0 = Input

Dim W As Word
Dim Z1 As Single

Dim Temp As Single

Do
Portb.1 = 1

W = Getadc(2)

Z1 = W
Z1 = Z1 - 786
Temp = Z1 * 0.189
Temp = Temp + 25



Cls
Locate 1 . 1
Lcd Temp
Locate 2 . 1
Lcd W
Waitms 300

Loop

JeyBee
25.11.2008, 14:42
Danke Pidi.

Aber es hat sich apsulut nichts geändert: Temp = 34.44, W=736 bei 20.5°C

Lustig ist auch, dass die werte bei jeder Aktualisierung sehr stark schwanken. Bei W kann das biss zu 10! sein.

pidi
25.11.2008, 14:49
Hallo JeyBee,

hast Du jetzt die Version mit folgender Rechenoperation verwendet?

Z1 = W
Z1 = Z1 - 786
Temp = Z1 * 0.189
Temp = Temp + 25

Oder hast Du noch die falsche drin?

mfg
Pidi

JeyBee
25.11.2008, 14:50
Nein, das ist genau die!

pidi
25.11.2008, 14:56
Hallo JeyBee,

der unterschied ist folgender:

alte Version: Z1 = 786 - Z1
neue Version Z1 = Z1 - 786

Da muß sich was ändern!

lg
Pidi

JeyBee
25.11.2008, 14:59
Wie gesagt, das habe ich dabei.

Temperatur = 23°C
Lcd wert1 = 19.14
lcd wert2 = ca. 756

Neutro
25.11.2008, 15:02
Hallo, wenn du mein Programm geladen hast dann solltest du bei 25°C einen wert am pin von 1.33V haben bei 25°C richtig. (wenn ich richtig gerechnet habe)
Diese 1,33V multiplizierst du mit 18,9 und schon hast du als Anzeige 25°C.
(also wert am pin *18,9)
Dann sollte das stimmen.

JeyBee
25.11.2008, 15:05
@Neutro: Das gibt dann abe rbei Umess = 9.12V und bei Wertampin = 0.48 (Wertampin stimmt ja)

Langsam mache ich mir ernsthafte Sorgen...

pidi
25.11.2008, 15:09
Hallo JeyBee,

na das sieht jetzt schon gar nicht mehr so schlecht aus.
Die Werte den mein Code ausgibt sind doch schon in der Nähe der echten Temperatur. Die Abweichung kommt wohl von der ungenauen Ermittlung der Werte die Du eben experimentell ermittelt hast. Du mußt den Temperaturfühlern mehr Zeit geben um die korrekten Werte anzuzeigen.

Um das Springen des Wertes W zu unterdrücken, versuche mal folgendes. Schalte einen Keramikkondensator (100nF) vom Analogeingang des AVR nach Masse. Du kannst auch mehrere Messungen vornehmen und einen Durchschnittswert bilden.

mfg
Pidi

JeyBee
25.11.2008, 15:12
Vielen Dank,

Ich werde den KerKo gleich Einlöten. Die Werte werde ich dann aber in dem Usgebauten Zustand ermitteln.

Ich werdet von mir höhren. Heute schon :D

Neutro
25.11.2008, 15:54
den richtigen Faktor berechnest du dann einfach folgendermaßen:
aktuelle Temperatur /wert am pin = Faktor
Also wenn du bei 25°einen Messwert von 0,48V hast = 52,08
Wenn dein Messwert springt musst du seltener messen d.H wait 1 oder größerer Wert. Vielleicht musst du auch deinen AV ref Eingang mit einen
100nF nach Gnd beschalten.

JeyBee
25.11.2008, 16:01
Ich habe den 100nF Kondensator bereits eingelötet. Das hilft enorm. Die Elektronik macht es sich gerade im Kühl/gefrierschrank gemütlich.

JeyBee
25.11.2008, 16:40
So Jungs, es bessert ich habe jetzt entdlich nur noch 1K fehlanzeige :D

Nachdem Neutron mir erklärt hat, wie ich den Faktor berechne, machte es "klick" :D Endlich weiss ich, wie sich die Formel zusammensetzt.

Ich habe nur noch eine Frage: Wie kann ich die Dezimalzahlen kürzen? Ist das nicht irgend wie so etwas?

Lcd Temp ; Fusing(temp , "##.##") ; "C"

Neutro
25.11.2008, 17:29
Für die richtige Anzeige der Temperatur schreibst du dann:
Lcd "Temp.= " ; Fusing(temp , "##.##") ; "C"
Dann kannst du noch mit dem LCD Designer das Grad Zeichen machen und vor dem "C" in der Anzeige einfügen.
Wie das geht kannst du in der Bascom Hilfe finden.

MfG

Neutro

JeyBee
25.11.2008, 18:37
Hallo Leute,

Ich danke euch allen noch einmal recht Herzlich für euere Hilfe.
Das ganze funktioniert nun erwartungsgemäs.


Mfg JeyBee

Neutro
25.11.2008, 19:05
Da es sich ja um ein Schulprojekt handelt wird doch das Roboternetz bestimmt wohlwollend erwähnt werden oder =D>

Schön das wir helfen konnten.

JeyBee
25.11.2008, 19:56
Oh fuck, faild

Bei 27.94°C gehts nicht mehr höher?!? Der W-Wert steigt aber.


Code:


$regfile "m48def.dat"
$crystal = 8000000

Config Pinc.4 = Input
Portc.4 = 0

Config Portb = Output
Config Portd = Output
Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.5 , Db6 = Portb.7 , Db7 = Portb.6 , E = Portd.7 , Rs = Portb.0
Config Lcd = 16 * 2

Config Adc = Single , Prescaler = Auto
Config Portc.0 = Input

Deflcdchar 6 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32 '°C

Dim W As Word
Dim Z1 As Single
Dim Temp As Single

T Alias Pinc.4
L Alias Portb.1

Cursor Off

Do
If T = 1 Then
L = 1
W = Getadc(2)

Z1 = W
Z1 = Z1 - 786
Temp = Z1 * 0.035
Temp = Temp + 25.7

Cls
Locate 1 , 1
Lcd "Temp: " ; Fusing(temp , "##.##") ; Chr(6) ; "C"
Locate 2 , 1
Lcd W
Waitms 1000

Else
Cls
L = 0
End If

Waitms 1
Loop

JeyBee
25.11.2008, 20:25
Ah, Problem Gelöst, Formel z1 = w-714.....

Neutro
25.11.2008, 20:29
Das problem ist das du die Variable Z1 zwei mal unterschiedliche Werte zuweist:
Z1 = W
Z1 = Z1 - 786
Temp = Z1 * 0.035
Temp = Temp + 25.7
wenn das klappen soll musst noch eine Variable Z2 als Single deklarieren,
und die Zeile so umschreiben:
Z2 = Z1-768
Temp = Z2*0,035
ich hoffe das das dann geht.

JeyBee
25.11.2008, 20:36
So, jetzt passts endgültig :D

Wie findet ihr so etwas immer nur raus?

Also, danke alle noch einmal.

Neutro
25.11.2008, 20:56
Keine Ahnung, mir war so danach... Eingebung...Visionen....

Jetzt mal im Ernst, wenn du dir das Programm mal anschaust siehst du
das du eine Variable in einer Zeile (Z1=Z1 -786) total verwirrst. Stell dir das mal mit Zahlen vor : 5=5-786
Da wirst du dich immer im Kreis drehen, ohne was vernünftiges zu erreichen.
Allerdings ist mir schleierhaft warum Bascom das beim Compilieren angemeckert hat, und wie das vorher funktioniert hat.
Aber Egal, was zählt ist das Ergebnis.

MfG

Neutro

MeckPommER
25.11.2008, 21:18
Was soll an so einer Programmzeile verwirrend sein?
Da steht eben nicht z.B. 5=5-786, sondern:
berechte Z1 minus 786 und speichere das Ergebnis in Z1.

Das ist ganz normaler Progammieralltag, wenn man z.B. eine Variable um 2 erhöhen will. Dann sieht das auch so aus:

X = X + 2

Es ist eben keine Gleichung, sondern eine Programmanweisung, den rechten Teil zu berechnen und das Ergebnis in die linke Variable zu schreiben.

Gruß MeckPommER

Neutro
26.11.2008, 09:46
Da magst du Recht haben, aber warum geht es dann wenn er für die Berechnung eine andere Variable verwendet?
Das ist mir dann leider nicht einleuchtend, ich war immer davon ausgegangen das man eine Variable nicht 2x in einer Zeile einsetzen kann, weil Bascom das nicht kann.
Für eine Erklärung und das dazugehörige dazulernen wäre ich dankbar.

MfG

Neutro

MeckPommER
26.11.2008, 10:10
Wenn du recht hättest, dürfte die Zeile

temp = temp + 25.7

eigentlich auch nicht funktionieren. Ich kann dir nicht sagen, warum es vorher nicht ging. Vielleicht Interpretierte Bascom die 786 als Integer und hat sich dann bei der Typenkonvertierung vertan, who knows ...

2x selbige Variable in einer Zeile ist kein Problem. Nur mehr als eine mathematische Funktion in einer Zeile geht nicht. Oft habe ich Fehler festgestellt, wenn Typenkonvertierung und eine mathematische Operation auseinandertreffen.

[Single] = [Word] * 4.2

sowas oder ähnliches führt manchmal zu den "lustigsten" Ergebnissen, wogegen

[Single] = [Word]
[Single] = [Single] * 4.2

dann wieder ganz brav und artig funktioniert.

Gruß MeckPommER

Neutro
26.11.2008, 11:08
Hast Recht, war mir gar nicht aufgefallen.

Manchmal sind die Wege von Bascom wohl unergründlich....
Auch wenn es jetzt OT geht:
Welche Variablen Typen (Byte, Integer, Single, usw)
lassen sich eigentlich miteinander verarbeiten bei Mathematischen
Berechnungen?

JeyBee
26.11.2008, 12:02
Ja da hat man doch wieder etwas gelernt \:D/


Ich störe nur ungern, aber ich habe ein Problem ](*,)

Irgend wie liegt die Temperatur immer zwischen 28.23°C und 29.04°C, egal, welche innentemperatur herscht. Es ändert sich zwar linear zur realen Temperatur, aber der Bereich stimmt nicht.

Es wurde noch eine Tasterfunktion hinzugefügt.

Hier noch einmal der Code:


$regfile "m48def.dat"
$crystal = 8000000

Config Pinc.4 = Input
Portc.4 = 0

Config Portb = Output
Config Portd = Output
Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.5 , Db6 = Portb.7 , Db7 = Portb.6 , E = Portd.7 , Rs = Portb.0
Config Lcd = 16 * 2

Config Adc = Single , Prescaler = Auto
Config Portc.0 = Input

Deflcdchar 6 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32 '°C

Dim W As Word
Dim Z1 As Single
Dim Z2 As Single
Dim Temp As Single

T Alias Pinc.4
L Alias Portb.1

Cursor Off

Do
If T = 1 Then
L = 1
W = Getadc(2)

Z1 = W
Z2 = Z1 - 714
Temp = Z2 * 0.035
Temp = Temp + 25.7

Cls
Locate 1 , 1
Lcd "Temp: " ; Fusing(temp , "##.##") ; Chr(6) ; "C"
Locate 2 , 1
Lcd ""
Waitms 1000

Else
Cls
L = 0
End If

Waitms 1
Loop

MeckPommER
26.11.2008, 12:15
Kein Wunder ... in deiner Liste von Seite 1 hattest du Messwerte gezeigt die (über den Daumen) pro Grad ca. 4-5 Einheiten auseinanderliegen.
Bei deiner jetzigen Formel müssen die Messwerte schon knapp 30 Einheiten auseinanderliegen, damit ein Grad Temperaturunterschied angezeigt wird.
Über den Daumen würde ich den Faktor von 0.035 in 0.222 ändern und das Ergebnis dann in der Zeile darunter auf die tatsächlichen Werte anpassen.

Da deine Messwerte aber nicht sehr linear aussehen, glaube ich, das du große Messfehler in deiner Liste hast. Teilweise hast du nämlich auch 7-8 Einheiten pro Grad.

Mal ganz allgemein: die Funktion aus Messwert und der demnach festgestellten Temperatur sollte bei deinem Tempsensor eine Gerade sein. Kannst dir das ja mal aufzeichnen, ist enorm hilfreich.
Diese Funktion mußt du in deiner Anpassung abbilden. Der Faktor ist die Steigung der Geraten und die Addition eines festen Wertes sorgt für die stimmige Höhe der Geraden.

Mit irgendwelchen Werten herumprobieren bringt zumeist nicht viel. Das A und O sind brauchbare Messwerte.

Gruß MeckPommER

JeyBee
26.11.2008, 12:17
Wie finde ich diesen "tatsächlichen Wert" heraus?

P.S. Sehr sehr sehr geiler Hexabot haste da. Das hast du wirklich toll gemacht !

MeckPommER
26.11.2008, 12:26
Siehe mein Edit ein Posting zuvor. Man könnte das Ganze auch theoretisch machen, da es aber immer Bauteiltolleranzen gibt, empfiehlt sich die Messmethode.

Thx, ich werde das Kompliment Marvin ausrichten ;-)

JeyBee
26.11.2008, 18:05
Frage: Kann ich nicht eine "Autokalibrierung" einbauen?
Also das der Faktor immer automatisch aus W gerechnet wird?
Oder sonst irgend wie?


Mfg JeyBee

MeckPommER
26.11.2008, 18:21
Das würde nur gehen, wenn der µC die richtige Temperatur kennt. Das ist aber nicht der Fall.

JeyBee
26.11.2008, 18:23
logisch......sry für die frage.

Bin gerade am temps testen....

JeyBee
26.11.2008, 21:07
OMFFGG

Ich brings einfach nicht. Bzw. Die Hardware. Wenn ich den Wert W ausgeben lasse, dann die Temp mittels _zwei_ Termometern messe, umrechne etc. funktioniert das am anfang ganz schön. Doch sobald ich heize bzw. kühle passirt nix gross. wenn ich z.B. von 26°C auf 35°C erwärme, zeigt das LCD maximal 29°C.

Ich habe mehrere Formeln (faktoren) errechnet. Jedoch immer das selbe Ergenis: Die Aktuelle Temperatur +- 5°C.

Ja, ich habe von 3°C bis 40°C verschiedene Proben genommen, Exel angewendet etc.

Hier noch einmal die Formel:


Z1 = W
Z2 = Z1 - 823
Temp = Z2 * 0.0131
Temp = Temp + 26.13

MeckPommER
26.11.2008, 21:24
Immer locker bleiben ... erste Bastler-Regel :-)

Poste einfach mal deine Messwerte mit den gemessenen (realen) Temperaturen, dann sehen wir weiter.

Pidi2001
27.11.2008, 14:07
Hallo JeeBee,

der Grund dafür ist ganz einfach.
Der Wert 0,0131 ist viel zu klein. Wie kommst Du eigentlich darauf?
Dieser Wert muß die Temperaturänderung je Digit des ADC sein. Das berechnet man wie folgt.


Wir wissen der Temperatursensor ändert die Ausgangsspannung um 0,01 V/K
Wir wissen Referenzspannung = 5V und ADC Auflösung = 1024Digit

Daraus ergibt sich folgende Formel: Wert = 0,01V/K / (5V / 1024 Digit) = 0,488281 K/Digit
Dieser Wert bleibt konstant und sollte nicht verändert werden.


Nun mußt Du nur noch bei einer bekannten Temperatur (gemessen mit einem anderen Thermometer) den Wert W im Display ablesen. Hierzu eignet sich die Raumtemperatur sehr gut. Lass dabei dem Temperaturfühler viel Zeit sich der Raumtemperatur anzupassen (z.B. 2-3 Stunden). Die bekannte Temperatur und den dabei angezeigten Wert W einfach als Konstanten in die Formel einfließen lassen.


Hier habe ich mal ein Beispiel für Dich wie das ganze dann aussieht.
Bekannte Temperatur: 22,5 C°
Angezeigter Wert W: 781

Z1 = W
Z2 = Z1 - 781
Temp = Z2 * 0,488281
Temp = Temp + 22,5


LG
Pidi

MeckPommER
27.11.2008, 14:29
Hey JeyBee,

nicht böse sein, aber wenn du frei von Wissen einfach nur im endlosen Meer der Möglichkeiten umherstocherst, wird das nie was.
Deswegen schrieb ich ja, das du deine Messwerte posten sollst, damit man dir zeigen kann, wie man so eine Sache richtig löst. Gerade das methodische Vorgehen ist ja der Clou beim Basteln.

Der Weg von Pidi2001 ist die rechnerische Variante, die nur eine Messung erfordert, da sich der Faktor rechnerisch aus dem Datenblatt und deiner Beschaltung ergibt. Sofern du 5V Referenzspannung beim ADC benutzt, müßte das prima funktionieren.

Ich würde dir empfehlen, beide Varianten auszuprobieren und zu begreifen versuchen, da pures Nachmachen kein Weg zum Verständnis ist.

Gruß MeckPommER

P.S. wofür du Excel einsetzt, ist mir nach wie vor absolut unklar :-)

JeyBee
27.11.2008, 16:12
Hey MeckPommER,

Ich habe NIE! irgend welche Werte ausprobiert. Diese stammen immer von realsen messungen.

@pidi2001: Ok, werde es nochmal versuchen. Jedoch ändern sich die Werte nach jedem Refresh des LCD's sind einfach Wert schwankungen. Aber ich werde einfach einmal den Mittelwert aus 20 Werten nehmen und fertig.

Ihr werdet von mir höhren...

MeckPommER
27.11.2008, 17:25
Dein Faktor von 0.0131 kann auf keiner richtigen Messung beruhen, denke ich mir mal einfach ;-)
Ich drücke dir die Daumen, das deine folgenden Versuche klappen. Wenn nicht, dann musst du nochmal einen genauen PLan deiner Schaltung hier einstellen und das komplette Listing.

Wir bekommen das hin und ich bin begeistert von deiner Hartnäckigkeit - die ist nämlich auch erforderlich für erfolgreiches Basteln :-)

Gruß und *daumendrück* MeckPommER

JeyBee
27.11.2008, 20:28
Wir bekommen das hin und ich bin begeistert von deiner Hartnäckigkeit - die ist nämlich auch erforderlich für erfolgreiches Basteln :-)

Gruß und *daumendrück* MeckPommER


Danke "Mut gebekommen"



Nach den Zahlreichen Messungen habe ich diese Exel Tabbele im Anhang erstellt. Jeweils die Durchschnitte gerechnet etc.

Jedoch musste ich vesttstellen, das das genze viel zu ungenau ist (Ja, steht im Datenblatt) habe ich diese Schaltung mit dem 10kOhm Poti aufgebaut. Jetzt sind die Werte Stabiel und ändern sich wirklich nur noch bei Temperatur Unterschieden.

kann ich jetzt mit der Gleichen Formel vorgehen? Also das heisst, nochmal messen? Aber eigentlich sind die Werte ja jetzt Stabil. Ich habe jetzt bei 25°C W=594 und das ist IMMER so, wenn 25°C herschen.

Naja, ich bin froh, das die Werte nicht mehr so schwanken, wird jetzt bestimmt einfacher.


P.S. diese 0.488, ist das eine Konstante? Ich bin auf die 0.031 immer gekommen, indem ich Temp/W gemacht habe.

MeckPommER
27.11.2008, 21:13
Du kannst Temp/W nur dann rechnen, wenn bei 0 Grad auch W 0 ist. Was du rechnen musst, ist die Temperaturdifferenz zur Wertedifferenz. Dieser Faktor sollte konstant sein. Wie ich in deiner Tabelle sehe, ist das aber nicht so, deshalb muss irgendwo, vielleicht in deiner Schaltung, der Wurm sein.

Zur Erklärung:
Von 24 bis 27 Grad steigt dein Wert um 60 Einheiten, also 20 Einheiten pro Grad.
Von 27 bis 37 Grad steigt dein Wert um 44 Einheiten, also nur 4.4 Einheiten pro Grad.

Und da liegt der Hase im Pfeffer. Damit die Sache funktioniert (und der Sensor sollte so funktionieren) müßte sich dein Wert immer um den selben Betrag pro Grad ändern.

Also liegt der Fehler nicht in der Programmierung der Umrechnung von Wert in Grad, sondern in der Erfassung des Messwertes. Entweder ist in der Schaltung etwas falsch, oder der AD-Wandler ist falsch beschaltet oder konfiguriert.

Kannst du die Schaltung und dein ganzes Listing mal posten?

Gruß MeckPommER

P.S.: ein Poti? *kopfkratz* ist in der Grundbeschaltung ein Poti vorgesehen? Ich könnte mir gut vorstellen, das dies für die Nichtlinearität deiner Messwerte verantwortlich ist. Eine Kalibrierung brauchst du doch eigentlich nicht in Hardware, da du diese per Software machen kannst. Na gut, ich glaube, wir kommen so langsam dem Fehler auf die Schliche :-)

pidi
27.11.2008, 21:59
Hallo MeckPommER

Das Poti was er meint ist das Kalibrierpoti für den LM335 (Datenblatt)

Hallo JeeBee,

Löte das Ding mal raus, genau das könnte das Problem sein. 10K im Verhältnis zu 2.2K sind nicht gut. Das Poti wird eigentlich garnicht benötigt, da Du den Wert in der Software sowieso eingibst.

mfg
Pidi

Vitis
28.11.2008, 11:00
es sind auch wertepaare doppelt
31 818
31 801

32 820
32 832

sehr wahrscheinlich ist das Poti parallel für die Nichtlinearität
verantwortlich, raus damit, Korrekturen machste später
in Deiner Software.
Dann nochmal Messwerte aufnehmen und posten

JeyBee
28.11.2008, 11:23
Seit dem das Poti (Trimmer) drinn ist, ist alles viel stabieler. Wenn ich vor dem Umbau bei 25°C z.B. 400 hatte, hatte ich nach 10min. bei genau glecihen 25°C 550.

Ich werde mich sonst mal mit Target etc. ein Schema zeichnen, wenn folgendes nicht reichen sollte, was im Anhang ist.

Der Festwiederstand (R1) ist 2.5kOhm (4x 10kOhm parallel) und das Poti hat 10k

MeckPommER
28.11.2008, 11:48
Wie hast du denn Kalibriert?

Auf 2.982V zu kalibrieren bei 25 Grad bedeutet bei dir, genau bei 25 Grad einen Messwert von 610 einzustellen (1023/5*2.982). Vorausgesetzt das du deinen ADC mit einer Referenzspannung von 5V betreibst und dies auch in deiner Software so konfiguriert ist.
Sowohl in der Beschaltung deines µC als auch in der Konfiguration könnte nämlich noch ein Fehler verborgen sein.

Gruß MeckPommER

magic33
28.11.2008, 15:36
also ich komme ohne die kalibrierung aus und auch ohne single variaablen damit konnte ich den code von 26% aud 17% drücken


$regfile = "m8def.dat"
$crystal = 8000000
'$baud = 19200 ' baud rate
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40
'dont touch eeprom data by restart
$eepleave
'config
Config Lcd = 16 * 4 'LCD Display
Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.1 , Db6 = Portd.0 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.4

Config Adc = Single , Prescaler = Auto , Reference = Avcc

'cuonstanten
Const Tnull = 559 'nei 25°
Const Traum = 609 ' bei 0°
Const Faktor = 5 'erechnet aus 5V/1024=0,048
'dim
Dim Zahl As Word
Dim Wert As Word
Dim Temperatur As Word
Dim Text As String * 1

Deflcdchar 1 , 8 , 20 , 8 , 32 , 32 , 32 , 32 , 32 ' replace ? with number (0-7)
Initlcd
Cursor Off
Start Adc


Anfang:
Cls

Zahl = Getadc(3)
Wert = Zahl

Lcd "adc " ; Zahl
Text = "+"
If Wert > Traum Then
Zahl = Wert - Traum
Zahl = Zahl * Faktor
Temperatur = 250 + Zahl
End If
If Wert = Traum Then Temperatur = 250
If Wert < Traum And Wert > Tnull Then
Zahl = Traum - Wert
Zahl = Zahl * Faktor
Temperatur = 250 - Zahl
End If
If Wert = Tnull Then
Text = " "
Temperatur = 0
End If
If Wert < Tnull Then
Text = "-"
Zahl = Tnull - wert
Temperatur = Zahl * Faktor
End If
Zahl = Temperatur / 10
Wert = Temperatur Mod 10
Locate 3 , 1 : Lcd "Temp " ; Zahl ; "." ; Wert ; Chr(1) ; "C"

Wait 1
Goto Anfang

5V stabil
|
4,7K
|
V+ --> ADC ref AVCC mit 10µH und 100nF extern
LM335
V-
|
GND

JeyBee
28.11.2008, 16:15
Soll das heissen, das ich das Poti gar nicht brauche?
Achja, ich habe es auf 2.90 Volt gestellt, mehr lag nicht mehr drinn.

Ich habe nur noch bis Sonntag Abend 20:00 Uhr Zeit :'(

MeckPommER
28.11.2008, 16:40
Och, das bekommen wir bis Sonntag hin, hast hier ja viele fleissige Helfer :-)

Beim Kalibrieren mit deinem 10k Poti warst du bestimmt schon am Anschlag um die 2.9V zu erreichen, aber es zieht dir ja nunmal den Ausgang nach Masse ... ohne kann es nur besser werden.

Also Poti raus und ... wie sieht eigentlich deine Beschaltung des VREF-Pins aus? Und wie hast du in der Software deinen ADC konfiguriert?

JeyBee
28.11.2008, 16:49
Vreff? Was? Ich habe nur Aref an 5V gelegt.

Poti kommt gleich raus. soll ich einen 2.5KOhm oder 4.7KOhm wiederstand nehmen?

Software siehe vordere Seite(n)



Mfg JeyBee

MeckPommER
28.11.2008, 17:26
Ups, ich meinte auch AREF ^^

Halte dich spasseshalber mal an die Beschaltung von magic33 mit 4,7k, das scheint ja zu funktionieren.
AREF an 5V ist falsch. Zumindest AREF per 100nF an Masse ist besser. Und in deine Listing habe ich auch keine Angabe beim Config ADC zur Referenzspannung gefunden. Auch diesbezüglich mal aufs Listing von magic33 schauen.

Vitis
28.11.2008, 17:52
die Drift des Wertes kann mit Eigenerwärmung des
Sensors zusammen hängen. Abhilfe würde dann ein
zyklisches Einschalten vor bzw. Ausschalten nach der
Messung bringen.

magic33
29.11.2008, 09:09
Beschaltung des ADC

AGND = GND intern im ATMEGA 8
|
100nF
|
Aref
|
100nF
|
AVCC
|
10 µH
|
5V

ich hab den Sensor nun schon seit Tagen am ADCn und der Driftet nicht.

mal noch einen tipp der Sensor LM335 ist bei 1mA kalibriert intern!
also mal den stromverbrauch messen und mit dem wiederstand einstellen.
U=R*I mit U=Konstant(5Vstabil) und I soll1mA ergibt 5KOhm je genauer
die 1mA fliesen um so genauer die Messung siehe Datenblatt
das Datenblatt gibt aber auch fertigungsschwankungen von 2.92-3.04V
bei 25° kalibrierung zu.
das sind 120 Ohm breite .

mir reichen 0.5grad welches sich im 500 ohm bereich liegt und somit komm ich mit 4,7k klar
meine messwertliste generiert


ADC = 540 temp= - 10 . 0 °C
ADC = 541 temp= - 9 . 5 °C
ADC = 542 temp= - 9 . 0 °C
ADC = 543 temp= - 8 . 5 °C
ADC = 544 temp= - 8 . 0 °C
ADC = 545 temp= - 7 . 5 °C
ADC = 546 temp= - 7 . 0 °C
ADC = 547 temp= - 6 . 5 °C
ADC = 548 temp= - 6 . 0 °C
ADC = 549 temp= - 5 . 5 °C
ADC = 550 temp= - 5 . 0 °C
ADC = 551 temp= - 4 . 5 °C
ADC = 552 temp= - 4 . 0 °C
ADC = 553 temp= - 3 . 5 °C
ADC = 554 temp= - 3 . 0 °C
ADC = 555 temp= - 2 . 5 °C
ADC = 556 temp= - 2 . 0 °C
ADC = 557 temp= - 1 . 5 °C
ADC = 558 temp= - 1 . 0 °C
ADC = 559 temp= - 0 . 5 °C
ADC = 560 temp= 0 . 0 °C
ADC = 561 temp= + 0 . 5 °C
ADC = 562 temp= + 1 . 0 °C
ADC = 563 temp= + 1 . 5 °C
ADC = 564 temp= + 2 . 0 °C
ADC = 565 temp= + 2 . 5 °C
ADC = 566 temp= + 3 . 0 °C
ADC = 567 temp= + 3 . 5 °C
ADC = 568 temp= + 4 . 0 °C
ADC = 569 temp= + 4 . 5 °C
ADC = 570 temp= + 5 . 0 °C
ADC = 571 temp= + 5 . 5 °C
ADC = 572 temp= + 6 . 0 °C
ADC = 573 temp= + 6 . 5 °C
ADC = 574 temp= + 7 . 0 °C
ADC = 575 temp= + 7 . 5 °C
ADC = 576 temp= + 8 . 0 °C
ADC = 577 temp= + 8 . 5 °C
ADC = 578 temp= + 9 . 0 °C
ADC = 579 temp= + 9 . 5 °C
ADC = 580 temp= + 10 . 0 °C
ADC = 581 temp= + 10 . 5 °C
ADC = 582 temp= + 11 . 0 °C
ADC = 583 temp= + 11 . 5 °C
ADC = 584 temp= + 12 . 0 °C
ADC = 585 temp= + 12 . 5 °C
ADC = 586 temp= + 13 . 0 °C
ADC = 587 temp= + 13 . 5 °C
ADC = 588 temp= + 14 . 0 °C
ADC = 589 temp= + 14 . 5 °C
ADC = 590 temp= + 15 . 0 °C
ADC = 591 temp= + 15 . 5 °C
ADC = 592 temp= + 16 . 0 °C
ADC = 593 temp= + 16 . 5 °C
ADC = 594 temp= + 17 . 0 °C
ADC = 595 temp= + 17 . 5 °C
ADC = 596 temp= + 18 . 0 °C
ADC = 597 temp= + 18 . 5 °C
ADC = 598 temp= + 19 . 0 °C
ADC = 599 temp= + 19 . 5 °C
ADC = 600 temp= + 20 . 0 °C
ADC = 601 temp= + 20 . 5 °C
ADC = 602 temp= + 21 . 0 °C
ADC = 603 temp= + 21 . 5 °C
ADC = 604 temp= + 22 . 0 °C
ADC = 605 temp= + 22 . 5 °C
ADC = 606 temp= + 23 . 0 °C
ADC = 607 temp= + 23 . 5 °C
ADC = 608 temp= + 24 . 0 °C
ADC = 609 temp= + 24 . 5 °C
ADC = 610 temp= + 25 . 0 °C
ADC = 611 temp= + 25 . 5 °C
ADC = 612 temp= + 26 . 0 °C
ADC = 613 temp= + 26 . 5 °C
ADC = 614 temp= + 27 . 0 °C
ADC = 615 temp= + 27 . 5 °C
ADC = 616 temp= + 28 . 0 °C
ADC = 617 temp= + 28 . 5 °C
ADC = 618 temp= + 29 . 0 °C
ADC = 619 temp= + 29 . 5 °C
ADC = 620 temp= + 30 . 0 °C
ADC = 621 temp= + 30 . 5 °C
ADC = 622 temp= + 31 . 0 °C
ADC = 623 temp= + 31 . 5 °C
ADC = 624 temp= + 32 . 0 °C
ADC = 625 temp= + 32 . 5 °C
ADC = 626 temp= + 33 . 0 °C
ADC = 627 temp= + 33 . 5 °C
ADC = 628 temp= + 34 . 0 °C
ADC = 629 temp= + 34 . 5 °C
ADC = 630 temp= + 35 . 0 °C
ADC = 631 temp= + 35 . 5 °C
ADC = 632 temp= + 36 . 0 °C
ADC = 633 temp= + 36 . 5 °C
ADC = 634 temp= + 37 . 0 °C
ADC = 635 temp= + 37 . 5 °C
ADC = 636 temp= + 38 . 0 °C
ADC = 637 temp= + 38 . 5 °C
ADC = 638 temp= + 39 . 0 °C
ADC = 639 temp= + 39 . 5 °C

Python programm


traum = 610
tnull = 560
for w in xrange(540,640):
te = "+"
if w == traum:
temp = 250
if w > traum :
zahl = w - traum
zahl = zahl * 5
temp = 250 + zahl
if (w < traum) and (w > tnull):
zahl = traum - w
zahl = zahl * 5
temp = 250 - zahl
if w == tnull:
te = " "
temp= 0
if w < tnull:
te ="-"
zahl = tnull - w
temp = zahl *5
zahl = temp / 10
temp = temp % 10
print "ADC =", w ," temp=",te,zahl,".",temp,"°C"
[/list]

JeyBee
29.11.2008, 10:43
diese 10uH Spule habe ich leider keine, geht das auch ohne? Mir reichen ohne hin 2-3°C genauigkeit. Und wie kann ich den AGND genau beschalten? dem komme ich noch nicht genau nach.


Mfg JeyBee

JeyBee
29.11.2008, 14:20
Ich habe jetzt die Schaltung von magic33 nachgebaut (bis auf die 10uH Spule). Die Werte sind wirklich so stabil wie noch nie.

Wie muss ich jetzt das Programm umschreiben? Den letzten Code von magic33, kann ich den einfach nehmen?

JeyBee
30.11.2008, 12:03
Bitte, jetzt nicht so kurz vor dem ZIEL aufgeben.

MeckPommER
30.11.2008, 12:14
Na, was hindert dich daran, nochmal genaue Messungen durchzuführen und die Ergebnisse zu posten. Oder du kannst die Temperaturumrechnungen probieren, die schon zahlreich gepostet wurden.

*daumendrück* MeckPommER