PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Temperatur berechnen



Murus
15.02.2006, 12:42
Hallo zusammen,

ich befasse mich gerade mit einem NTC.
Hab eine Messreihe erstellt, um den B-Wert rauszukriegen. Er liegt bei mir bei 3048.984.

Jetzt möchte ich mit dem AVR die Temperatur aus dem Widerstand des NTC berechnen.
Nur:
Hier ist mal die Formel für die Temperatur aus dem Widerstand. Sie ist korrekt für meinen NTC.

T=(3048.98367)/(ln(R)+3.31859)

Dabei ist T die Temperatur und R der Widerstand des NTC.
Wie kann ich das jetzt in Bascom zusammendengeln?
Dass ich es zerfleddern muss ist klar, aber als was muss ich die Variablen definieren, damit er auch mit Kommastellen rechnen kann und diese auch direkt am LCD anzeigen kann?
Bascom kann den Ln ausrechnen, das ist net das Problem. Ich muss nur wissen, wie ich die Variablen definieren soll, dass er mir mit den Kommastellen rechnet..
Wie würde das dann beim LCD aussehen? Wenn ich dann z.B. schreibe
LCD=X, und X hat Nachkommastellen? Würde er das grad direkt automatisch aufs LCD bügeln?

Herzlichen Gruss
Mario

oe9vfj
15.02.2006, 14:06
Datentyp mit Nachkommastellen ist SINGLE

Nachfolgend ein Berechnungsbeispiel:



Dim wR as Word
Dim sngT as Single , sngR as Single

wR = 10000 ' Widerstand

sngR = wR ' Typkonvertierung von Word nach Single

'T=(3048.98367)/(ln(R)+3.31859)

sngR = log(sngR)
sngR = sngR + 3.31859

sngT = 3048.98367 / sngR

lcd fusing(sngT , "###.#")

Murus
15.02.2006, 14:35
Läk, das Beispiel wär doch net nötig gewesen!
Hab vielen Dank!

Herzlichen Gruss
Mario

TobiasBlome
18.11.2006, 10:58
Hallo,
was ist denn der Wert B und rechne ich den aus?
Und was ist denn der andere Wert?

Tobias

Marco78
18.11.2006, 14:03
das Beispiel wär doch net nötig gewesen!
Da hast du recht. Es steht ja auch alles in der Hilfe!
Und wenn dir das da nicht aussagekräftig genug ist oder dein Englisch dafür nicht reicht um alles zu verstehen probier es doch auch mal hier: https://www.roboternetz.de/phpBB2/search.php

TobiasBlome
18.11.2006, 14:12
Naja, also die Hilfe habe ich natürlich schon probiert aber ich konnte nichts über den Wert B finden - auch nicht in der Hilfe von Bascom!

Marco78
18.11.2006, 16:05
Sorry, ich meinte ja nicht dich damit! Ich meinte Murus. Ihn habe ich ja zitiert.

magnetix48
18.11.2006, 16:09
@Tobias: Der B-Wert steht im Datenblatt vom NTC

Gruß
Detlef

TobiasBlome
18.11.2006, 18:11
Danke!

So, nun hab´ich den zweiten Wert ausgerechnet. Aber wie bekomme ich nun den gemessenen Wert in Ohm umgerechnet?

Also "Getadc(1)" gibt mir "504" raus, gemessen habe ich 1020 Ohm. Ist der Zusammenhang zwischen den 504 und 1020 linear?

Tobias

Marco78
18.11.2006, 19:06
Wenn du es für deine Schaltungsverhältnisse genau haben willst, kannst du ja eine Messreihe aufstellen und den Faktor per Dreisatz ermitteln.
Dazu solltest du aber den Widerstand nicht jedesmal direkt messen, sondern über Strom und Spannung ermitteln. In der Zeit wo du den LDR ausgebaut hast, kann sich der Widerstand durch andere Lichtverhältnisse geändert haben.

Ob der Widerstandsverlauf liniar ist, steht im Datenblatt.

Bedenke aber, das das empfinden der Helligkeit des Auges nicht liniar ist!!!

