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!

    • Pluto25 schrieb:

      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

      Hallo,
      ich hab das mal aus probiert. Sensor sollte ein PT 10 sein also 10Kohm NTC.
      NTC ist mit 10kohm gegen GND geschaltet.
      VCC vom Atmega also 5V
      Aber irgendwie zeigt er bei Raum Temperatur 38° an und sobald ich ihn in erwärme, in die Hand nehme, geht der Wert aber Runter.
      wo ist mein Fehler?
      Mein Code

      Quellcode

      1. 'Programm zum Ansteuern des Arduino Uno mit DF ROBOT LCD Keypad Shield
      2. '
      3. 'Controller: Original ATMega328P
      4. 'Quarz: 16MHz
      5. '
      6. 'Belegung LCD: *
      7. 'Backlight - PB2
      8. 'DB4 - PD4
      9. 'DB5 - PD5
      10. 'DB6 - PD6
      11. 'DB7 - PD7
      12. 'RS - PB0
      13. 'E - PB1
      14. '
      15. '
      16. 'Temperatur Messung:
      17. 'NTC 10K an PC1 (ADC1)
      18. 'NTC ueber 10K Wiederstand an GND
      19. ' GND--10k---|-----NTC-----5V
      20. ' |
      21. ' PC1
      22. 'Belegung Tasten:
      23. 'Über Widerstandsnetzwerk an PC0 (ADC0)
      24. 'keine Taste gedrückt: 1023 - Abfrage auf ADC > 1000
      25. 'Select: 739 - Abfrage auf ADC < 790
      26. 'Links: 503 - Abfrage auf ADC < 555
      27. 'Unten: 327 - Abfrage auf ADC < 380
      28. 'Oben: 143 - Abfrage auf ADC < 195
      29. 'Rechtst: 0 - Abfrage auf ADC < 50
      30. 'V_a Spannung am Messeingang
      31. 'T_0 Nenntemperatur des NTC-Widerstands in K
      32. 'R_0 Nennwiderstand des NTC-Sensors in Ohm
      33. 'B Materialkonstante B
      34. 'Rv Vorwiderstand in Ohm
      35. 'Rn Widerstand des NTC-Sensors temperaturabhängig
      36. Const Rv = 10000
      37. Const R_0 = 15000
      38. Const B = 3900 '3528
      39. '---------- Konfiguration -----------------------------------------------------
      40. $regfile = "m328pdef.dat"
      41. $crystal = 16000000
      42. $hwstack = 100
      43. $swstack = 100
      44. $framesize = 100
      45. '---------- LCD -----------------------------------------------------
      46. Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , _
      47. Db7 = Portd.7 , E = Portb.1 , Rs = Portb.0
      48. Config Lcd = 16 * 2
      49. Cursor Off Noblink
      50. Cls
      51. '---------- ADC Port C -----------------------------------------------
      52. Config Adc = Single , Prescaler = Auto , Reference = Avcc
      53. Start Adc
      54. '---------- Beleuchtung LCD---------------------------------------------
      55. Config Portb.2 = Output 'PinB.2 als Ausgang für das LCD Backlight
      56. PortB.2 = 1
      57. '---------- Variablen -----------------------------------------------------
      58. Dim Wert_von_tastatur As Word 'aktueller ADC-Wert
      59. Dim Wert_von_NTC As Word 'aktueller ADC-Wert
      60. Dim Rn As Single , Merke_1 As Single , Temp As Single
      61. '---------- Kauptprogramm -----------------------------------------------------
      62. do
      63. Wert_von_NTC = Getadc(1) 'adc-Wert einlesen
      64. Wert_von_tastatur = Getadc(0) 'adc-Wert einlesen
      65. locate 1,1
      66. lcd "ADC0"
      67. locate 1,10
      68. lcd "ADC1"
      69. Temp = Wert_von_NTC * Rv
      70. Wert_von_NTC = 1024 - Wert_von_NTC
      71. Temp = Temp / Wert_von_NTC
      72. 'Print Rn
      73. Temp = Temp / R_0
      74. Temp = Log(temp)
      75. Temp = Temp * 298
      76. Temp = Temp + B
      77. Temp = B / Temp
      78. Temp = Temp * 298
      79. Temp = Temp - 273
      80. 'Print "Temperatur " ; Temp
      81. locate 2,10 'Ausgabe Wert ADC 1
      82. lcd "" ; Temp
      83. locate 2,1 'Ausgabe Wert ADC 0
      84. lcd Wert_von_tastatur ;"
      85. 'locate 2,10 'Ausgabe Wert ADC 1
      86. 'lcd Wert_von_NTC ;"
      87. waitms 600
      88. locate 2,1
      89. lcd " "
      90. loop
      91. end
      Alles anzeigen
    • Guten Morgen,
      was macht man am Feiertag?
      Weiter Basteln.

      NTC hängt jetzt an 5V mit 10k Ohm.
      Auf dem Foto der Aufbau:
      Rot 5V
      Schwarz GND
      Gelb ADC1 PC1
      Grün Weiß zum NTC

      Ich hab den Code mal der Übersicht halber angepasst.
      ADC1 bleibt egal was ich mache auf 25,0 stehen, bleibt da aber auch bei erwärmen des NTC stehen.
      Wenn ich Zeile 136 vorher 85 bearbeite.
      Also ich diese wieder mit rein nehme zeigt er 24,1130 und 24,0246 im Wechsel. ABER er reagiert, also geht hoch, wenn ich ihn erwärme

      Quellcode

      1. 'Programm zum Ansteuern des Arduino Uno mit DF ROBOT LCD Keypad Shield
      2. 'Erweitert um NTC 10 KOhm Sensor.
      3. '---------- Atmega -----------------------------------------------------
      4. 'Controller: Original ATMega2560
      5. 'Quarz: 16MHz
      6. '---------- LCD -----------------------------------------------------
      7. 'Belegung LCD:
      8. 'Backlight - PB2
      9. 'DB4 - PD4
      10. 'DB5 - PD5
      11. 'DB6 - PD6
      12. 'DB7 - PD7
      13. 'RS - PB0
      14. 'E - PB1
      15. '---------- Tastatur -----------------------------------------------------
      16. 'Belegung Tasten:
      17. 'Über Widerstandsnetzwerk an PC0 (ADC0)
      18. 'keine Taste gedrückt: 1023 - Abfrage auf ADC > 1000
      19. 'Select: 739 - Abfrage auf ADC < 790
      20. 'Links: 503 - Abfrage auf ADC < 555
      21. 'Unten: 327 - Abfrage auf ADC < 380
      22. 'Oben: 143 - Abfrage auf ADC < 195
      23. 'Rechtst: 0 - Abfrage auf ADC < 50
      24. '---------- NTC -----------------------------------------------------
      25. 'Temperatur Messung:
      26. 'NTC 10K an PC1 (ADC1)
      27. 'NTC ueber 10K Wiederstand an GND
      28. ' VCC--10k---|-----NTC-----GND
      29. ' |
      30. ' PC1
      31. 'V_a Spannung am Messeingang
      32. 'T_0 Nenntemperatur des NTC-Widerstands in K
      33. 'R_0 Nennwiderstand des NTC-Sensors in Ohm
      34. 'B Materialkonstante B
      35. 'Rv Vorwiderstand in Ohm
      36. 'Rn Widerstand des NTC-Sensors temperaturabhängig
      37. '---------- Konfiguration Atmega -----------------------------------------------------
      38. $regfile = "m328pdef.dat"
      39. $crystal = 16000000
      40. $hwstack = 100
      41. $swstack = 100
      42. $framesize = 100
      43. '---------- LCD -----------------------------------------------------
      44. Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , _
      45. Db7 = Portd.7 , E = Portb.1 , Rs = Portb.0
      46. Config Lcd = 16 * 2
      47. Cursor Off Noblink
      48. Cls
      49. '---------- ADC Port C --------------------------------------------------------
      50. Config Adc = Single , Prescaler = Auto , Reference = Avcc
      51. Start Adc
      52. '---------- Beleuchtung LCD ---------------------------------------------------
      53. Config Portb.2 = Output 'PinB.2 als Ausgang für das LCD Backlight
      54. PortB.2 = 1
      55. '---------- Variablen -----------------------------------------------------
      56. Dim Wert_von_tastatur As Word 'aktueller ADC-Wert
      57. Dim Wert_von_NTC As Word 'aktueller ADC-Wert
      58. Dim Rn As Single , Merke_1 As Single , Temp As Single
      59. '---------- Konstanten --------------------------------------------------------
      60. Const Rv = 10000
      61. Const R_0 = 10000
      62. Const B = 3900 '3528
      63. '---------- Hauptprogramm -----------------------------------------------------
      64. do
      65. Wert_von_NTC = Getadc(1) 'adc-Wert einlesen
      66. Wert_von_tastatur = Getadc(0) 'adc-Wert einlesen
      67. locate 1,1
      68. lcd "ADC0"
      69. locate 1,10
      70. lcd "ADC1"
      71. Gosub Berechnung
      72. locate 2,10 'Ausgabe Wert ADC 1
      73. lcd "" ; Temp
      74. locate 2,1 'Ausgabe Wert ADC 0
      75. lcd Wert_von_tastatur ;"
      76. 'locate 2,10 'Ausgabe Wert ADC 1
      77. 'lcd Wert_von_NTC ;"
      78. waitms 600
      79. locate 2,1
      80. lcd " "
      81. loop
      82. end
      83. '---------- Sub Berechnung -----------------------------------------------------
      84. Berechnung:
      85. Temp = Wert_von_NTC * Rv
      86. ' Wert_von_NTC = 1024 - Wert_von_NTC
      87. Temp = Temp / Wert_von_NTC
      88. Temp = Temp / R_0
      89. Temp = Log(temp)
      90. Temp = Temp * 298
      91. Temp = Temp + B
      92. Temp = B / Temp
      93. Temp = Temp * 298
      94. Temp = Temp - 273
      95. return
      Alles anzeigen
      Dateien
    • ich hatte am Anfang was von "1,5° Drift" gelesen.
      Habe jetzt nicht jeden Kommentar komplett erarbeitet, aber:

      Du darfst jegliche Temperatursensoren nie ununterbrochen auslesen, alle Sensoren, inklusive digitaler Sensoren, erwärmen sich signifikant beim Betrieb.
      Man sollte die immer nur kurz auslesen, und dann abschalten, so, dass kein Srom mehr fließt bzw. der Auslese- und Rechenvorgang in digitalen Sensoren unterbrochen wird.

      1. Analoge erwärmen sich aufgrund des fließenden Stroms

      2. Digitale aufgrund der Berechnungsprodzeduren im enthaltenen "Controller".

      Deine 1,5-2° Drift ist klassisch.

      Am besten immer nur ein Lesevorgang, dann für 5 Sekunden ausschalten.
      Bei Bedarf die Ausleserate anpassen.
    • Also wir messen mit der gleichen Schaltung auch in unseren Comsumergeräten. Meßzyklus aller 20 Sekunden. Da ergibt sich keine messbare Eigenerwärmung auch über Tage und Wochen nicht. Wenn überhaupt dann ist der ständige Stromfluß nicht optimal wenn ich Energie sparen muß.

      Gruß Harald
      Wem ich nicht ausdrücklich widerspreche, der darf das bis auf Widerruf als "Gefällt mir" verstehen.
    • Meine Erfahrung zeigt LDR oderNTC sollten nicht direkt an ADC angeschossen werden. Für ein paar Cent ein OPV vorzuschalten ist optimal auch in Hinsicht der Empfindlichkeitseinstellung. Siehe Beispiel Schaltung.
      OPV.jpg

      Bin auch Haralds Meinung und würde NTC immer bestromt lassen. Eine konstante Eigenerwärmung ist immer besser und hat doch keinen Einfluss auf Abfragezyklus und Genauigkeit. Ein Offset zu „beseitigen“ ist doch eine Software Klacks.

      Mit freundlichen Grüßen