Daten : Speichereffizent speichern und auswerten : Temperatur

This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

  • Daten : Speichereffizent speichern und auswerten : Temperatur

    Hallo,

    ich habe mir ein Thermometer auf Basis eines NTC gebastelt.
    pollin.de/p/ntc-widerstand-10-kohm-1-220757

    Jetzt habe ich die 1024stel je °C berechnet.
    Nur das ganze schaut nicht so aus als das ich es einfach berechnen könnte.
    In den Daten steckt einfach kene einfach zu berechnenter "Sinn" für mich.

    Wie kann ich diese Daten jetzt möglichst Speichereffizent (AtMega48) ablegen und abfragen?

    Grüße & Danke
    Alex
    Files
  • Du kannst den NTC in Reihe schalten mit einem konstanten Widerstand. Den Spannungsteiler zwischen 5V und Gnd. Dann ergibt sich rechnerisch eine Spannung. Die misst Du mit dem ADC. Im Programm benutzt Du entweder eine Tabelle mit Array oder Data oder Du benutzt eine Formel T=f(U) oder Du nimmst in dem Dich interessierenden Temperaturbfreich sogar eine Linearität der Formel an T=a+b*U. Die Werte a und b ermittelst Du aus einer Exceltabelle auf Basis der Tabelle aus dem Datenblatt und einer für den Spannungsteiler eingefügten Spalte. Du hast die Spalten T, R und U.
    Kennst Du die sehr guten Ausführungen auf
    sprut.de/electronic/temeratur/temp.htm#ntc
    ?

    Wie ist Dein Temperaturbereich und wie genau brauchst Du die Temperatur? Warum möchtest Du Speicher sparen?
  • Hallo Alex,
    der NTC ist für eine genaue Temperaturmessung nicht ideal.
    Besser wäre ein PT100 (oder ähnliches). Diese haben einen sehr linearen Verlauf und können somit einfach berechnet werden.
    Den Aufwand, hier vernünftige werte zu bekommen, halte ich für unangemessen.
    Du könntest e.v. die Werte mit DATA: am Ende deines Programmes ablegen und nach jedem Messzyklus durchsuchen. Und den Nächstliegenden, als Ergebnis verwenden.
    Doch wie erwähnt, immer noch ungenau und aufwändig.

    Schau dir doch mal DS1820 hier im Forum an.

    Liebe Grüße
    Siggi
  • Bei 5V? Da Wären 10k Vorwiderstand besser:Zwischenablage.gif
    Wie genau muß es sein? Für den Außentemperaturbereich sind sie gut geeignet. Auch die Fertigung ist soweit präzise das sie nach Austausch in den seltensten Fällen nachkalibriert werden müssen. Auch ihre Lebenserwartung ist >10 Jahre.
    Sorry ich hab mir dem Polin Typ erst später angesehen. Dieser muß noch Wetterfest gemacht werden um lange zu leben. Auch für den Innenraum min. Lack sonst wandert Feuchtigkeit seine Beine hoch und es wird Essig mit Genauigkeit.

    The post was edited 1 time, last by Pluto25 ().

  • stefanhamburg wrote:

    Du kannst den NTC in Reihe schalten mit einem konstanten Widerstand. Den Spannungsteiler zwischen 5V und Gnd. Dann ergibt sich rechnerisch eine Spannung. Die misst Du mit dem ADC. Im Programm benutzt Du entweder eine Tabelle mit Array oder Data oder Du benutzt eine Formel T=f(U) oder Du nimmst in dem Dich interessierenden Temperaturbfreich sogar eine Linearität der Formel an T=a+b*U. Die Werte a und b ermittelst Du aus einer Exceltabelle auf Basis der Tabelle aus dem Datenblatt und einer für den Spannungsteiler eingefügten Spalte. Du hast die Spalten T, R und U.
    Kennst Du die sehr guten Ausführungen auf
    sprut.de/electronic/temeratur/temp.htm#ntc
    ?

    Wie ist Dein Temperaturbereich und wie genau brauchst Du die Temperatur? Warum möchtest Du Speicher sparen?
    Ja, ich habe 1k an VCC und danach den NTC - ist also invertiert. Je höher die Temperatur desto niedriger der Wert. 1k weil ich den Fühler in Wasser (Gartenteich) einsetzen will. Hab Ihn zu dem zweck in ein Aluröhrchen mit Wärmeleitkleber eingegeossen und darauf geachtet das der NTC unmittelbaren kontakt zum Rohr hat. Vorsichtig in den Schraubstock und ann ganz vorsichtig gepresst bis kaum mehr abstand zwischen NTC und Rohr war. Dabei hab ich ausreichend astand gelassen zu der Seite bei der ich das Rohr verpressen wollte. Hat ganz gut geklappt.

    Ich brauche die Temperatur zwischen -30 und +40 Grad = Gartenteich.

    Wenig speicher da noch ein bisschen auswertung mit rein muss - Steuerung einer umwälzpumpe usw.
    Den Artikel muss ich erst noch lesen - vielen dank!

    Grüße
    Alex
  • Adelinde wrote:

    Hallo Alex,
    der NTC ist für eine genaue Temperaturmessung nicht ideal.
    Besser wäre ein PT100 (oder ähnliches). Diese haben einen sehr linearen Verlauf und können somit einfach berechnet werden.
    Danke!
    Den PT100 hab ich bereits bestellt. Dauert dann um die 4 bis 8 Wochen.
    Vorher muss ich mit den NTC vorlieb nehmen. Hab die NTCs auserdem schon aufwenig verpackt und verkabelt.

    Grüße
    Alex
  • Hallo Alex,
    jetzt muss ich dich leider nochmals enttäuschen.
    Ohne hochohmigen Verstärker (OP) wirst du keine vernünftigen werte bekommen.
    Der PT100 ist zwar sehr linear und lässt sich sehr einfach auslesen und berechnen, du musst jedoch die Rahmenbedingungen einhalten.
    Der PT100 hat bei 0 °C 100 Ohm, bei 30 °C ca. 110Ohm. Maximaler Strom zum Messen sollte 1mA nicht überschreiten. (sonst erwärmt sich der PT100 und verändert seinen Wert)
    U=R·I 110V 1mA ca. 0,11V selbst bei einer REF von 2,5V zu wenig.
    Schaltungen hierzu findest du in der Cloud. (kl. OP+ 4 Widerstände)

    Wen du den Aufbau vermeiden möchtest, nimm den DS1820. 1Widerstand direkt an den Halbleiter. 2adriges Kabel dann und mit 2K oder UV Kleber isolieren. Wenn du sehr ängstlich bist, noch nen Schrumpfschlauch drüber.
    Hülse ist nicht nötig. Diesen Sensor hatte ich 10 Jahre im Wasser eines Terrariums. (2K Kleber ohne Schlauch ;)

    Gruß Siggi
  • Hallo Alex,
    ich muss stefenhamburg recht geben.
    Wenn du einfach Linearität annimmst, kannst du den Wert, wie oben beschrieben, errechne. Der entstehende Fehler sollte zu vernachlässigen sein.
    Als Vorwiderstand 10kOhm bei 5V Vcc, dann ergeben sich Messwerte von ca.1,8V(40°) bis ca 4,8V (-30°)

    Gruß Siggi
  • Kann mir bitte jemand eine Legende zu den Konstanten geben?
    b finde ich ja im Datenblatt U ist Spannung (also vermudlich die Messspannung von 5V); und T müsste Temperatur sein, oder? Woher bekomme ich ja bzw. was ist a?

    Ich hab akutell nur eingeschrankt zu verwendente Thermometer. Mein Thermo mit Messfühler ist leider nicht Wasserfest. Was eine überprüfung der Werte im minusbereich erschwert. Es bildet sich immer Kondenswasser. Hab keine Ahnung woher ich den "Schrott" habe.

    Kann ich das ganze Anhand des Datenblattes auch so berechnen?
    Invertiert; 1000 Ohm an VCC
    (1024* (miltipliziert) Ohmischer Wert bei Temperatur x) / (geteilt durch) (1000Ohm + Ohmischer Wert bei Temperatur x)

    Meine Tabelle scheint zu funktionieren obwohl sie mir zuviel Speicher braucht. Zumindest in dem Teil den ich überprüfen kann.

    Source Code

    1. Select Case Var_temp
    2. Case 1016 : Var_temperatur = 31
    3. Var_minus = 1
    4. Case 1015 : Var_temperatur = 29
    5. Var_minus = 1
    6. Case 1014 : Var_temperatur = 27
    7. Var_minus = 1
    8. Case 1013 : Var_temperatur = 25
    9. Var_minus = 1
    10. Case 1012 : Var_temperatur = 23
    11. Var_minus = 1
    12. Case 1011 : Var_temperatur = 22
    13. Var_minus = 1
    14. Case 1010 : Var_temperatur = 20
    15. Var_minus = 1
    16. Case 1009 : Var_temperatur = 19
    17. Var_minus = 1
    18. Case 1008 : Var_temperatur = 18
    19. Var_minus = 1
    20. Case 1007 : Var_temperatur = 17
    21. Var_minus = 1
    22. Case 1006 : Var_temperatur = 15
    23. Var_minus = 1
    24. Case 1005 : Var_temperatur = 14
    25. Var_minus = 1
    26. Case 1004 : Var_temperatur = 13
    27. Var_minus = 1
    28. Case 1003 : Var_temperatur = 12
    29. Var_minus = 1
    30. Case 1002 : Var_temperatur = 11
    31. Var_minus = 1
    32. Case 1001 : Var_temperatur = 10
    33. Var_minus = 1
    34. Case 1000 : Var_temperatur = 9
    35. Var_minus = 1
    36. Case 999 : Var_temperatur = 8
    37. Var_minus = 1
    38. Case 997 : Var_temperatur = 7
    39. Var_minus = 1
    40. Case 996 : Var_temperatur = 6
    41. Var_minus = 1
    42. Case 995 : Var_temperatur = 5
    43. Var_minus = 1
    44. Case 994 : Var_temperatur = 4
    45. Var_minus = 1
    46. Case 992 : Var_temperatur = 3
    47. Var_minus = 1
    48. Case 991 : Var_temperatur = 2
    49. Var_minus = 1
    50. Case 990 : Var_temperatur = 1
    51. Var_minus = 1
    52. Case 988 : Var_temperatur = 0
    53. Var_minus = 0
    54. Case 987 : Var_temperatur = 1
    55. Var_minus = 0
    56. Case 985 : Var_temperatur = 2
    57. Var_minus = 0
    58. Case 983 : Var_temperatur = 3
    59. Var_minus = 0
    60. Case 982 : Var_temperatur = 4
    61. Var_minus = 0
    62. Case 980 : Var_temperatur = 5
    63. Var_minus = 0
    64. Case 978 : Var_temperatur = 6
    65. Var_minus = 0
    66. Case 976 : Var_temperatur = 7
    67. Var_minus = 0
    68. Case 974 : Var_temperatur = 8
    69. Var_minus = 0
    70. Case 972 : Var_temperatur = 9
    71. Var_minus = 0
    72. Case 970 : Var_temperatur = 10
    73. Var_minus = 0
    74. Case 968 : Var_temperatur = 11
    75. Var_minus = 0
    76. Case 966 : Var_temperatur = 12
    77. Var_minus = 0
    78. Case 964 : Var_temperatur = 13
    79. Var_minus = 0
    80. Case 961 : Var_temperatur = 14
    81. Var_minus = 0
    82. Case 959 : Var_temperatur = 15
    83. Var_minus = 0
    84. Case 956 : Var_temperatur = 16
    85. Var_minus = 0
    86. Case 954 : Var_temperatur = 17
    87. Var_minus = 0
    88. Case 951 : Var_temperatur = 18
    89. Var_minus = 0
    90. Case 949 : Var_temperatur = 19
    91. Var_minus = 0
    92. Case 946 : Var_temperatur = 20
    93. Var_minus = 0
    94. Case 943 : Var_temperatur = 21
    95. Var_minus = 0
    96. Case 940 : Var_temperatur = 22
    97. Var_minus = 0
    98. Case 937 : Var_temperatur = 23
    99. Var_minus = 0
    100. Case 934 : Var_temperatur = 24
    101. Var_minus = 0
    102. Case 931 : Var_temperatur = 25
    103. Var_minus = 0
    104. Case 928 : Var_temperatur = 26
    105. Var_minus = 0
    106. Case 924 : Var_temperatur = 27
    107. Var_minus = 0
    108. Case 921 : Var_temperatur = 28
    109. Var_minus = 0
    110. Case 918 : Var_temperatur = 29
    111. Var_minus = 0
    112. Case 914 : Var_temperatur = 30
    113. Var_minus = 0
    114. Case 910 : Var_temperatur = 31
    115. Var_minus = 0
    116. Case 907 : Var_temperatur = 32
    117. Var_minus = 0
    118. Case 903 : Var_temperatur = 33
    119. Var_minus = 0
    120. Case 899 : Var_temperatur = 34
    121. Var_minus = 0
    122. Case 895 : Var_temperatur = 35
    123. Var_minus = 0
    124. Case 891 : Var_temperatur = 36
    125. Var_minus = 0
    126. Case 887 : Var_temperatur = 37
    127. Var_minus = 0
    128. Case 883 : Var_temperatur = 38
    129. Var_minus = 0
    130. Case 878 : Var_temperatur = 39
    131. Var_minus = 0
    132. Case 874 : Var_temperatur = 40
    133. Var_minus = 0
    134. End Select
    Display All
    Eine Frage: Wenn ich Case else mit einfüge. Geht es immer in die Else abzweigung.
    Obwohl sich alle Werte inerhalb des Wertebereiches der "case" befinden geht es trotzdem ständig in die else abzweigung, wieso?

    Das ergibt keinerlei Sinn.

    Grüße
    Alex
  • Adelinde wrote:

    Hallo Alex,
    jetzt muss ich dich leider nochmals enttäuschen.
    Ohne hochohmigen Verstärker (OP) wirst du keine vernünftigen werte bekommen.
    Der PT100 ist zwar sehr linear und lässt sich sehr einfach auslesen und berechnen, du musst jedoch die Rahmenbedingungen einhalten.
    Der PT100 hat bei 0 °C 100 Ohm, bei 30 °C ca. 110Ohm. Maximaler Strom zum Messen sollte 1mA nicht überschreiten. (sonst erwärmt sich der PT100 und verändert seinen Wert)
    U=R·I 110V 1mA ca. 0,11V selbst bei einer REF von 2,5V zu wenig.
    Schaltungen hierzu findest du in der Cloud. (kl. OP+ 4 Widerstände)
    Hab Ihn schon bestellt ohne mehr als den Artikel von sprut zu lessen.
    Werd Ihn wohl dann auch verwenen mit 1k Vorwiderstand.
    Kieg ich den bei einer Messspannung von 5V halbwegs vernunftige Werte raus?
    Die OP Schaltung hab ich glücklicherweise schon einige male aufgebaut.
    Da ich dann sowieso was neues löte spielt auch das keine Rolle.
    Nur die 100V machen mir sorgen. Soviel Spannung mag ich einfach nicht.

    Grüße
    Alex
  • Alex_T wrote:

    ständig in die else abzweigung, wieso?
    Sollte er nicht. Der komplette Code könnte Aufschluß geben .

    Alex_T wrote:

    Nur die 100V machen mir sorgen
    Welche 100V? Isolationsspannung? Die sollte nicht überschritten darf aber sehr unterschritten werden.

    Alex_T wrote:

    mit 1k Vorwiderstand
    wird aber recht grob: Temperatur = ADC-512. (V-Ref=5V)

    Und besser nur für die Zeit des Messens über einen Pin mit Strom versorgen. Sonst würde die Selbsterwärmung Fehler verursachen.

    Sorry Falscher PT
    Temperatur =(ADC-93)*3 Also 3Grad schritte die auch noch unlinear sind = unbrauchbar.
    Bei 100 ohm Vorwiderstand würde oben genante stimmen.

    The post was edited 1 time, last by Pluto25 ().

  • Alex_T wrote:

    Adelinde wrote:

    U=R·I 110V 1mA ca. 0,11V selbst bei einer REF von 2,5V zu wenig.
    Nur die 100V machen mir sorgen. Soviel Spannung mag ich einfach nicht.

    Ich vermute, du beziehst dich auf die Zeile im Zitat. :)
    110Ohm * 1mA ca 0,11V
    Sollte es heißen.
    Wen die Spannung über ein OP aufbereitet wird ist 1kOhm ein sehr guter Wert.

    Für die Frage nach der else Abzweigung, solltest Du wirklich den ganzen Code einstellen. Alles andere ist Glaskugellesen.
    Zum Atmel kennenlernen ist der Ansatz ok. Falls Du den Aufbau verwenden möchtest, muss ich Pluto25 recht geben.

    Auch wen ich mich jetzt Wiederhole: Genaue Messung mit wenig Aufwand (damit meine ich Software und Hardware)
    DS1820 1Wire in der Bucht 4st für 6€ inc. Versand, Reichelt 1,70€ und mit Kabel wasserdicht ca. 5€
    9 oder 12 bit Auflösung Genauigkeit 0,5° und kalibriert, Kabellängen von mehreren Metern möglich (test mit 10m ohne Probleme)
    Bei Bedarf hängst Du Mehrere Sensoren an die gleiche Leitung und kannst dann auch Luft, Pumpe ... mit abfragen)

    Alternativ gibts auch noch den LM75 für den 2Wire (I2C)

    Gruß Siggi
  • Hallo,

    erstmal: ich verorge die NTCs über zwei PNP Tranistoren mit Strom. Da ich bereits das 7 Segment dingens an dem MC hab dacht ich das es so den MC etwas entlasten würde verbunden ist MC und Tranistor über 4k7.

    Noch eine zwischenfrage: wie gut funktioniert laut euren Erfahrungen Oversampling?
    Bei mir liefert es recht durchwachsene Werte. Obwohl Strom und Spannung konstant sind bekomme ich bei den Messungen diverenzen von rund 20%.

    Hier ist ersteinmal der Sourcecode der ohne Probleme hinhaut:


    Source Code

    1. '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    2. 'Mikrocontroller Konfigurieren
    3. $regfile = "m8adef.dat" ' specify the used micro
    4. $crystal = 1000000 ' used crystal frequency
    5. $hwstack = 32 ' default use 32 for the hardware stack
    6. $swstack = 10 ' default use 10 for the SW stack
    7. $framesize = 40 ' default use 40 for the frame space
    8. '$baud = 19200
    9. 'Ende Mikrocontroller Konfigurieren
    10. '=============================================================
    11. '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    12. 'Ports Konfigurireren
    13. Config Portb = Output
    14. Gnd_digit_1 Alias Portd.1
    15. Gnd_digit_2 Alias Portd.2
    16. Gnd_digit_3 Alias Portd.3
    17. Gnd_digit_4 Alias Portd.4
    18. Config Gnd_digit_1 = Output
    19. Config Gnd_digit_2 = Output
    20. Config Gnd_digit_3 = Output
    21. Config Gnd_digit_4 = Output
    22. Config Portc.5 = Input
    23. Config Portc.4 = Input
    24. Config Portd.6 = Output
    25. Config Portd.7 = Output
    26. Portd.6 = 1
    27. Portd.7 = 1
    28. 'Port für Spannungsmessung
    29. 'Ende Ports Konfigurieren
    30. '=============================================================
    31. '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    32. 'Variablen
    33. Dim Var_ziffern(14) As Byte
    34. Var_ziffern(1) = &B0011_1111 '0
    35. Var_ziffern(2) = &B0000_0110 '1
    36. Var_ziffern(3) = &B0101_1011 '2
    37. Var_ziffern(4) = &B0100_1111
    38. Var_ziffern(5) = &B0110_0110
    39. Var_ziffern(6) = &B0110_1101
    40. Var_ziffern(7) = &B0111_1101
    41. Var_ziffern(8) = &B0000_0111
    42. Var_ziffern(9) = &B0111_1111
    43. Var_ziffern(10) = &B0110_1111 '9
    44. '9
    45. Var_ziffern(11) = &B0011_1001 'C 'C
    46. Var_ziffern(12) = &B0111_0001 'F
    47. Var_ziffern(13) = &B0000_0000 'Clear GND
    48. Var_ziffern(14) = &B0100_0000 '- Minuszeichen
    49. '9
    50. Dim Var_count As Byte
    51. Dim Var_temp1 As Word
    52. Dim Var_temp2 As Word
    53. Dim Var_timer0 As Byte
    54. Dim Var_sec As Byte
    55. Dim Var_old_sec As Byte
    56. Dim Var_digit_array(4) As Word
    57. Dim Var_digit_tmp As Dword
    58. Dim Var_zahl As Byte
    59. Dim Var_temperatur As Byte
    60. Dim Var_minus As Bit
    61. Dim Var_temp As Dword
    62. Dim Var_count1 As Byte
    63. 'Ende Variablen
    64. '=============================================================
    65. '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    66. 'Timer
    67. Const Timer0reload = 4
    68. Config Timer0 = Timer , Prescale = 1024
    69. Load Timer0 , Timer0reload
    70. On Timer0 Timer0_routine
    71. Enable Timer0
    72. Start Timer0
    73. Enable Interrupts
    74. 'Ende Timer
    75. '=============================================================
    76. '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    77. 'Spannung Messen Anfang
    78. Config Adc = Single , Prescaler = Auto , Reference = Avcc
    79. Start Adc
    80. 'Ende Spannung Messen
    81. '=============================================================
    82. Do
    83. Incr Var_count
    84. Incr Var_count1
    85. If Var_sec < 31 Then
    86. Portd.7 = 1
    87. Portd.6 = 0
    88. If Var_count1 = 100 Then
    89. Var_count1 = 0
    90. Var_temp1 = Getadc(5)
    91. End If
    92. Var_temp = Var_temp1
    93. Var_digit_array(4) = 1
    94. Elseif Var_sec > 30 Then
    95. Portd.6 = 1
    96. Portd.7 = 0
    97. If Var_count1 = 100 Then
    98. Var_count1 = 0
    99. Var_temp2 = Getadc(4)
    100. End If
    101. Var_temp = Var_temp2
    102. Var_digit_array(4) = 2
    103. End If
    104. 'var_temp = 1024 - var_temp
    105. 'Temperatur in postiv umrechnen
    106. Var_digit_tmp = Var_temp Mod 1000
    107. Var_digit_array(3) = Var_digit_tmp / 100
    108. Var_digit_tmp = Var_digit_tmp Mod 100
    109. Var_digit_array(2) = Var_digit_tmp / 10
    110. Var_digit_tmp = Var_digit_tmp Mod 10
    111. Var_digit_array(1) = Var_digit_tmp
    112. If Var_count = 1 Then
    113. Portb = Var_ziffern(13)
    114. If Var_digit_array(4) = 1 Then
    115. Portb = &B1000_0110
    116. Else
    117. Portb = &B1101_1011
    118. End If
    119. Gnd_digit_1 = 0
    120. Gnd_digit_2 = 1
    121. Gnd_digit_3 = 1
    122. Gnd_digit_4 = 1
    123. Elseif Var_count = 2 Then
    124. Portb = Var_ziffern(13)
    125. Var_zahl = Var_digit_array(3) + 1
    126. Portb = Var_ziffern(var_zahl)
    127. Gnd_digit_1 = 1
    128. Gnd_digit_2 = 0
    129. Gnd_digit_3 = 1
    130. Gnd_digit_4 = 1
    131. Elseif Var_count = 3 Then
    132. Portb = Var_ziffern(13)
    133. Var_zahl = Var_digit_array(2) + 1
    134. Portb = Var_ziffern(var_zahl)
    135. Gnd_digit_1 = 1
    136. Gnd_digit_2 = 1
    137. Gnd_digit_3 = 0
    138. Gnd_digit_4 = 1
    139. Elseif Var_count = 4 Then
    140. Portb = Var_ziffern(13)
    141. Var_zahl = Var_digit_array(1) + 1
    142. Portb = Var_ziffern(var_zahl)
    143. Gnd_digit_1 = 1
    144. Gnd_digit_2 = 1
    145. Gnd_digit_3 = 1
    146. Gnd_digit_4 = 0
    147. Var_count = 0
    148. End If
    149. Waitms 1
    150. Loop
    151. Timer0_routine:
    152. Incr Var_timer0
    153. If Var_timer0 = 5 Then
    154. Incr Var_sec
    155. End If
    156. If Var_sec > 60 Then Var_sec = 0
    157. Load Timer0 , Timer0reload
    158. Return
    159. End 'end program
    Display All

    The post was edited 1 time, last by Alex_T ().

  • Und hier ist der Sourcecode mit Problemen ohne Ende:
    Das Wechseln zwischen den Werten von den beiden NTCs funktioniert auch nicht. Irgendwann hängt das ding einfach und zeigt nur noch einen NTC an obwohl es zwischen 1. und 2. wechselt.

    Ich hab inzwischen den Sourcecode so oft editiert das ich vermudlich noch ein paar zusatzfehler mit reingeflogen sind ;)

    Source Code

    1. '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    2. 'Mikrocontroller Konfigurieren
    3. $regfile = "m8adef.dat" ' specify the used micro
    4. $crystal = 1000000 ' used crystal frequency
    5. $hwstack = 32 ' default use 32 for the hardware stack
    6. $swstack = 10 ' default use 10 for the SW stack
    7. $framesize = 40 ' default use 40 for the frame space
    8. '$baud = 19200
    9. 'Ende Mikrocontroller Konfigurieren
    10. '=============================================================
    11. '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    12. 'Ports Konfigurireren
    13. Config Portb = Output
    14. Gnd_digit_1 Alias Portd.1
    15. Gnd_digit_2 Alias Portd.2
    16. Gnd_digit_3 Alias Portd.3
    17. Gnd_digit_4 Alias Portd.4
    18. Config Gnd_digit_1 = Output
    19. Config Gnd_digit_2 = Output
    20. Config Gnd_digit_3 = Output
    21. Config Gnd_digit_4 = Output
    22. Config Portc.5 = Input
    23. Config Portc.4 = Input
    24. Config Portd.6 = Output
    25. Config Portd.7 = Output
    26. Portd.6 = 1
    27. Portd.7 = 1
    28. 'Port für Spannungsmessung
    29. 'Ende Ports Konfigurieren
    30. '=============================================================
    31. '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    32. 'Variablen
    33. Dim Var_ziffern(14) As Byte
    34. Var_ziffern(1) = &B0011_1111 '0
    35. Var_ziffern(2) = &B0000_0110 '1
    36. Var_ziffern(3) = &B0101_1011 '2
    37. Var_ziffern(4) = &B0100_1111
    38. Var_ziffern(5) = &B0110_0110
    39. Var_ziffern(6) = &B0110_1101
    40. Var_ziffern(7) = &B0111_1101
    41. Var_ziffern(8) = &B0000_0111
    42. Var_ziffern(9) = &B0111_1111
    43. Var_ziffern(10) = &B0110_1111 '9
    44. '9
    45. Var_ziffern(11) = &B0011_1001 'C 'C
    46. Var_ziffern(12) = &B0111_0001 'F
    47. Var_ziffern(13) = &B0000_0000 'Clear GND
    48. Var_ziffern(14) = &B0100_0000 '- Minuszeichen
    49. '9
    50. Dim Var_count As Byte
    51. Dim Var_temp1 As Word
    52. Dim Var_temp2 As Word
    53. Dim Var_timer0 As Byte
    54. Dim Var_sec As Byte
    55. Dim Var_old_sec As Byte
    56. Dim Var_digit_array(4) As Word
    57. Dim Var_digit_tmp As Dword
    58. Dim Var_zahl As Byte
    59. Dim Var_temperatur As Byte
    60. Dim Var_minus As Bit
    61. Dim Var_temp As Dword
    62. Dim Var_count1 As Byte
    63. 'Ende Variablen
    64. '=============================================================
    65. '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    66. 'Timer
    67. Const Timer0reload = 4
    68. Config Timer0 = Timer , Prescale = 1024
    69. Load Timer0 , Timer0reload
    70. On Timer0 Timer0_routine
    71. Enable Timer0
    72. Start Timer0
    73. Enable Interrupts
    74. 'Ende Timer
    75. '=============================================================
    76. '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    77. 'Spannung Messen Anfang
    78. Config Adc = Single , Prescaler = Auto , Reference = Avcc
    79. Start Adc
    80. 'Ende Spannung Messen
    81. '=============================================================
    82. Do
    83. Incr Var_count
    84. Incr Var_count1
    85. If Var_sec < 31 Then
    86. Portd.7 = 1
    87. Portd.6 = 0
    88. If Var_count1 = 100 Then
    89. Var_count1 = 0
    90. Var_temp1 = Getadc(5)
    91. End If
    92. Var_temp = Var_temp1
    93. Var_digit_array(4) = 1
    94. Elseif Var_sec > 30 Then
    95. Portd.6 = 1
    96. Portd.7 = 0
    97. If Var_count1 = 100 Then
    98. Var_count1 = 0
    99. Var_temp2 = Getadc(4)
    100. End If
    101. Var_temp = Var_temp2
    102. Var_digit_array(4) = 2
    103. End If
    104. Var_temp = 1024 - Var_temp
    105. Select Case Var_temp
    106. Case Is < 7 : Var_temperatur = 88
    107. Var_minus = 1
    108. Case 8 : Var_temperatur = 31
    109. Var_minus = 1
    110. Case 9 : Var_temperatur = 29
    111. Var_minus = 1
    112. Case 10 : Var_temperatur = 27
    113. Var_minus = 1
    114. Case 11 : Var_temperatur = 25
    115. Var_minus = 1
    116. Case 12 : Var_temperatur = 23
    117. Var_minus = 1
    118. Case 13 : Var_temperatur = 22
    119. Var_minus = 1
    120. Case 14 : Var_temperatur = 20
    121. Var_minus = 1
    122. Case 15 : Var_temperatur = 19
    123. Var_minus = 1
    124. Case 16 : Var_temperatur = 18
    125. Var_minus = 1
    126. Case 17 : Var_temperatur = 17
    127. Var_minus = 1
    128. Case 18 : Var_temperatur = 15
    129. Var_minus = 1
    130. Case 19 : Var_temperatur = 14
    131. Var_minus = 1
    132. Case 20 : Var_temperatur = 13
    133. Var_minus = 1
    134. Case 21 : Var_temperatur = 12
    135. Var_minus = 1
    136. Case 22 : Var_temperatur = 11
    137. Var_minus = 1
    138. Case 23 : Var_temperatur = 10
    139. Var_minus = 1
    140. Case 24 : Var_temperatur = 9
    141. Var_minus = 1
    142. Case 25 : Var_temperatur = 8
    143. Var_minus = 1
    144. Case 27 : Var_temperatur = 7
    145. Var_minus = 1
    146. Case 28 : Var_temperatur = 6
    147. Var_minus = 1
    148. Case 29 : Var_temperatur = 5
    149. Var_minus = 1
    150. Case 30 : Var_temperatur = 4
    151. Var_minus = 1
    152. Case 32 : Var_temperatur = 3
    153. Var_minus = 1
    154. Case 33 : Var_temperatur = 2
    155. Var_minus = 1
    156. Case 34 : Var_temperatur = 1
    157. Var_minus = 1
    158. Case 36 : Var_temperatur = 0
    159. Var_minus = 0
    160. Case 37 : Var_temperatur = 1
    161. Var_minus = 0
    162. Case 39 : Var_temperatur = 2
    163. Var_minus = 0
    164. Case 41 : Var_temperatur = 3
    165. Var_minus = 0
    166. Case 42 : Var_temperatur = 4
    167. Var_minus = 0
    168. Case 44 : Var_temperatur = 5
    169. Var_minus = 0
    170. Case 46 : Var_temperatur = 6
    171. Var_minus = 0
    172. Case 48 : Var_temperatur = 7
    173. Var_minus = 0
    174. Case 50 : Var_temperatur = 8
    175. Var_minus = 0
    176. Case 52 : Var_temperatur = 9
    177. Var_minus = 0
    178. Case 54 : Var_temperatur = 10
    179. Var_minus = 0
    180. Case 56 : Var_temperatur = 11
    181. Var_minus = 0
    182. Case 58 : Var_temperatur = 12
    183. Var_minus = 0
    184. Case 60 : Var_temperatur = 13
    185. Var_minus = 0
    186. Case 63 : Var_temperatur = 14
    187. Var_minus = 0
    188. Case 65 : Var_temperatur = 15
    189. Var_minus = 0
    190. Case 68 : Var_temperatur = 16
    191. Var_minus = 0
    192. Case 70 : Var_temperatur = 17
    193. Var_minus = 0
    194. Case 73 : Var_temperatur = 18
    195. Var_minus = 0
    196. Case 75 : Var_temperatur = 19
    197. Var_minus = 0
    198. Case 78 : Var_temperatur = 20
    199. Var_minus = 0
    200. Case 81 : Var_temperatur = 21
    201. Var_minus = 0
    202. Case 84 : Var_temperatur = 22
    203. Var_minus = 0
    204. Case 87 : Var_temperatur = 23
    205. Var_minus = 0
    206. Case 90 : Var_temperatur = 24
    207. Var_minus = 0
    208. Case 93 : Var_temperatur = 25
    209. Var_minus = 0
    210. Case 96 : Var_temperatur = 26
    211. Var_minus = 0
    212. Case 100 : Var_temperatur = 27
    213. Var_minus = 0
    214. Case 103 : Var_temperatur = 28
    215. Var_minus = 0
    216. Case 106 : Var_temperatur = 29
    217. Var_minus = 0
    218. Case 110 : Var_temperatur = 30
    219. Var_minus = 0
    220. Case 114 : Var_temperatur = 31
    221. Var_minus = 0
    222. Case 117 : Var_temperatur = 32
    223. Var_minus = 0
    224. Case 121 : Var_temperatur = 33
    225. Var_minus = 0
    226. Case 125 : Var_temperatur = 34
    227. Var_minus = 0
    228. Case 129 : Var_temperatur = 35
    229. Var_minus = 0
    230. Case 133 : Var_temperatur = 36
    231. Var_minus = 0
    232. Case 137 : Var_temperatur = 37
    233. Var_minus = 0
    234. Case 141 : Var_temperatur = 38
    235. Var_minus = 0
    236. Case 146 : Var_temperatur = 39
    237. Var_minus = 0
    238. Case 150 : Var_temperatur = 40
    239. Var_minus = 0
    240. Case Is > 151 : Var_temperatur = 88
    241. Var_minus = 0
    242. End Select
    243. If Var_minus = 1 Then
    244. Var_digit_array(3) = 14
    245. Else
    246. Var_digit_array(3) = 11
    247. End If
    248. Var_digit_array(2) = Var_temperatur / 10
    249. Var_digit_tmp = Var_temperatur Mod 10
    250. Var_digit_array(1) = Var_digit_tmp
    Display All
    Der REst vom Sourcecode ist im nächsten Beitrag da er die 10000 überstieg. Diese Grenze sollte dringend auf das doppelte angehoben werden.

    Grüße
    Alex
  • Source Code

    1. If Var_count = 1 Then
    2. Portb = Var_ziffern(13)
    3. If Var_digit_array(4) = 1 Then
    4. Portb = &B1000_0110
    5. Else
    6. Portb = &B1101_1011
    7. End If
    8. Gnd_digit_1 = 0
    9. Gnd_digit_2 = 1
    10. Gnd_digit_3 = 1
    11. Gnd_digit_4 = 1
    12. Elseif Var_count = 2 Then
    13. Portb = Var_ziffern(13)
    14. Var_zahl = Var_digit_array(3)
    15. Portb = Var_ziffern(var_zahl)
    16. Gnd_digit_1 = 1
    17. Gnd_digit_2 = 0
    18. Gnd_digit_3 = 1
    19. Gnd_digit_4 = 1
    20. Elseif Var_count = 3 Then
    21. Portb = Var_ziffern(13)
    22. Var_zahl = Var_digit_array(2) + 1
    23. Portb = Var_ziffern(var_zahl)
    24. Gnd_digit_1 = 1
    25. Gnd_digit_2 = 1
    26. Gnd_digit_3 = 0
    27. Gnd_digit_4 = 1
    28. Elseif Var_count = 4 Then
    29. Portb = Var_ziffern(13)
    30. Var_zahl = Var_digit_array(1) + 1
    31. Portb = Var_ziffern(var_zahl)
    32. Gnd_digit_1 = 1
    33. Gnd_digit_2 = 1
    34. Gnd_digit_3 = 1
    35. Gnd_digit_4 = 0
    36. Var_count = 0
    37. End If
    38. Waitms 1
    39. Loop
    40. Timer0_routine:
    41. Incr Var_timer0
    42. If Var_timer0 = 5 Then
    43. Incr Var_sec
    44. End If
    45. If Var_sec > 60 Then Var_sec = 0
    46. Load Timer0 , Timer0reload
    47. Return
    48. End 'end program
    Display All
  • Michael wrote:

    schau dir nochmal die Formel an, du hast die Werte total verdreht.
    a iat die Steigung und b ist der Offset
    Schau dir mein richtiges Zitat an:
    b ist unproblematisch. Weil es ja im Datenblatt steht.
    Muss ich die Steigung ( a ) selbst ermitteln?
    Wenn ja: nur für den Temperautrbereich den ich brauche oder für alle Daten?
    Da ich die Daten nicht einfach in Libre kopieren kann wird das ne angehme Arbeit...
    Aber was tut man nicht alles für ein paar billige Sensoren ;) .
    Außerdem habe ich Probleme mit den Einheiten.

    ist es:
    T=a*U+b
    oder T=a*(U+b)

    T = Temperatur ( Fahrenheit / Celsius ? )
    a = Steigung ( in % ? )
    b = Datenblatt 3380 K
    U = Spannung in Volt?

    Außerdem hab ich noch so rund ein dutzend Formeln gefunden. Hier eine weitere Formel:
    rn-wissen.de/wiki/index.php/PT…mperaturabh.C3.A4ngigkeit

    Wenn ich das mit den NTC auf die Reihe kriege ergeben sich für mich ungeahnte Möglichkeiten. Z.B. einen Leistungstranistor über einen NTC überwachen und die Leistung anpassen - was im übrigen auch für vieles andere Anwenden lassen müsste. Ich müsste mir keine genauen Gedanken mehr um Kühlkörperdimensionierung oder Hitzeableitung machen sondern würde die Leistung einfach über einen NTC über die Temperatur regeln.

    Grüße
    Alex

    The post was edited 1 time, last by Alex_T ().