TobiasBlome
18.11.2006, 19:33
hmm, nein ;-)

es geht um einen NTC und der ist natürlich nicht linear.

Die Frage ist ob, wenn sich der Widerstand ändert - ob sich dann auch genau so der Wert aus dem A/D Wandler ändert - meiner Meinung nach JA. Aber ich kann ja auch einen Denkfehler machen.
Hab´die 504/1020=2,0238 gerechnet -> also den Wert aus dem AD Wandler *2,0238 = Ohm vom Widerstand?

Tobias

TobiasBlome
18.11.2006, 19:41
Hallo,
ich habe noch ein Problem mit dem rechnen im µC:

Error256:Single expected - was ist denn das und warum?!


$regfile = "m8def.dat" 'AT-Mega8
$crystal = 1000000 'Quarz: 1 MHz
$baud = 2400 'Baudrate der UART: 2400 Baud

'================================================= ==============================
' Variablen
'================================================= ==============================
Dim Result As Word
Dim Ohm As Word
Dim Temp As Integer 'wegen den negativen Zahlen!!!




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




Start Adc

'-------------------------------------------------------------------------------
'Programm:
'-------------------------------------------------------------------------------

Do
Result = Getadc(1)

Ohm = 2.0238 * Result
Temp = 3730 / Log(ohm) + 5.59017600439636 'WO IST DENN HIER DER FEHLER





Print "Result: " ; Result
Print "ohm: " ; Ohm
Print "Temp: " ; Temp

Loop

End

magnetix48
18.11.2006, 19:48
Hallo Tobias,

Bascom mag nur eine Berechnung pro Befehl. Du musst die Berechnung in mehrere Befehle aufteilen.

Zu deiner NTC-Messung:
wie sieht deine Widerstandsmessschaltung aus?

Gruß
Detlef

TobiasBlome
18.11.2006, 19:55
Werd ich gleich mal versuchen ;-)

Also ich habe: Plus 5V an NTC(1k bei25°C) - µC - Widerstand 1k - MASSE

Tobias

TobiasBlome
18.11.2006, 19:59
Fast - die Zeile mit Temp1 = Log(ohm) gefällt ihm nicht: gleiche Fehlermeldung...



$regfile = "m8def.dat" 'AT-Mega8
$crystal = 1000000 'Quarz: 1 MHz
$baud = 2400 'Baudrate der UART: 2400 Baud

'================================================= ==============================
' Variablen
'================================================= ==============================
Dim Result As Word
Dim Ohm As Word
Dim Temp1 As Integer 'wegen den negativen Zahlen!!!
Dim Temp2 As Integer
Dim Temp As Integer



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




Start Adc

'-------------------------------------------------------------------------------
'Programm:
'-------------------------------------------------------------------------------

Do

Result = Getadc(1)
Ohm = 2.0238 * Result

'Temp = 3730 / Log(ohm) + 5.59017600439636
Temp1 = Log(ohm) 'WO IST DENN HIER DER FEHLER
Temp2 = 3730 / Temp1
Temp = Temp2 + 5.59017600439636

Print "Result: " ; Result
Print "ohm: " ; Ohm
Print "Temp: " ; Temp

Waitms 500

Loop

End

Marco78
18.11.2006, 20:03
Ist der Zusammenhang zwischen den 504 und 1020 linear?
Wenn man nur diese beiden Werte hat, kann man die Frage mit Ja und Nein beantworten, ohne etwas falsches zu sagen.

Der Zusammenhang des Messwertes und der gemessenen Spannung ist aber liniar (zumindest soweit annährend wie der ADC es zulässt.)

Der ADC gibt dir den digitalen Wert einer analogen Spannung aus. Der Endwert des digitalen Wertes wird durch die Auflösung des ADC festgelegt. 256 bei 8Bit und 1024 bei 10-Bit. Bzw. 0-255 und 0-1023.
Die Referenzspannung bestimmt, bei welcher analogen Spannung der digitale Endwert erreicht wird. Um genau zu sein, Vref - 1 LSB ist der digitale Endwert. Und der Verlauf ist sinnvollerweise liniar.

