Temperaturmessung mit PT1000 und AVR

    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!

    • Temperaturmessung mit PT1000 und AVR

      Ich möchte mit PT1000-Temperatursensoren am AVR experimentieren.
      Eine Frage an die ARDUINO/C- Experten: Kann mir jemand von euch dieses C-Kauderwelsch im Link:mikrocontroller.net/attachment/highlight/242914 in lesbare Form bringen, also in BASCOM übertragen? Bin nur an der Berechnung (mit linearer Interpolation) interessiert, nicht an der seriellen Ausgabe.

      Danke
      Chris
    • Im Prinzip lesen die nur den ADC-Wert ein, an dem der PTC hängt.
      Der Wert wird dann in den Widerstand umgerechnet in Bezug auf den Vorwiderstand und Referenzspannung.

      Dann wird in der Tabelle geschaut, zu welchen Widerstands-Werten der gemessne Wert passt.
      Man wählt also aus der Tabelle den kleineren und den größeren Widerstand.
      In der 2. Tabelle stehen die Temperaturen zu den Widerstandswerten.

      In dem C-Code sind da Arrays verwendet worden.
      Kannst du auch machen oder du nimmst Data-Zeilen mit Lookup.

      Über Dreisatz (Interpolation) kannst du nun die Temperatur bestimmen.

      Übrigens stehen die Widerstands-Werte mit den zugehörigen Temperaturen im Datenblatt.

      Schaffst du das?
    • Mitch64 schrieb:

      In dem C-Code sind da Arrays verwendet worden.
      Kannst du auch machen oder du nimmst Data-Zeilen mit Lookup.

      Über Dreisatz (Interpolation) kannst du nun die Temperatur bestimmen.

      Übrigens stehen die Widerstands-Werte mit den zugehörigen Temperaturen im Datenblatt.

      Schaffst du das?
      Hallo Mitch64, mit dir habe ich eigentlich gerechnet, da du auch ARDUINO programmierst. ;)
      Kannst du mir ein paar Zeilen als Gedankenstütze dazu schreiben..wäre super. :)
      Mal sehen ob ich dann damit klar komme.
    • Pluto25 schrieb:

      Sehr viel Aufwand für ein ungenaues Ergebnis. Die Ausgangsspannung an einem Pin ist Vcc- irgendwas (Stark Strom und Temperaturabhängig.) Es geht auch ohne single- Berechnung. Bei Vcc 5V, uref (mit Spindelpoti ) 2,72V, 4k7 von Vcc zum Eingang und PT1000 nach Gnd. Temperatur = ADC - 330.
      Der Hardwareaufwand ist minimal. Benötigt nur einen möglichst genauen(!) Referenzwiderstand(0,1% oder noch besser). Die Messung erfolgt nach der ratiometrischen Messverfahren (Vergleichende Messung) und soll recht genau (abhängig von der Genauigkeit des Referenzwiderstandes und der Auflösung des ADC sein. Genau das wollte ich eben mal testen, wober der 10bit-ADC des Atmega Grenzen setzt
    • Erst mal den ADC konfigurieren auf Reference=AVCC
      Spoiler anzeigen
      Config ADC = Single , Prescaler = Auto , Reference = AVCC


      Dann wird vom ADC-Eingang der PTC auf AVCC-Pin vom Controller geschaltet.
      Dann ein Referenzwiderstand z.B. 1000 Ohm vom ADC-Eingang gegen GND.

      So hast du erst mal einen Spannungsteiler.

      Dann Messen

      ADCWert=GetADC(0)

      Der ADCWert entspricht dem Spannungsabfall am Referenzwiderstand.

      Dann kannst du nach folgender Grundformel den PTC-Widerstand berechnen:

      Quellcode

      1. ' Grund-Formel:
      2. ' R(PTC) 1023-ADCWert
      3. ' ------ = ------------
      4. ' R1000 ADC-Wert





      Wenn man die Formel Umstellt, erhält man diese Formel:

      Quellcode

      1. ' (1023 - ADCWert) * R1000
      2. ' R(PTC) = ----------------------------
      3. ' ADCWert


      Da sich die Spannungen sowie die Widerstände zum ADC-Wert proportional verhalten, braucht man nicht über den Umweg der Spannung gehen, um den Widerstand zu erhalten.

      Wenn du dann den Widerstand hast, in der Tabelle schauen, zwischen welchen Widerstandswerte der vom PTC liegt.

      So kommst du auf die Temperatur-Werte zwischen denen deiner liegt.

      Dann nochmal Dreisatz.

      Klar?
    • So, hab die Sache getestet:
      Als erstes habe ich die Schaltung so ausgelegt, dass der Sensor gegen Gnd geschaltet ist. Die Formel entsprechend umgestellt.
      Die Versorgung des Widerstandsteiler per geschalteter Vcc: VCC einschalten...1ms warten zum stabilisieren...ADC-Wandlung...VCC wieder ausschalten. Damit bleibt die Eigenerwärmung vernachlässigbar. Bei der Berechnung darf man auch nicht vom Wert 1023 für die Referenzspannung ausgehen sondern diese messen und als Konstante verwenden (bei mir 1012).
      Ergebnis: Stabil , aber... nur zwischewn 0 und 100Grad zu gebauchen. Dort ist die Auflösung etwa 1Grad. Für einfache Anwendungen genügt das sicherlich und ist gemessen am Aufwand akzeptabel.
      Dazu muß das Rechenergebnis nur per PT-Faktor ((R1000-Rpt)/3.85) berechnet werden, ist in dem kleinen Bereich genau genug.
      Das Hauptmanko ist die mickrige Auflösung des internen ADC von nur 10bit. Wer mehr Temperaturuflösung will, braucht einen externen ADC von mindesten(!) 12bit. Der MCP3551(Reichelt) mit seinen 22bit ist dafür fast ideal.
      Was mir aufgefallen ist: Es ist faszinierend wie elegant man Berechnungen in C in eine einziger Zeile packen kann.
      Warum geht das nicht in Bascom (Klammern, Punkt- vor Strichrechnungen usw). In Bascom ist man gezwungen die Formeln zu zerplücken und dazu noch Hilfs- (Merk-)Variablen anzulegen. Pro Komandozeile nur eine Rechenvorgang, basta. Man könnte auf C richtig neidisch werden ;(
      Noch was wichtiges ist mir aufgefallen: Wieso akzeptiert meine Bascom-IDE keine Binnengroßschreibung?
      Ich habe @mich64's Statemachine in meine iDE kopiert um damit zu experimentieren und was sehe ich: Dort bleibt die Binnengroßschreibung erhalten ?(
      Was muss ich wo einstellen das das immer so ist und ich nicht ständig per Unterstrich die Worte trennen muss. Meine IDE bügelt sonst alles glatt.
      z.B. FlagTick und nicht Flag_tick
    • Wieviel wird von der Auflösung verschenkt? Wenn du deinen Spannungsteiler nicht an gnd hängst, sondern an eine negative Spannung zu gnd, wäre es dann besser? Die müsste garnicht so stabil sein. Man könnte doch mit einem weiteren R von einem weiteren geschalteten pin zum Referenzwiderstand gehen und vor jeder Temperaturmessung die Mittelanzapfung des Stannungsteilers messen. Äh, kommt jetzt auf den Temperaturkoeffizienten an, wenn mit zunehmender Temperatur größerer R, dann halt eine höhere Spannung, als Vref vom Adwandler.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • oscar schrieb:

      Was muss ich wo einstellen das das immer so ist und ich nicht ständig per Unterstrich die Worte trennen muss.
      Nimm einfach das Häckchen bei "Reformat code" raus.
      Vielleicht auch noch das Häckchen bei "Reformat BAS file", da sonst neu geöffnete Dateien auch wieder neu formatiert werden.

      Bascom-Optionen.jpg

      Allerdings bleiben dann alle "Wörter" so stehen, wie du sie geschrieben hast.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Hallo Oscar

      oscar schrieb:

      Das Hauptmanko ist die mickrige Auflösung des internen ADC von nur 10bit.
      Die 10 Bit Auflösung des AD-Wandlers alleine ist nicht schuld. Es hängt auch davon ab, ob der gesamte Bereich des AD's verwendet wird. Wenn du 0°C bei AD-Wert 0 hast und 100°C bei AD-Wert 1000, damm misst du mit 0.1Kelvin Auflösung. Bei dem Spannungsteiler hast du aber z.B. bei Raumtemperatur schon AD-Wert 300 und bei 100°C AD-Wert 700. Du hast in dem Beispiel 400 AD-Abstufungen auf 80 Kelvin. Da wird die Auflösung der Temperatur natürlich weniger.

      Du kannst mit einem OP die Spannung verstärken und das Potenzial bei der unteren Temperaturgrenze absenken. Dann würde das wieder gehen. Du kannst ja mal gegenrechnen, welche Spannungen mei max und min. Temperatur am AD-Wandler ankommen, und was das für AD-Werte ergeben würde. Und so kannst du die Auflösung abschätzen, bevor du einen AD-Wandler kaufst.

      oscar schrieb:

      Warum geht das nicht in Bascom (Klammern, Punkt- vor Strichrechnungen usw).
      Das liegt eigentlich nicht am Basic, sondern am Compiler. Es gibt andere Basic-Dialekte, die können das.
      Vielleicht erbarmt sich der Mark mal und überarbeitet seinen Compiler dahingehend. Ich habe das auch schon verflucht. Das ist einer der Gründe, warum ich mich mehr und mehr mit C/C++ beschäftige.

      oscar schrieb:

      Ich habe @mich64's Statemachine in meine IDE kopiert um damit zu experimentieren und was sehe ich: Dort bleibt die Binnengroßschreibung erhalten
      Das kannst du in der IDE einstellen
      Menü -> optionen -> Environment -> Editor
      Haken setzen bei "Don't change cases"
      Haken bei "Reformat Bas files" weg und
      Haken rein bei "Reformat code"

      Dann sollte das gehen.

      Hoffe die Info hilft dir weiter.
    • Mitch64 schrieb:

      Die 10 Bit Auflösung des AD-Wandlers alleine ist nicht schuld. Es hängt auch davon ab, ob der gesamte Bereich des AD's verwendet wird.
      In dem Vergleichsverfahren ist verfahrensbedingt nur ein Teil des Auflösungsbereichs nutzbar, daher sind hier höherauflösende ADC von Vorteil.

      Mitch64 schrieb:

      Du kannst mit einem OP die Spannung verstärken
      Ja und dann muß kalibriert werden! Wenn ich nur an solche Sachen wie Offset, Bias und Drift und deren Temperaturabhängigkeit denke, kann ich gleich zu fertigen kalibrierten Messvorsätzen(ASIC) greifen und fertig.
      Mir ging es lediglich darum zu testen was mit so einer einfachen,kalibrierfreien Messschaltung machbar ist. Wie gesagt für einfache Anwendungen genügt das auch. Machen kann man viel ( ), es kommt immer drauf an mit was für einem Aufwand man was erreichen will.
      Platin-Temperatursensoren haben den großen Vorteil dass es sie in vielen Bauformen gibt, sie leicht austauschbar sind und international genormt sind.
      Ansonsten: Bei gleichem kalibrierfreien Messverfahren und hochauflosenden ADC ist man besser dran als mit den 10bit des AVR
      Genau dies hat auch der Autor des Microcontroller.net-Beitrages resümiert.
      Der MAX11616 hat sogar einen 12fach Eingangsmultiplexer (hat aber nur 12bit Auflösung)und I2c-Interface, damit kann man den PT1000 Bereich besser abdecken.

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