![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
' ============================================================================ ' Internen Temperatur-Sensor der Open-Maxi nutzen ' In OCBASIC 1.12a_e1 von Dietmar Harlos am 10. Dezember 2018 ' ============================================================================ ' Der MC9S08AW60-Controller, auf dem die Open-Maxi basiert, besitzt einen ' internen Temperatur-Sensor. Der folgende Sourcecode demonstriert, wie auf ' der Open-Maxi die aktuelle Temperatur gemessen, mit 100 skaliert und als ' Kommazahl auf der Seriellen Schnittstelle ausgegeben werden kann. Der Sensor ' arbeitet allerdings nicht sehr genau: 1 Digit Differenz macht bis zu 1,5 °C ' Differenz im Temperaturwert aus. ' --- Rechenweg -------------------------------------------------------------- ' Herleitung der Berechnungsformel: ' ' Formel laut Data Sheet MC9S08AW60.pdf: ' ' Temp = 25 - ((VTEMP - VTEMP25) / m) [Equation 14-1] ' ' where: ' ' - VTEMP is the voltage of the temperature sensor channel at the ambient temperature. ' - VTEMP25 is the voltage of the temperature sensor channel at 25°C. ' - m is the hot or cold voltage versus temperature slope in V/°C. ' ' Werte laut Anhang: ' ' VTEMP25 = 1.396 Volt ' ' Temp sensor slope (m) ' -40°C - 25°C : m = 3.266 mV/°C (Kehrwert: 306.1849357 °C/V) ' 25°C - 125°C: m = 3.638 mV/°C (Kehrwert: 274.8763057 °C/V) ' ' Rechenweg lt. Data Sheet: ' ' In application code, the user reads the temperature sensor channel, ' calculates VTEMP, and compares to VTEMP25 . If VTEMP is greater than ' VTEMP25 the cold slope value is applied in Equation 14-1. If VTEMP is ' less than VTEMP25 the hot slope value is applied in Equation 14-1. ' ' Siehe auch Application Note AN3031.pdf ("Temperature Sensor for the ' HCS08 Microcontroller Family"). ' Rechenweg vereinfachen (zuerst für "cold slope value"): ' VTEMP25 in Digits = 1.396 * 1023 / 5 = 285.6216 ' Eine Umformung der Formel 14-1 ergibt: ' (Zum Vereinfachen könnte auch "simplify" in "MuPAD Light" verwendet werden.) ' Temp = 25 - ( (Temperature_Sensor - 285.6216) * 1.496505062) ' Welchen Wertebereich hat "Temperature_Sensor"? Mittels Minimal- und Maximaltemperatur ermitteln: ' (Zum Lösen der Gleichung wird "MuPAD Light" verwendet.) ' ' solve(25 - ( (x - 285.6216) * 1.496505062) = -40) -> x = 329.056134 -> 329 ' solve(25 - ( (x - 285.6216) * 1.496505062) = 125) -> x = 218.79924 -> 219 ' ' Der Term (x - 285.6216) hat also einen Wertebereich von -66.6216 bis 43.3784. ' ' Deshalb geeignet (mit 100) skalieren: ' ' Temperatur in °C/100 = 2500 - ( (Temperature_Sensor - 285.6216) * 149.6505062) ' ' Runden: ' ' Temperatur in °C/100 = 2500 - ( (Temperature_Sensor - 286) * 150) ' ' Prüfen: ' ' 2500 - ( (219 - 286) * 150) = 12550 °C/100 ' 2500 - ( (329 - 286) * 150) = -3950 °C/100 ' Jetzt noch die Herleitung für "hot slope value": ' ' Temperatur in °C/100 = 2500 - ( (Temperature_Sensor - 286) * 134) ' Alles gilt jedoch nur für exakt 5 Volt Betriebsspannung! Bei einer variablen ' Betriebsspannung muß mit der internen Bandgap-Spannungsreferenz gearbeitet ' werden. ' --- Definitionen für das System -------------------------------------------- INCLUDE "omax.def" 'Definitionen für die Open-Maxi ' --- Definitionen des Anwenders --------------------------------------------- DIM stellen BYTE DIM wert WORD DIM Temperature_Sensor AD[35] 'Temperatur-Sensor (s. Kapitel 14.2.3 im Manual) DIM VREFH AD[38] 'UREF=VREFH (per Jumper auf: VDD, Betriebsspannung) ' --- Das Hauptprogramm ------------------------------------------------------ ADC1CFG=&b01001000 'AD-Wandler auf gerundete 10 Bit WHILE TRUE PRINT "AD[35]=Temperatur-Sensor=";Temperature_Sensor PRINT "AD[38]=VREFH=";VREFH IF Temperature_Sensor>286 THEN PRINT "VTEMP is greater than VTEMP25 -> the cold slope value is applied" wert=2500 - ( (Temperature_Sensor - 286) * 150) ELSE PRINT "VTEMP is less than VTEMP25 -> the hot slope value is applied" wert=2500 - ( (Temperature_Sensor - 286) * 134) END IF ' Nun liegt der Temperaturwert mit Faktor 100 skaliert vor: PRINT "Temperaturwert mit Faktor 100 skaliert=";wert ' Nun den Temperaturwert in °C ausgeben: PRINT "Temperaturwert in °C="; ' Negatives Ergebnis behandeln: IF wert<0 THEN wert=-wert PUT ASC("-") END IF ' Vorkommaanteil ausgeben, dabei Skalierung beachten: PRINT wert/100;"."; ' Nachkommaanteil ausgeben: FOR stellen=1 TO 2 wert=(wert MOD 100)*10 PRINT wert/100; NEXT stellen PRINT "°C" PAUSE 25 WEND End2Host=ON 'Nach Programmende in den Host-Modus END 'Programmende, Neustart mit der Enter-Taste ' --- Programmende ---------------------------------------------------------- Passender Link: Bedienungsanleitung zur Open-Macro und Open-Maxi Meine Homepage: http://ccintern.dharlos.de |
Antwort schreiben |