magnetix48
18.11.2006, 20:05
Hallo Tobias,

deklariere Ohm als Single

Gruß
Detlef

TobiasBlome
18.11.2006, 20:08
Vielen Dank, dann habe ich es ja richtig gemacht!

Nun muss ich nur noch wissen, was der Fehler in der Zeile: " Temp1 = Log(ohm) " ist.

Tobias

magnetix48
18.11.2006, 20:12
Du musst statt Dim Ohm as Word schreiben Dim Ohm as Single
dann sollte der Fehler nicht mehr auftreten.

Gruß
Detlef

TobiasBlome
18.11.2006, 20:12
da warst du schneller als ich ;-)

Der Fehler ist weg - aber da ist noch ein rechenfehler?
mal nachrechnen...

magnetix48
18.11.2006, 20:16
Was du da rausbekommst ist die Teilspannung eines Widerstandsteilers. Du solltest dir mal die Mühe machen. die Teilspannung für einzelne Stützpunkte auszurechnen, dann siehst du den Zusammenhang zwischen Teilspannung und Temperatur.

Gruß
Detlef

TobiasBlome
18.11.2006, 20:49
werde ich mal ausrechnen - suche aber erst noch den Rechenfehler. In Excel hat das so schön funktioniert...

TobiasBlome
18.11.2006, 21:05
Fehler gefunden!

Hatte eine Klammer in der Rechnung nicht beachtet ](*,)
Wie kann ich die Zahl auf eine Kommastelle begrenzen?
Temp: 24.83618164°C

Also dass funktioniert nicht: Print "Temp: " ; Temp , "###.#" ; "°C"




$regfile = "m8def.dat" 'AT-Mega8
$crystal = 1000000 'Quarz: 1 MHz
$baud = 2400 'Baudrate der UART: 2400 Baud

'================================================= ==============================
' Variablen
'================================================= ==============================
Dim Result As Word
Dim Ohm As Single
Dim Temp1 As Single 'wegen den negativen Zahlen!!!
Dim Temp2 As Single
Dim Temp3 As Single
Dim Temp As Single



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




Start Adc

'-------------------------------------------------------------------------------
'Programm:
'-------------------------------------------------------------------------------

Do

Result = Getadc(1)
Ohm = 2.0238 * Result

'Temp = 3730 / (Log(ohm) + 5.59017600439636)
Temp1 = Log(ohm)
Temp2 = Temp1 + 5.59017600439636
Temp3 = 3730 / Temp2
Temp = Temp3 - 273

Print "Result: " ; Result
Print "ohm: " ; Ohm

Print "Temp1: " ; Temp1
Print "Temp2: " ; Temp2
Print "Temp3: " ; Temp3
Print "Temp: " ; Temp , "###.#" ; "°C"

Wait 1

Loop

End

magnetix48
18.11.2006, 21:10
Das Formatieren macht man in Bascom mit Fusing:

Fusing(Temp, "###.#")

Gruß
Detlef

TobiasBlome
18.11.2006, 21:23
Aber wie bekomme ich dann noch den text davor und dahinter?
Print "Temp: " ; Temp ; "°C"

Es hagelt Fehlermeldungen.
Print Fusing "Temp: " ;(temp , "#.&" ) ; "°C"

magnetix48
18.11.2006, 21:25
Print "Temp: " ; Fusing(temp , "###.#" ) ; "°C"

Gruß
Detlef

TobiasBlome
18.11.2006, 21:33
Vielen Dank für die schnellen und guten Antworten!

Die Temperaturmessung ist nun fertig!!!

Danke, Tobias

magnetix48
18.11.2006, 21:37
Kontrolliere mal den Fehler der Temperaturmessung indem du in 5 °C Schritten aus dem Datenblatt die Widerstandswerte einsetzt und dann die Teilspannung am ADC berechnest. Ich bin ziemlich sicher, dass du da mit einem großen Fehler rechnen musst, es sei denn, du beschränkst dich auf normale Raumtemperaturen.

Gruß
Detlef

magnetix48
19.11.2006, 10:35
Hallo,

