Der Nachfolger des WDR-Computerclub mit Wolfgang Back und Wolfgang Rudolph - ...und immer ein Bit übrigbehalten!


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Demoprogramm: Internen Temperatur-Sensor bei variabler Betriebsspannung nutzen Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 19.12.2018 17:38)
 Als Antwort auf Demoprogramm: Internen Temperatur-Sensor nutzen von Dietmar - 19.12.2018 17:36
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini M-Unit, Open-Mini Station
' ============================================================================
' 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
  PRINT "AD[35]=Temperatur-Sensor=";Temperature_Sensor
  PRINT "AD[36]=Internal_Bandgap=";Internal_Bandgap
  PRINT "AD[38]=VREFH=";VREFH
  PRINT

  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

Bisherige Antworten:

Re: Demoprogramm: Internen Temperatur-Sensor bei variabler Betriebsspannung nutzen (von Joachim - 22.12.2018 14:26)