Ntc-Sensor am adc

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Ntc-Sensor am adc

      Hallo,
      ich möchte Temperaturen mit einem NTC-Sensor Messen
      den Sensor habe ich mit einem Vorwiderstand an einen adc Pin an geklemmt (Spannungsteiler)
      Zum Testen nutze ich momentan einen Arduino Uno möchte aber später einen Tiny85 benutzen.
      Ziel ist ein Temperaturschalter der bei 30°C ein Relais Steuert

      Datenblatt zum Sensor habe ich leider keins aber diese Daten stehen im Beipackzettel
      der Sensor hat einen Widerstand von 15k Ohm bei 25°C und 6k bei 50°C
      als Vorwiderstand habe ich einen 4,7k gewählt.

      Ich beschäftige mich jetzt schon Stunden mit der Berechnung und komme nicht weiter
      als Ergebnis bekomme ich z.B -258.0 °C
      mit den Formeln aus Degenblättern komm ich nicht klar
      meine Berechnung basiert auf dieser Quelle
      forum.arduino.cc/index.php?top…733.msg1170722#msg1170722



      BASCOM-Quellcode

      1. $Regfile="m328pdef.dat"
      2. '$Regfile="attiny45.dat"
      3. $Crystal=16000000
      4. $hwstack=40
      5. $swstack=16
      6. $framesize=32
      7. $baud=9600
      8. 'V_b Betriebsspannung ist gleich Maximaler ADC-Wert also 1023
      9. 'V_a Spannung am Messeingang
      10. 'Va_Vb Spannungsverhältniss NTC zur Betriebsspannung
      11. Dim ntc_pin as Byte
      12. Dim merke_1 as Single , merke_2 as Single
      13. Dim adc_wert as Word
      14. Dim T_0 as Single 'Nenntemperatur des NTC-Widerstands in °C
      15. Dim R_0 as Single 'Nennwiderstand des NTC-Sensors in Ohm
      16. Dim B as Single 'Materialkonstante B
      17. Dim Rv as Single 'Vorwiderstand in Ohm
      18. Dim Va_Vb as Single 'Spannungsverhältnis "Spannung am NTC zu Betriebsspannung
      19. Dim Temperatur as Single 'Rückgabewert
      20. Dim Rn as Single 'Widerstand des NTC-Sensors temperaturabhängig
      21. Dim Kelvin as Single
      22. Dim adc_max as Single
      23. adc_max = 1023.0
      24. Kelvin = 273.15
      25. Config Adc = Single , Prescaler = Auto , Reference = Avcc
      26. ntc_pin = 0
      27. Do
      28. adc_wert = getADC(ntc_pin)
      29. Va_Vb = adc_wert / adc_max
      30. Print "ADC-Wert " ; adc_wert
      31. Wait 1
      32. Gosub temperatur_ntc
      33. Loop
      34. End
      35. temperatur_ntc:
      36. T_0 = 25
      37. R_0 = 15000.0
      38. B = 3528
      39. Rv = 4700
      40. T_0 = T_0 + Kelvin 'umwandeln Celsius in Kelvin
      41. Rn = Rv * Va_Vb
      42. Va_Vb = 1-Va_Vb
      43. Rn = Rn / Va_Vb 'aktueller Widerstand des NTC
      44. merke_1 = Rn / R_0
      45. merke_1 = log(merke_1)
      46. merke_2 = B + T_0
      47. Merke_2 = merke_2 / merke_1
      48. temperatur = T_0 * B
      49. temperatur = temperatur / merke_2
      50. temperatur = temperatur - kelvin
      51. Print "Temperatur " ; temperatur
      52. wait 1
      53. Return
      Alles anzeigen
    • Für Raumtemperatur? Da wäre eine einfachere Methode brauchbar: Ntc an 5V und 10k nach Gnd
      deziTemperatur = Adc-159
      Die Formeln verursachen viel Rechenaufwand und sind dann meißt doch ungenau weil der B-Wert unbekannt ist.
      PS nach meinen Daten hat der 15k Ntc 5,4 kOhm bei 50° Sollte Deiner anders sein müssen die 159 angepasst werden: "159"= ADC(25°)Wert - 250
    • @ESD30
      Also, dein Spagetti-Code ist schon ne harte Nuss... :)

      Vielleicht hast du es ja schon selbst hinbekommen, aber ab Zeile 59 in deinem Code geht der Fehler los.

      Versuch das mal:

      Quellcode

      1. $Regfile = "m328pdef.dat"
      2. '$Regfile="attiny45.dat"
      3. $Crystal = 16000000
      4. $hwstack = 40
      5. $swstack = 16
      6. $framesize = 32
      7. $baud = 9600
      8. Dim merke_1 as Single , merke_2 as Single
      9. dim adc_wert as word
      10. Dim T_0 as Single 'Nenntemperatur des NTC-Widerstands in °C
      11. Dim R_0 as Single 'Nennwiderstand des NTC-Sensors in Ohm
      12. Dim B as Single 'Materialkonstante B
      13. Dim Rv as Single 'Vorwiderstand in Ohm
      14. Dim Va_Vb as Single 'Spannungsverhältnis "Spannung am NTC zu Betriebsspannung
      15. Dim Temperatur as Single 'Rückgabewert
      16. Dim Rn as Single 'Widerstand des NTC-Sensors temperaturabhängig
      17. Dim Kelvin as Single
      18. Dim adc_max as Single
      19. adc_max = 1023.0
      20. Kelvin = 273.15
      21. Do
      22. adc_wert = getADC(ntc_pin)
      23. Va_Vb = adc_wert / adc_max
      24. Print "ADC-Wert " ; adc_wert
      25. Wait 1
      26. Gosub temperatur_ntc
      27. Loop
      28. End
      29. temperatur_ntc:
      30. T_0 = 25
      31. R_0 = 15000.0
      32. B = 3528
      33. Rv = 4700
      34. T_0 = T_0 + Kelvin 'umwandeln Celsius in Kelvin
      35. Rn = Rv * Va_Vb
      36. Va_Vb = 1-Va_Vb
      37. Rn = Rn / Va_Vb 'aktueller Widerstand des NTC
      38. merke_1 = Rn / R_0
      39. merke_1 = log(merke_1)
      40. 'merke_2 = B + T_0 FALSCH
      41. 'Merke_2 = merke_2 / merke_1 FALSCH
      42. 'temperatur = T_0 * B FALSCH
      43. 'temperatur = temperatur / merke_2 FALSCH
      44. merke_1 = merke_1 / b
      45. merke_2 = 1 / T_0
      46. merke_1 = merke_1 + merke_2
      47. temperatur = 1 / merke_1
      48. temperatur = temperatur - kelvin
      49. Print "Temperatur " ; temperatur
      50. wait 1
      51. Return
      Alles anzeigen
    • djmsc schrieb:

      Klaus Heissler schrieb:

      Also, dein Spagetti-Code ist schon ne harte Nuss...
      So schlimm ist der Code nun auch wieder nicht :)
      Findest du ich habe mir Mühe gegeben den Spagetti-Code einiger Masenleserlich bzw. nachvollziehbar zu machen
      ich danke dir dachte schon ich bekomme keine Antwort mehr aber ich habe inzwischenden Fehler selber gefunden und die Berechnung in eine Funktion gepackt.
      außerdem habe ich die Berechnung der Temperatur wenn die Materialkonstante Bnicht bekannt ist auch noch hinbekommen.

      @Pluto25
      Auch dir ein Dankeschön für deinen Vorschlag ich bin zwar noch nicht ganzschlau daraus geworden werde mich aber noch mal damit beschäftigen vielleichtist dein weg ja der besser ich weiß es nicht.

      Ich bin kein Programmierer ich mache das nur Hobby mäßig also kann ich auchnicht beurteilen ob der entstanden Code so brauchbar ist ich denke es gibt nochVerbesserungsmöglichkeiten z.b. wird die Eigenerwärmung nicht berücksichtigtauch soll ja die Berechnung mit der B konstante ungenau sein naja mir würdeeine Genauigkeit von 0.2 bis 1°C reichen

      Hier mal der aktuelle Spagetti-Code :)

      Quellcode

      1. $Regfile="m328pdef.dat"
      2. $Crystal=16000000
      3. $hwstack=40
      4. $swstack=16
      5. $framesize=32
      6. $baud=9600
      7. 'V_b Betriebsspannung ist gleich Maximaler ADC-Wert also 1023
      8. 'V_a Spannung am Messeingang
      9. 'Va_Vb Spannungsverhältniss NTC zur Betriebsspannung
      10. 'T_0 Nenntemperatur des NTC-Widerstands in °C
      11. 'R_0 Nennwiderstand des NTC-Sensors in Ohm
      12. 'B Materialkonstante B
      13. 'Rv Vorwiderstand in Ohm
      14. 'Rn Widerstand des NTC-Sensors temperaturabhängig
      15. 'temp_a Rückgabewert mit bekannter Materialkonstante B
      16. 'temp_b Rückgabewert mit unbekannter Materialkonstande B
      17. 'T_1 erhöhte Temperatur des NTC-Widerstands in °C
      18. 'R_1 Widerstand des NTC-Sensors bei erhöhter Temperatur in Ohm
      19. Dim ntc_pin as Byte
      20. Dim adc_wert as Word
      21. Dim T_0 as Single , R_0 as Single , T_1 as Single , R_1 as Single , B as Single, Rv as Single
      22. Dim Va_Vb as Single , Rn as Single , merke_1 as Single , merke_2 as Single
      23. Dim Temperatur as Single , adc_max as Single , Kelvin as Single
      24. Dim Bx as Single , T_x as Single , T1_x as Single
      25. '------------------------------------------------------------------------------------------------------------
      26. 'hier die bekannten werte vom NTC angeben
      27. T_0 = 25
      28. R_0 = 15000.0
      29. T_1 = 50 'wird nur benötigt wenn B unbekannt
      30. R_1 = 6000.0 'wird nur benötigt wenn B unbekannt
      31. B = 3528
      32. Rv = 4700
      33. '------------------------------------------------------------------------------------------------------------
      34. Declare Function temp_a (byval T_ as Single , R_ as Single , B_ as Single, Rv_ as Single , adc_wert_ as Word) as Single
      35. Declare Function temp_b (byval T_b as Single , R_b as Single , T1_b as Single, R1_b as Single , Rv_b as Single , adc_wert_b as Word) as Single
      36. Config Adc = Single , Prescaler = Auto , Reference = Avcc
      37. ntc_pin = 0
      38. adc_max = 1023.0
      39. Kelvin = 273.15
      40. Do
      41. adc_wert = getADC(ntc_pin)
      42. 'Print "ADC-Wert " ; adc_wert
      43. adc_wert = 750 'für den Simulator
      44. 'Temperatur = temp_a(T_0 , R_0 , B , Rv , adc_wert)
      45. Temperatur = temp_b(T_0 , R_0 , T_1 , R_1 , Rv , adc_wert)
      46. Print "Temperatur " ; temperatur
      47. 'Wait 1
      48. Loop
      49. End
      50. Function temp_a (byval T_ as Single , R_ as Single , B_ as Single, Rv_ as Single , adc_wert_ as Word) as Single
      51. Va_Vb = adc_wert_ / adc_max
      52. T_ = T_ + Kelvin 'umwandeln Celsius in Kelvin
      53. Rn = Rv_ * Va_Vb
      54. Va_Vb = 1-Va_Vb
      55. Rn = Rn / Va_Vb 'aktueller Widerstand des NTC
      56. merke_1 = Rn / R_
      57. merke_1 = log(merke_1)
      58. merke_1 = merke_1 * T_
      59. merke_1 = B_ + merke_1
      60. merke_2 = t_ * B_
      61. merke_2 = merke_2 / merke_1
      62. temperatur = merke_2 - kelvin
      63. End Function
      64. Function temp_b (byval T_b as Single , R_b as Single , T1_b as Single, R1_b as Single , Rv_b as Single , adc_wert_b as Word) as Single
      65. Va_Vb = adc_wert_b / adc_max
      66. T_b = T_b + Kelvin 'umwandeln Celsius in Kelvin
      67. T1_b = T1_b + Kelvin
      68. Bx = R_b / R1_b
      69. Bx = log(Bx)
      70. T1_x = T1_b - T_b
      71. Bx = T1_x * Bx
      72. T_x = T_b * T1_b
      73. Bx = T_x / Bx
      74. Rn = Rv_b * Va_Vb
      75. Va_Vb = 1-Va_Vb
      76. Rn = Rn / Va_Vb 'aktueller Widerstand des NTC
      77. merke_1 = Rn / R_b
      78. merke_1 = log(merke_1)
      79. merke_1 = merke_1 * T_b
      80. merke_1 = Bx + merke_1
      81. merke_2 = t_b * Bx
      82. merke_2 = merke_2 / merke_1
      83. temperatur = merke_2 - kelvin
      84. End Function
      Alles anzeigen
    • ESD30 schrieb:

      wird die Eigenerwärmung nicht berücksichtigt
      Welche Bauform? Ich habe hier 1,5k NTC mit einem 1,5k Vorwiderstand an 3,3V. Der wandert nach dem Einschalten um ca 1,5 Grad. Und 10K Ntc mit 10K Vorwiderstand an 5V . Dort kann ich kein Drift feststellen. Beide sind etwa so groß wie eine 5mm LED. Dann gibts noch einen 10K Ntc in einem Glasröhrchen ca 0.8mm Durchmesser mal 2mm Länge der ist da sehr pingelig .

      Deine Berechnung kann über weitem Bereich präzise sein. Den B-Wert kann man rückwärts berechnen mit zwei korrekten Werten z.B. Eiswasser und Kochendes Wasser. Ein vorhandenes Thermometer würde ich nicht als Referenz empfehlen. Mein kleines Digitales meint das Wasser bei 83 Grad kocht.

      Meine Methode ist aus Flash-not eines tiny24 entstanden. Der hat keinen Platz für die Berechnung deshalb nahm ich einen passenden Vorwiderstand und habe einen adc-wert der mit nur einer Berechnung den zehnfachen Temperaturwert darstellt. (Auf dem Lcd war ein schwarzes Komma mit Filzstift)
      Das funktioniert nur in kleinen Bereich (während 50° mit 50,5 dargestellt werden, würden bei 100 nur 77 angezeigt)
      Hier hatte jemand das über Näherung mit Hilfe einer Tabelle ausgeführt was in weitem Bereich funktioniert.,
    • hallo Pluto25

      der Sensor ist 5mm dick und 20mm lang ich verwende jetzt einen 10k alsVorwiderstand bei momentaner Raumtemperatur bekomme ich mit der Berechnungwerte zischen 24.0 und 24.2°C
      als vergleich nutze ich einen 1-wire DS18B20 da bekomme ich einen Wert von24.8°C

      eben habe ich den ntc mal inEiswasser gehalten da komme ich nicht unter 13°C hm...

      ich habe deine Methode mal getestet scheint mir aber etwas ungenau zu seinpro adc wert 1°C ??? kann das sein? das heißt ich habe immer einen Driftso um 2°C
      ich habe den adc wert bei 25°C ermittelt bei mir ca. 409 --> 409 - 25 =384 also --> aktueller adc - 384 = x°C
    • sieht doch nicht schlecht aus ich habe jetzt auch nochmal VergleichsMessungen mit einem kalibrierten Sekunden Thermometer gemacht
      mit deiner Methode habe ich eine Abweichung 0,6 bis 0,9 °C bei 12°C Wasserund bei c.a. 24°C Raumtemperatur fast identisch.
      das gefällt mir, die Genauigkeit sollte ausreichend sein ich denke ich werdediese Methode nutzen.

      Nun der Sensor soll im Boden verbaut werden (in einem Leerrohr) und dieBodentemperatur Messen sobald diese über 30°C steigt muss Relaisschalten.
      Auserdem soll zur Sicherheit ein Sensor defekt erkannt werden und den angeschlossen Verbraucher abschalten
      dazu habe ich fogendes geschrieben
      was meit ihr ist das so in Ordnung oder was würdet ihr noch so an Sicherheit einbauen

      Quellcode

      1. If adc_wer > 50 and adc_wert < 560 Then 'Sicherheit adc_wert muss im bereich liegen
      2. 'hier noch die Temperaturmessung
      3. If Temperatur > 30 Then 'Regelung mit Hysterese
      4. Relais = Aus
      5. Else If Temperatur < 28 Then
      6. Relais = Ein
      7. End If
      8. Else
      9. Relais = Aus
      10. Print "Sensor defekt"
      11. End If
      Alles anzeigen
    • ESD30 schrieb:

      If adc_wer > 50
      das t nicht vergessen ;)
      Sieht soweit gut aus . 560 werden bei knapp 40° erreicht , nicht das da einer in Panic verfällt "Sensor defekt"
      Auch wenns ein bischen schade ist das das reais die meißte Zeit an ist so ist es doch ein guter Sicherheitsaspekt das es anderen Ausfallen auch aus wäre was dann ein "Abbrennen" verhindert.

      Auch wenns jetzt nicht mehr nötig ist
      Ich hab Dein Prog mal duch den Simulator geschickt. Temp_b tut seltsam : Steigende Temperatur bei konstanten Eingang a_217_27b18bee
      Temp_a widerum lief dann recht plausiebel ,nachdem ich festgestellt hatte das der Ntc dafür zwischen Gnd und ADC hängen muß.
      Die Fließkommaberechnung hat doch auffällige Rundungsfehler. Eine andere Widerstandsberechnug:
      Merke_1 = Adc_wert_ * Rv
      Merke_2 = 1024 - Adc_wert_
      Rn = Merke_1 / Merke_2
      machts ein bischen besser.
      Die dennoch hohen Fehler vermute ich im falschem B ?(
      Bei 0° -2,19.. 10° 8,50.. 20° 19,56.. 30° 30,47.. 40° 40,85.. 100° 112,53
      letzter Versuch:
      ein b von 3900 kommt besser hin 100° 102,03.. 30° 29.95.. 0° 0,18 :)

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Pluto25 ()

    • Pluto25 schrieb:

      Steigende Temperatur bei konstanten Eingang
      ok ich muss zugeben das ich temp_b jetzt nich ausgiebig getestet habe, habe es auch nur im Simulator durchgespielt.
      temp_a hingegen habe ich live getestet mit meinem Sensor passen die werte ziehmlich gut.

      Pluto25 schrieb:

      Auch wenns jetzt nicht mehr nötig ist
      nix da ich finde das super das du dir die Mühe gemacht hast wenn dadurch einbesser Code entsteht ist das mit Sicherheit auch für andere hier von Interesse
      die Sache mit dem B, ich habe mir verschiedene Degenblätter angeschaut mit Augenmerkauf die Materialkonstante bei 15kOhm diese scheint nicht so sehr"Konstant" zu sein
      denn im Bereich 0-50 hast sie je nach Ntc einen Wert von 3xxx und im Bereichvon 50-100 auch schon mal 4xxx
    • Pluto25 schrieb:

      Auch wenns jetzt nicht mehr nötig ist
      Ich hab Dein Prog mal duch den Simulator geschickt. Temp_b tut seltsam : Steigende Temperatur bei konstanten Eingang
      Temp_a widerum lief dann recht plausiebel ,nachdem ich festgestellt hatte das der Ntc dafür zwischen Gnd und ADC hängen muß.
      Die Fließkommaberechnung hat doch auffällige Rundungsfehler. Eine andere Widerstandsberechnug:
      Merke_1 = Adc_wert_ * Rv
      Merke_2 = 1024 - Adc_wert_
      Rn = Merke_1 / Merke_2
      machts ein bischen besser.
      Ich habe mich noch mal drangesetzt und deine verbesserte Berechnung eingefügt



      Was Temp_b angeht da hatte ich noch einen Fehler bei der Berechnung der Materialkonstante,

      das Problem mit der Steigenden Temperatur bei konstantem Eingang besteht immer noch

      im Simulator ist beim ersten Durchlauf der Funktion temp_b die Berechnung der Temperatur korrekt.

      beim Betrachten der Lokalen variablen ist mir aufgefallen das die Variable T1_b beim zweiten durchlauf den "alten" Wert behält

      und somit die weiter Berechnung nicht mehr stimmt was zur Steigenden Temperatur führt


      T1_b sollte bei jedem Aufruf der Funktion den Wert 50 haben bei den anderen Variablen also

      T_B R_B R1_B Rv_B
      klappt es ja auch bzw. die bekommen ihre soll werte

      Ich habe keine Ahnung wo da der Fehler sein soll


      Hier der aktuelle Code ich habe ihn etwas aufgeräumt

      Quellcode

      1. $Regfile="m328pdef.dat"
      2. $Crystal=16000000
      3. $hwstack=40
      4. $swstack=16
      5. $framesize=32
      6. $baud=9600
      7. 'T_0 Nenntemperatur des NTC-Widerstands in °C
      8. 'R_0 Nennwiderstand des NTC-Sensors in Ohm
      9. 'B Materialkonstante B
      10. 'Rv Vorwiderstand in Ohm
      11. 'Rn Widerstand des NTC-Sensors temperaturabhängig
      12. 'temp_a Rückgabewert mit bekannter Materialkonstante B
      13. 'temp_b Rückgabewert mit unbekannter Materialkonstande B
      14. 'T_1 erhöhte Temperatur des NTC-Widerstands in °C
      15. 'R_1 Widerstand des NTC-Sensors bei erhöhter Temperatur in Ohm
      16. Dim ntc_pin as Byte
      17. Dim adc_wert as Word
      18. Dim T_0 as Single , R_0 as Single , T_1 as Single , R_1 as Single , B as Single, Rv as Single
      19. Dim Va_Vb as Single , Rn as Single , merke_1 as Single , merke_2 as Single
      20. Dim Temperatur as Single , adc_max as Single , Kelvin as Single
      21. Dim Bx as Single , T_x as Single , T1_x as Single
      22. Dim temp_min as Single , temp_max as Single
      23. '------------------------------------------------------------------------------------------------------------
      24. 'hier die bekannten werte vom NTC angeben
      25. T_0 = 25
      26. R_0 = 15000.0
      27. T_1 = 50 'wird nur benötigt wenn B unbekannt
      28. R_1 = 6000.0 'wird nur benötigt wenn B unbekannt
      29. B = 3531 '3528
      30. Rv = 10000
      31. '------------------------------------------------------------------------------------------------------------
      32. Declare Function temp_a (byval T_ as Single , R_ as Single , B_ as Single, Rv_ as Single , adc_wert_ as Word) as Single
      33. Declare Function temp_b (byval T_b as Single , R_b as Single , T1_b as Single , R1_b as Single , Rv_b as Single , adc_wert_b as Word) as Single
      34. Config Adc = Single , Prescaler = Auto , Reference = Avcc
      35. ntc_pin = 0
      36. adc_max = 1023.0
      37. Kelvin = 273.15
      38. temp_min = 25
      39. temp_max = 25
      40. Do
      41. adc_wert = getADC(ntc_pin)
      42. Print "ADC-Wert " ; adc_wert
      43. adc_wert = 614 'für Simulator für 25Grad
      44. 'Temperatur = temp_a(T_0 , R_0 , B , Rv , adc_wert)
      45. Temperatur = temp_b(T_0 , R_0 , T_1 , R_1 , Rv , adc_wert)
      46. Print "Temperatur: " ; Temperatur
      47. 'Wait 1
      48. Loop
      49. End
      50. 'Funktion zur Temperaturberechnung bei bekanter Materialkonstante B
      51. Function temp_a (byval T_ as Single , R_ as Single , B_ as Single, Rv_ as Single , adc_wert_ as Word) as Single
      52. T_ = T_ + Kelvin 'umwandeln Celsius in Kelvin
      53. 'Berechnung Widerstand
      54. Merke_1 = Adc_wert_ * Rv
      55. Merke_2 = 1024 - Adc_wert_
      56. Rn = Merke_1 / Merke_2 'aktueller Widerstand des NTC
      57. 'Berechnung der Temperatur
      58. merke_1 = Rn / R_
      59. merke_1 = log(merke_1)
      60. merke_1 = merke_1 * T_
      61. merke_1 = B_ + merke_1
      62. merke_2 = t_ * B_
      63. merke_2 = merke_2 / merke_1
      64. temperatur = merke_2 - kelvin
      65. End Function
      66. 'Funktion zur Temperaturberechnung bei unbekanter Materialkonstante B
      67. Function temp_b (byval T_b as Single , R_b as Single , T1_b as Single , R1_b as Single , Rv_b as Single , adc_wert_b as Word) as Single
      68. T_b = T_b + Kelvin 'umwandeln Celsius in Kelvin
      69. T1_b = T1_b + Kelvin 'umwandeln Celsius in Kelvin
      70. 'Berechnung Materialkonstante
      71. T_x = T_b * T1_b
      72. T1_x = T1_b - T_b
      73. T_x = T_x / T1_x
      74. Bx = R_b / R1_b
      75. Bx = log(Bx)
      76. Bx = T_x * Bx 'aktuelle Materialkonstante des NTC
      77. 'Berechnung Widerstand
      78. Merke_1 = Adc_wert_b * Rv_b
      79. Merke_2 = 1024 - Adc_wert_b
      80. Rn = Merke_1 / Merke_2
      81. 'Berechnnung der Temperatur
      82. merke_1 = Rn / R_b
      83. merke_1 = log(merke_1)
      84. merke_1 = merke_1 * T_b
      85. merke_1 = Bx + merke_1
      86. merke_2 = t_b * Bx
      87. merke_2 = merke_2 / merke_1
      88. temperatur = merke_2 - kelvin 'aktuelle Temperatur
      89. End Function
      Alles anzeigen
    • Dein swstack ist vielleicht zu klein. Du hast ja lauter single mit jeweils 4 byte, ich zähle 4 bis 5 single plus ein word. Das ergibt 18 bis 22 byte, du reservierst nur 16 bytes.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch schrieb:

      Dein swstack ist vielleicht zu klein
      Bestimmt, aber leider hilft auch 128 nicht das Problem liegt auch woanders.

      @ESD30 nimm einen anderen adc-Wert dann dreht der wieder richtig ab a_217_27b18bee
      Mit dem Simulator kann man in dem LCD-Fenster grob die Wunschwerte "einschieben" ein Feinjustiern geht dann mit Pfeil up/down.

      PS Die 6000R bei 50° gemessen , aus irgendeinem Datenblatt oder aus einem beiliegendem?
    • Pluto25 schrieb:

      PS Die 6000R bei 50° gemessen , aus irgendeinem Datenblatt oder aus einem beiliegendem?
      in der Packung lag ein Zettel mit diesen Daten, mehr nicht
      0°C 42k
      20°C 18k
      25°C 15K
      50°C 6k
      Regelbereich -25 bis +90°C

      nachgemessen habe ich jetzt nicht mir fällt auch nix ein wie ich den Sensor auf konstante 50°C bringen soll
    • T_1 wird zerschossen weil T1_b verändert wird. Sie benutzen die gleichen Speicherzellen, mit
      Declare Function Temp_b(byval T_b As Single , R_b As Single , Byval T1_b As Single , R1_b A.....
      funktioniert es. Das byval muß vor jeder Variable die einen eigenen Speicher bekommen soll.
      Bei meinem NTC berechnet er 3936 und sein Fehler liegt um 0,1° erst über 80 und unter -20 wird er größer ca 2° womit man ja gut leben kann.
      Leider braucht auch die "Sklett"-Version schon fast 2K Flash.:

      Quellcode

      1. $Regfile="m328pdef.dat"
      2. $Crystal=16000000
      3. $hwstack=40
      4. $swstack=32
      5. $framesize=32
      6. $baud = 9600
      7. 'V_a Spannung am Messeingang
      8. 'T_0 Nenntemperatur des NTC-Widerstands in K
      9. 'R_0 Nennwiderstand des NTC-Sensors in Ohm
      10. 'B Materialkonstante B
      11. 'Rv Vorwiderstand in Ohm
      12. 'Rn Widerstand des NTC-Sensors temperaturabhängig
      13. Const Rv = 10000
      14. Const R_0 = 15000
      15. Const B = 3900 '3528
      16. Dim Adc_wert As Word
      17. Dim Rn As Single , Merke_1 As Single , Temp As Single
      18. '------------------------------------------------------------------------------------------------------------
      19. Config Adc = Single , Prescaler = Auto , Reference = Avcc
      20. Do
      21. Adc_wert = Getadc(0)
      22. Temp = Adc_wert * Rv
      23. Adc_wert = 1024 - Adc_wert
      24. Temp = Temp / Adc_wert
      25. 'Print Rn
      26. Temp = Temp / R_0
      27. Temp = Log(temp)
      28. Temp = Temp * 298
      29. Temp = Temp + B
      30. Temp = B / Temp
      31. Temp = Temp * 298
      32. Temp = Temp - 273
      33. 'Print "Temperatur " ; Temp
      34. 'Wait 1
      35. Loop
      36. End
      Alles anzeigen