mich hatte interessiert, auf welche Genauigkeit man mit einem so nichtlinearen Element wie einem NTC kommen kann.

Als Beispiel habe ich die Schaltung von TobiasBlome genommen:
Ein NTC von +5 V an den ADC-Eingang des AVR und von dort ein Widerstand von 1 kOhm nach Masse.

Die Berechnung erfolgte in Excel:
1. Spalte: Die Isttemperatur in °C
2. Spalte: Der Faktor Widerstand NTC bei Temperatur zu Widerstand bei 25 °C
3. Spalte: Berechneter NTC-Widerstand in Ohm
4. Spalte: Der Teilungsfaktor des Widerstandsteilers am ADC-Eingang
5. Spalte: Teilungsfaktor * Maximalwert des ADC (1023) = Ergebnis des ADC
6. Spalte: Ergebnis aus ADC - Offset
7. Spalte: Ergebnis 7. Spalte * Faktor in °C
8. Spalte: 7. Spalte - 1. Spalte = Linearitätsfehler in °C

Offset und Faktor habe ich für den Bereich 0 °C bis 35 °C optimiert, für andere Bereiche müssen die Werte angepasst werden.
Aus der Tabelle und dem Diagramm ist zu sehen, dass der Linearitätsfehler im Bereich 0 bis 35 °C bei max. +/-0,4 °C liegt.

Bei 0 °C bis 50 °C würde der Fehler einer optimierten Korrektur schon bei +/-1 °C liegen.

Ergebnis:
Für die Berechnung der Temperatur ist kein Logarithmus erforderlich. Die Anpassung erfolgt durch einfache Addition und Multiplikation.

Gruß
Detlef

Edit:
Was ich bei der Berechnung nicht berücksichtigt habe, ist die Eigenerwärmung des NTC. Sie beträgt bei der verwendeten Schaltung bei 25 °C schon fast 1 °C!
Mögliche Abhilfe:
Verwendung eines hochohmigeren NTSs, der aufgrund des niedrigeren Stromes auch eine geringere Verlustleistung und damit Erwärmung hat.

TobiasBlome
19.11.2006, 19:59
Hallo,
da hast du vollkommen recht: Es wäre sinnvoller gewesen einen 10k NTC zu benutzen(den NTC hab ich so ohne nachzudenken gekauft-zum testen). Ich möchte meinen PC-Gehäuselüfter damit regeln - also 20-50?!°C. Deswegen muss er nicht sooo genau sein. Im Datenblatt steht folgendes:

Max. power at 25 °C = P25 = 450mW
Resistance tolerance = DR/RN = +/-5%/+/-10%
Rated temperature = TN = 25°C
B value tolerance = DB/B = +/-3%


Zur Eigenerwärmung:
bei 50°C habe muss der NTC 0,034W vernichten, ich denke das geht
bei 70°C sind das aber schon 0,089W und
bei100°C sind das schooooon 0,264W! Das ist zuviel!!!

ausserdem ist das ein Spannungsteiler und da hat der Kohleschichtwiderstand bei 1k schon +/-50Ohm!
-> bei 25°C sind das 2,56V bzw. 2,44V und das sind ja auch schon wieder 2-3°C? Unterschied - also könnte man überlegen ob man statt dem Kohleschichtwiderstand ein Trimmer einbaut und den mit einem Messgerät "eicht" oder vielleicht die Temperatur an ein anderes Termometer angleicht?!

Wenn man eine genaue Temperatur benötigt sollte man lieber fertige sensoren nutzen bei denen der Messwert schon digital ausgegeben wird z.B. den DS18S20 -> kostet ca. 7 Euro das Stück ;-)

Soviel dazu.

Hat einer eine Idee wie ich nun mit dem Single Wert den Lüfter ein und aus schalte?
Ich möchte das über PWM machen und da brauche ich glaub ich einen Wert zwischen 0-254 (0%-100%)

If Temp => 25 Then
PWM = 50
If Temp => 30 Then
PWM = 100
IF PWM => 35 Then
PWM = 150
...

End


