![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
' ============================================================================ ' Open-Maxi: Internen Temperatur-Sensor bei variabler Betriebsspannung nutzen ' In OCBASIC 1.12a_e1 von Dietmar Harlos am 11. 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 bei variabler Betriebsspannung 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. ' Es wird 32-Bit-Arithmetik verwendet. ' --- Rechenweg -------------------------------------------------------------- ' Herleitung der Berechnungsformeln: ' ' 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"). Allerdings werden dort auch VTEMP25 ' und m an die aktuelle Betriebsspannung angepaßt. Das ist IMHO aber ' nicht notwendig. ' Im Folgenden wird "MuPAD Light" verwendet, um die Berechnungen durch- ' zuführen. Einen Downloadlink zu diesem Programm gibt es im Forum. ' Rechenweg vereinfachen (zuerst für "cold slope value"): ' Mit den folgenden Befehlen werden in "MuPAD Light" Funktionen vereinbart: ' UB := 1.2 * 1023 / Internal_Bandgap // UB: Betriebsspannung ' VTEMP25_in_Digits := 1.396 * 1023 / UB ' Das ergibt folgende Formel: ' VTEMP25_in_Digits = 1.163333333 * Internal_Bandgap ' Jetzt skalieren, also mit einer Konstanten multiplizieren, um mit Integer- ' Arithmetik exakter rechnen zu können. Es ist sinnvoll, mit einer ' Zehnerpotenz zu skalieren. Also mit 10, 100 oder 1000. Dann wird der ' skalierte Wert übersichtlicher dargestellt. ' VTEMP25_in_Digits * 1000 = 1163 * Internal_Bandgap ' Jetzt die Formel 14-1 umformen: (Die Variable mk ist der Kehrwert von m.) ' Temp = 25 - ((VTEMP - VTEMP25) * mk) ' Jetzt einsetzen: ' VTEMP = (Temperature_Sensor * UB)/1023 ' VTEMP25 = 1.396 Volt ' mk = 306.1849357 ' Temp = 25 - (((Temperature_Sensor * UB)/1023 - 1.396) * 306.1849357) ' Ab jetzt Ausgaben nicht mehr per PRETTYPRINT formatieren: ' PRETTYPRINT:=FALSE ' Die Formel jetzt mit dem Befehl "simplify" in "MuPAD Light" vereinfachen: ' simplify(Temp = 25 - (((Temperature_Sensor * UB)/1023 - 1.396) * 306.1849357)) ' Das ergibt folgende Formel: ' Temp = 452.4341702 - 367.4219228 / Internal_Bandgap * Temperature_Sensor ' Die Berechnung im Programm wird mittels Integer-Arithmetik durchgeführt, ' deshalb darf keine Berechnung ein zu großes oder zu kleines Ergebnis ' liefern. Im vorliegenden Fall ist der Term "367.4219228 / Internal_Bandgap" ' kritisch. Die Dynamik ist zu niedrig. Deshalb die Formel umformen: ' Temp = 452.4341702 - 367.4219228 * Temperature_Sensor / Internal_Bandgap ' Jetzt wieder geeignet skalieren (hier mit Faktor 100): ' Temp * 100 = 45243 - 36742 * Temperature_Sensor / Internal_Bandgap ' Zum Schluß noch die Formel für "hot slope value": ' simplify(Temp = 25 - (((Temperature_Sensor * UB)/1023 - 1.396) * 274.8763057)) ' Das ergibt folgende Formel: ' Temp = 408.7273228 - 329.8515668/Internal_Bandgap*Temperature_Sensor ' Umformen und mit 100 skalieren. Dabei runden: ' Temp * 100 = 40873 - 32985 * Temperature_Sensor / Internal_Bandgap ' Somit sind wir fertig! ' --- Definitionen für das System -------------------------------------------- INCLUDE "omax.def" 'Definitionen für die Open-Maxi OPTION 32BIT '32-Bit freischalten (ab OCBASIC Version 1.12) ' --- Definitionen des Anwenders --------------------------------------------- DIM Temperature_Sensor AD[35] 'Temperatur-Sensor (s. Kapitel 14.2.3 im Manual) DIM Internal_Bandgap AD[36] 'Internal Bandgap (typ. 1.20 Volt +/- 15 mV) DIM VREFH AD[38] 'UREF=VREFH (per Jumper auf: VDD, Betriebsspannung) DIM stellen BYTE DIM wert LONG DIM VTEMP25_in_Digits LONG ' --- System-Erweiterungen einbinden ----------------------------------------- INCLUDE "omax32.iia" '32-Bit-Erweiterung einbinden ' --- Das Hauptprogramm ------------------------------------------------------ #main URTok=ON '32-Bit-Erweiterung aktivieren POKE SPMSC1,PEEK(SPMSC1) OR 1 '"Bandgap Buffer Enable" ADC1CFG=&b01001000 'AD-Wandler auf gerundete 10 Bit WHILE TRUE PRINT "AD[35]=Temperatur-Sensor=";Temperature_Sensor PRINT "AD[36]=Internal_Bandgap=";Internal_Bandgap PRINT "AD[38]=VREFH=";VREFH VTEMP25_in_Digits = 1163 * Internal_Bandgap 'mit 1000 skaliert IF (Temperature_Sensor*1000) > VTEMP25_in_Digits THEN PRINT "VTEMP is greater than VTEMP25 -> the cold slope value is applied" wert=45243 - 36742 * Temperature_Sensor / Internal_Bandgap 'mit 100 skaliert ELSE PRINT "VTEMP is less than VTEMP25 -> the hot slope value is applied" wert=40873 - 32985 * Temperature_Sensor / Internal_Bandgap 'mit 100 skaliert 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 |