ESD30 schrieb:
lag ein Zettel
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!
-
-
Ja hätte auch garnichts dabei sein können.
Vielen Dank Pluto25,
das mit dem Byval wusste ich nicht und wieder was dazugelernt -
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
- $Regfile="m328pdef.dat"
- $Crystal=16000000
- $hwstack=40
- $swstack=32
- $framesize=32
- $baud = 9600
- 'V_a Spannung am Messeingang
- 'T_0 Nenntemperatur des NTC-Widerstands in K
- 'R_0 Nennwiderstand des NTC-Sensors in Ohm
- 'B Materialkonstante B
- 'Rv Vorwiderstand in Ohm
- 'Rn Widerstand des NTC-Sensors temperaturabhängig
- Const Rv = 10000
- Const R_0 = 15000
- Const B = 3900 '3528
- Dim Adc_wert As Word
- Dim Rn As Single , Merke_1 As Single , Temp As Single
- '------------------------------------------------------------------------------------------------------------
- Config Adc = Single , Prescaler = Auto , Reference = Avcc
- Do
- Adc_wert = Getadc(0)
- Temp = Adc_wert * Rv
- Adc_wert = 1024 - Adc_wert
- Temp = Temp / Adc_wert
- 'Print Rn
- Temp = Temp / R_0
- Temp = Log(temp)
- Temp = Temp * 298
- Temp = Temp + B
- Temp = B / Temp
- Temp = Temp * 298
- Temp = Temp - 273
- 'Print "Temperatur " ; Temp
- 'Wait 1
- Loop
- End
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
- 'Programm zum Ansteuern des Arduino Uno mit DF ROBOT LCD Keypad Shield
- '
- 'Controller: Original ATMega328P
- 'Quarz: 16MHz
- '
- 'Belegung LCD: *
- 'Backlight - PB2
- 'DB4 - PD4
- 'DB5 - PD5
- 'DB6 - PD6
- 'DB7 - PD7
- 'RS - PB0
- 'E - PB1
- '
- '
- 'Temperatur Messung:
- 'NTC 10K an PC1 (ADC1)
- 'NTC ueber 10K Wiederstand an GND
- ' GND--10k---|-----NTC-----5V
- ' |
- ' PC1
- 'Belegung Tasten:
- 'Über Widerstandsnetzwerk an PC0 (ADC0)
- 'keine Taste gedrückt: 1023 - Abfrage auf ADC > 1000
- 'Select: 739 - Abfrage auf ADC < 790
- 'Links: 503 - Abfrage auf ADC < 555
- 'Unten: 327 - Abfrage auf ADC < 380
- 'Oben: 143 - Abfrage auf ADC < 195
- 'Rechtst: 0 - Abfrage auf ADC < 50
- 'V_a Spannung am Messeingang
- 'T_0 Nenntemperatur des NTC-Widerstands in K
- 'R_0 Nennwiderstand des NTC-Sensors in Ohm
- 'B Materialkonstante B
- 'Rv Vorwiderstand in Ohm
- 'Rn Widerstand des NTC-Sensors temperaturabhängig
- Const Rv = 10000
- Const R_0 = 15000
- Const B = 3900 '3528
- '---------- Konfiguration -----------------------------------------------------
- $regfile = "m328pdef.dat"
- $crystal = 16000000
- $hwstack = 100
- $swstack = 100
- $framesize = 100
- '---------- LCD -----------------------------------------------------
- Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , _
- Db7 = Portd.7 , E = Portb.1 , Rs = Portb.0
- Config Lcd = 16 * 2
- Cursor Off Noblink
- Cls
- '---------- ADC Port C -----------------------------------------------
- Config Adc = Single , Prescaler = Auto , Reference = Avcc
- Start Adc
- '---------- Beleuchtung LCD---------------------------------------------
- Config Portb.2 = Output 'PinB.2 als Ausgang für das LCD Backlight
- PortB.2 = 1
- '---------- Variablen -----------------------------------------------------
- Dim Wert_von_tastatur As Word 'aktueller ADC-Wert
- Dim Wert_von_NTC As Word 'aktueller ADC-Wert
- Dim Rn As Single , Merke_1 As Single , Temp As Single
- '---------- Kauptprogramm -----------------------------------------------------
- do
- Wert_von_NTC = Getadc(1) 'adc-Wert einlesen
- Wert_von_tastatur = Getadc(0) 'adc-Wert einlesen
- locate 1,1
- lcd "ADC0"
- locate 1,10
- lcd "ADC1"
- Temp = Wert_von_NTC * Rv
- Wert_von_NTC = 1024 - Wert_von_NTC
- Temp = Temp / Wert_von_NTC
- 'Print Rn
- Temp = Temp / R_0
- Temp = Log(temp)
- Temp = Temp * 298
- Temp = Temp + B
- Temp = B / Temp
- Temp = Temp * 298
- Temp = Temp - 273
- 'Print "Temperatur " ; Temp
- locate 2,10 'Ausgabe Wert ADC 1
- lcd "" ; Temp
- locate 2,1 'Ausgabe Wert ADC 0
- lcd Wert_von_tastatur ;"
- 'locate 2,10 'Ausgabe Wert ADC 1
- 'lcd Wert_von_NTC ;"
- waitms 600
- locate 2,1
- lcd " "
- loop
- end
-
PTC statt NTC?Wenn das die Lösung ist, möchte ich mein Problem wieder haben.
-
-
Wenns ein 10k NTC ist muß Zeile 42 angepasst werden :
Const R_0 = 10000
Soweit ich mich erinnere ist Avralfreds Anschluß nötig. Falls er zwingend an 5V hängen muß kann die Widerstandsberechnung angepasst werden. (Zeile 85 weglassen) -
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
- 'Programm zum Ansteuern des Arduino Uno mit DF ROBOT LCD Keypad Shield
- 'Erweitert um NTC 10 KOhm Sensor.
- '---------- Atmega -----------------------------------------------------
- 'Controller: Original ATMega2560
- 'Quarz: 16MHz
- '---------- LCD -----------------------------------------------------
- 'Belegung LCD:
- 'Backlight - PB2
- 'DB4 - PD4
- 'DB5 - PD5
- 'DB6 - PD6
- 'DB7 - PD7
- 'RS - PB0
- 'E - PB1
- '---------- Tastatur -----------------------------------------------------
- 'Belegung Tasten:
- 'Über Widerstandsnetzwerk an PC0 (ADC0)
- 'keine Taste gedrückt: 1023 - Abfrage auf ADC > 1000
- 'Select: 739 - Abfrage auf ADC < 790
- 'Links: 503 - Abfrage auf ADC < 555
- 'Unten: 327 - Abfrage auf ADC < 380
- 'Oben: 143 - Abfrage auf ADC < 195
- 'Rechtst: 0 - Abfrage auf ADC < 50
- '---------- NTC -----------------------------------------------------
- 'Temperatur Messung:
- 'NTC 10K an PC1 (ADC1)
- 'NTC ueber 10K Wiederstand an GND
- ' VCC--10k---|-----NTC-----GND
- ' |
- ' PC1
- 'V_a Spannung am Messeingang
- 'T_0 Nenntemperatur des NTC-Widerstands in K
- 'R_0 Nennwiderstand des NTC-Sensors in Ohm
- 'B Materialkonstante B
- 'Rv Vorwiderstand in Ohm
- 'Rn Widerstand des NTC-Sensors temperaturabhängig
- '---------- Konfiguration Atmega -----------------------------------------------------
- $regfile = "m328pdef.dat"
- $crystal = 16000000
- $hwstack = 100
- $swstack = 100
- $framesize = 100
- '---------- LCD -----------------------------------------------------
- Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , _
- Db7 = Portd.7 , E = Portb.1 , Rs = Portb.0
- Config Lcd = 16 * 2
- Cursor Off Noblink
- Cls
- '---------- ADC Port C --------------------------------------------------------
- Config Adc = Single , Prescaler = Auto , Reference = Avcc
- Start Adc
- '---------- Beleuchtung LCD ---------------------------------------------------
- Config Portb.2 = Output 'PinB.2 als Ausgang für das LCD Backlight
- PortB.2 = 1
- '---------- Variablen -----------------------------------------------------
- Dim Wert_von_tastatur As Word 'aktueller ADC-Wert
- Dim Wert_von_NTC As Word 'aktueller ADC-Wert
- Dim Rn As Single , Merke_1 As Single , Temp As Single
- '---------- Konstanten --------------------------------------------------------
- Const Rv = 10000
- Const R_0 = 10000
- Const B = 3900 '3528
- '---------- Hauptprogramm -----------------------------------------------------
- do
- Wert_von_NTC = Getadc(1) 'adc-Wert einlesen
- Wert_von_tastatur = Getadc(0) 'adc-Wert einlesen
- locate 1,1
- lcd "ADC0"
- locate 1,10
- lcd "ADC1"
- Gosub Berechnung
- locate 2,10 'Ausgabe Wert ADC 1
- lcd "" ; Temp
- locate 2,1 'Ausgabe Wert ADC 0
- lcd Wert_von_tastatur ;"
- 'locate 2,10 'Ausgabe Wert ADC 1
- 'lcd Wert_von_NTC ;"
- waitms 600
- locate 2,1
- lcd " "
- loop
- end
- '---------- Sub Berechnung -----------------------------------------------------
- Berechnung:
- Temp = Wert_von_NTC * Rv
- ' Wert_von_NTC = 1024 - Wert_von_NTC
- Temp = Temp / Wert_von_NTC
- Temp = Temp / R_0
- Temp = Log(temp)
- Temp = Temp * 298
- Temp = Temp + B
- Temp = B / Temp
- Temp = Temp * 298
- Temp = Temp - 273
- return
-
Hast Du eventuell für den ADC-Port einen Pull-up Widerstand eingeschaltet, dann teilt der sich nämlich mit den Teilerwiderstand und ergibt einen festen Wert (incl. geringer Schwankung) am Eingang.
Gruß HaraldWem ich nicht ausdrücklich widerspreche, der darf das bis auf Widerruf als "Gefällt mir" verstehen. -
Laut Simulator funktioniert die Berechnung mit der eingefügten Zeile 2:
- Temp = Wert_von_NTC * Rv
- Wert_von_NTC = 1024 - Wert_von_NTC
- Temp = Temp / Wert_von_NTC
- Temp = Temp / R_0
- Temp = Log(temp)
- Temp = Temp * 298
- Temp = Temp + B
- Temp = B / Temp
- Temp = Temp * 298
- Temp = Temp - 273
Zu
Wert_von_tastatur = Getadc(0)
musst du mal deine Verkabelung prüfen - Temp = Wert_von_NTC * Rv
-
Aufbau ist genau nach dem BILD aufgebaut.
Zeigt mir jetzt aktuell 22.1770 ist aber trotzdem mehr als wirklich ist. Sind vllt 20 oder eher drunter gerade.
Aber der Wert geht hoch wenn ich ihn in die Hand nehme.
Kompletter Code ist oben ja zu sehen. Mehr gibt es nicht. -
Wert_von_tastatur = Getadc(0)
du wolltest doch auch den adc-Wert von der Tastatur sehen. Wo ist ADC(0) verkabelt??? -
Mit dem ADC (0) Also Tastatur klappt alles. da seh ich den Wert 1017 und bei Tastendruck verändert er sich .
ADC (0) ist auf dem LCD Shield fest verbaut.
Ist dieses hier:
dfrobot.com/product-51.html
Und warum der NTC 10k :
Es kommen später 3 dieser Sensoren zum EinsatzDieser Beitrag wurde bereits 1 mal editiert, zuletzt von Lordcyber ()
-
Lordcyber schrieb:
Aber der Wert geht hoch wenn ich ihn in die Hand nehme.
Vermutlich ist nur der B-Wert falsch. Weiter vorn steht ein Code den b-Wert zu erfassen. -
Ich würde sagen Plausibel Hoch.
-
Lordcyber schrieb:
Zeigt mir jetzt aktuell 22.1770 ist aber trotzdem mehr als wirklich ist. Sind vllt 20 oder eher drunter gerade.
Wenn das die Lösung ist, möchte ich mein Problem wieder haben. -
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. -
Durch diese Schaltung ist der NTC aber immer unter Power
Also hier dann die Versorgung über VCC etvl. nur vor dem dem Messvorgang einschalten und anschließend wieder ausschalten... -
Dann nimm statt VCC einen output-pin.Raum für Notizen
-----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------- -
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ß HaraldWem 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