Das sieht umständlich aus und der Lüfter wird warscheinlich hoch und runter "eiern" oder?
Wie würdet ihr das machen?
Tobias

P.S. wie hast du denn die Bilder hineinbekommen?

Murus
19.11.2006, 20:04
Für den Lüfter:
Ich würde mir da eine Funktion zusammenstricken und mit dieser den PWM-Wert aus der Temperatur berechnen.
Die Funktion sollte dann wohl exponentiell aussehen ==> je höher die Temperatur, umso höher die Lüfterdrehzahl.
Etwas lineares geht natürlich auch...

TobiasBlome
19.11.2006, 20:09
Naja :-)
so aufwendig dachte ich gar nicht.

Also wenn der Lüfter vielleicht mit 25%, 50%, 75% oder 100% dreht reicht mir dass aus(also 4Stufen).

Ich dachte nur:

1. If Schleife größer als 25° -> Lüfter 25%
2. If Schleife größer als 30° -> Lüfter 50%
3...

und so läuft der Lüfter hoch und das fängt bei jedem Zyklus wieder von vorne an - oder nicht?


Tobias

magnetix48
19.11.2006, 20:42
Hallo,

wie wär's mit



Select Case Temp
Case 25 to 39
Lüfter 25
Case 40 to 59
Lüfter 50
Case 60 to 79
Lüfter 75
Case 80 to 100
Lüfter 100
Case >100
Feuerwehr
End Select



Gruß
Detlef

TobiasBlome
19.11.2006, 21:01
Sehr schöner Befehl.
Die Feuerwehr hab ich mal weggelassen :-)

Wenn sich Temp erhöht geht der Lüfter mit "Drehzahl" an. Wenn der Lüfter nun kühlt und Temp kleiner wird geht der Lüfter aus - er soll aber nun eine Stufe langsamer drehen...

Select Case Temp
Case 25 To 29
Pwm1 = 25
Case 30 To 34
Pwm1 = 50
Case 35 To 39
Pwm1 = 75
Case Is > 40
Pwm1 = 100
Case Else
Pwm1 = 0
End Select

magnetix48
19.11.2006, 21:18
Hallo,

wenn eine Übereinstimmung gefunden ist, wird Select verlassen. Wenn die Temperatur beim nächsten Durchlauf kleiner ist, wird auf die ensprechende Stufe zurückgeschaltet, nicht ausgeschaltet.

Gruß
Detlef

TobiasBlome
19.11.2006, 21:26
Aber nicht bei mir - er schaltet nich zurück sondern auf 0

Also ich habe nun:

Case 10 To 24
Pwm1 = 0
dazugeschrieben und die
Case Else
Pwm1 = 0
habe ich weggelassen. Warum hat er denn die Else Schleife nicht genommen?




$regfile = "m8def.dat" 'AT-Mega8
$crystal = 1000000 'Quarz: 1 MHz
$baud = 2400 'Baudrate der UART: 2400 Baud

'================================================= ==============================
' Variablen
'================================================= ==============================
Dim Result As Word
Dim Ohm As Single
Dim Temp1 As Single 'wegen den negativen Zahlen!!!
Dim Temp2 As Single
Dim Temp3 As Single
Dim Temp As Single
Dim Pwm1 As Byte


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




Start Adc

'-------------------------------------------------------------------------------
'Programm:
'-------------------------------------------------------------------------------

Do

Result = Getadc(1)
Ohm = 2.0238 * Result

Temp1 = Log(ohm)
Temp2 = Temp1 + 5.59017600439636
Temp3 = 3730 / Temp2
Temp = Temp3 - 273
Print "Temp: " ; Fusing(temp , "###.#" ) ; "°C"

Wait 1

Select Case Temp
Case 10 To 24
Pwm1 = 0
Case 25 To 29
Pwm1 = 25
Case 30 To 34
Pwm1 = 50
Case 35 To 39
Pwm1 = 75
Case Is > 40
Pwm1 = 100
'Case Else
' Pwm1 = 0
End Select

Print "PWM1: " ; Pwm1
Loop

End

magnetix48
19.11.2006, 21:37
Merkwürdig, da bin ich auch überfragt.