Forum: Mikrocontroller und Digitale Elektronik AVR Widerstand messen, aber ungenau


von Wisler E. (wisler) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo,

ich möchte gerne mit einem AtMega32 einen Widerstand messen. Dazu 
verwende ich die Schaltung aus dem Anhang. Und folgende Formel:

Uv = Spannung über dem Festwiderstand
Rv = Vorwiderstand (18,03kOhm)
Rf = NTC Fühler von Junkers ( Hatte ich grad da zum ausprobieren, die 
Kennlinie habe ich aus Anleitung von meinem Gasgerät entnommen. Und mit 
zwei Funktion mit einem Logarithmus angenähert.)
Uq = Versorgungsspannung der Spannungsteilers

Da ich irgendwie nie den richtigen Widerstandswert der Fühlers bestimmen 
konnte, habe ich ihn durch einen Festwiderstand ausgetauscht und mal 
probeweise angeschlossen. Dann ist mir aufgefallen, dass der Wert schon 
sehr abweicht. Mit Multimeter gemessen 3,28kOhm und errechnet 2,896kOhm. 
Dann habe ich mal Spannungen mit meinem Multimeter gemessen und geprüft 
ob die gemessenen ADC Werte stimmen.
Diese sind bei dem Vorwiderstand 4,26V und bei dem Festwiderstand 0,66V. 
Das stimmt auch mit dem gemessen ADC Wert überein. Der Atmega zeigt mir 
auf meinem Display 4,253V an.
Das sind die Werte, die ich erhalte wenn ich die Schaltung mit dem ADC0 
Pin verbinde.
Wenn ich die Schaltung mit dem Multimeter durchmesse ohne den ADC0 Pin 
zu verbinden, dann bekomme ich ganz andere Werte. Vorwiderstand 4,16V 
und Festwiderstand 0,75V. Was eher hinkommt um den Festwiderstand 
rechnerisch zu bestimmen.

Ich möchte dann später die Temperatur mit dem NTC messen. Die C - 
Funktionen funktionieren eigentlich gut, nur dass der errechnete 
Widerstand des Fühlers immer etwas daneben liegt.
Den Logarithmus habe ich übder die math.h eingebunden. Später möchte ich 
lieber ein Polynom 3.- Grades verwenden. Warscheinlich brauche ich aber 
mehrere da der Fühler einen Widerstandsbereich von 150000 Ohm und 461 
Ohm hat. Ein sehr großer Bereich finde ich.
Ich kann dann Temperaturen von -20°C bis 140°C damit messen.

Nun zu meinen Fragen:

1. Ich würde den Vorwiderstand für den Fühler so bestimmen
Passt das so?

2. Muss ich irgendwie einen Widerstand mit in meine Gleichung einbauen, 
der vom ADC kommt? Wenn ja wie mache ich das? Ich habe dazu noch nichts 
im Internet gefunden. Man sieht ja schon, dass irgendwie die 
Verhältnisse durch den ADC Pin verändert werden.

3. Ich habe den Fühler mal bei 20°C also Zimmertemperatur gemessen. Da 
hat er einen Wert von 21,3kOhm, aber laut dem Datenblatt von Junkers 
müsste er 25,03kOhm haben. Das wäre eine Abweichung von 14,9%. Reicht es 
da aus, wenn ich immer den Widerstandswert des Fühlers mit 1,149 
mulipliziere um den Fehler wieder wegzumachen oder sind die Abweichungen 
bei verschiedenen Temperaturen unterschiedlich?

4. Wie macht ihr sowas? Bin ich da auf dem richtigen Weg?



Ich hoffe ihr versteht was ich vorhabe. Falls nicht schreibe ich gerne 
noch mehr. Ich wollte jetzt diesen Eintrag nicht noch länger machen.

Schon mal vielen Dank für eure Hilfe im vorraus.

von Ulrich (Gast)


Lesenswert?

Der ADC Eingang sollte keine so große Rückwirkung auf die zu messende 
Spannung haben. Wenn man immer nur den einen Kanal mißt, sollte der 
Einganswiderstand über 10 MOhm liegen, also eher höher als die meisten 
Multimeter. Wenn man im Wechel GND und einen Kanal mißt, kann der 
Einagnsgwiderstand bis auch etwa 2 MOhm runter gehen (eine 
Eingangskondensator wird dauernd umgeladen).

Der gemessende Effekt paßt etwas dazu, das noch der Pullup-Widerstand 
ein AD-Eingang aktiv ist.

Die Formel für den passenden Vorwiderstand ist nur eine Grobe Näherung. 
Man sollte aber noch testen ab es dann an den Bereichsenden noch 
funtioniert. Bei 150 K als Sensor und 75 K vorwiederstand ist das keine 
Problem. Bei 500 Ohm für den Sensor kreigt man aber kaum was braichbares 
raus. Das ist nur etwa 1/150 der Spannung am Sensor und da lassen sich 
dann nur noch grobe Änderungen auflösen. Also sollte der Widerstand 
kleiner.

Eher schon Rv = sqrt(Rmin*rmax) - im Kopf überschlagen rund 10 K Ohm. 
Bei 150 K am Sensor ist das dann 1/15 der Spannung am Vorwiderstand, das 
geht noch. Und bei 500 Ohm am Sensor hat man noch etwa 1/20 der Spannug 
am Sensor, das reicht auch noch. Viel besser geht es halt über den 
großen Bereich auch nicht.

von Wisler E. (wisler) Benutzerseite


Angehängte Dateien:

Lesenswert?

Danke schonmal für deine Hilfe. Wie meinst du das mit dem AD Pullup 
Widerstand? Das ist doch wenn ich etwas in PINA hineinschreibe oder?
Das mit den 500ohm habe ich mir schon fast gedacht, dass hier nichts 
brauchbares rauskommt.

von Ulrich (Gast)


Lesenswert?

Im Code kann ich nichts finden wo Porta oder Pina beschrieben wird. Von 
daher sollten die Pullups aus sein, es sein denn da ist rgendwo was in 
den LCD routinen.

Zur Sicherheit sollte man noch die Digitalen Eingänge deaktivieren, auch 
wenn die Störungen dadurch meist kleiner sein werden.


Es könnte noch sein, dass man sich so viel Störungen einfängt, dass die 
Schutzdioden teilweise leiten.

von Wisler E. (wisler) Benutzerseite


Lesenswert?

Es könnte sein, dass die LCD Lib von Peter Fluery den Pullup 
einschaltet. Ist dir so etwas bekannt?

Wie meinst du das mit Digitaleingänge deaktivieren. Welches Register 
muss ich dazu beschreiben?

von Anja (Gast)


Lesenswert?

Hallo,

Für die exakte Funktion zum Umrechnen solltest Du dir mal ein 
NTC-Datenblatt anschauen:

http://www.vishay.com/docs/29049/23816403.pdf

Bei einem 10-Bit A/D-Wandler wird man eher eine Kennlinie mit 25-50 
Stützstellen verwenden um abschnittweise die gemessene Spannung nach 
Temperatur direkt zu linearisieren. Der Widerstandswert interessiert 
dich hoffentlich nicht wirklich. Der Aufwand mit Floating Point und 
Logarithmus ist bei 10 Bit übertrieben.
Je nach Vorwiderstand und Sensor kommmt sowieso noch 1-3 Grad 
Selbsterwärmung durch den Meßstrom hinzu. (Bei Wind wird es dann 
plötzlich kälter).

zu 1. Wie schon Ulrich gesagt hat Wurzel aus Produkt von Min und Max ist 
der richtige Ansatz. Wobei Du über den Temperaturbereich nachdenken 
solltest der dich wirklich interessiert. Wenn Du dann z.B. Min und 
Maxwert von 0 bis 40 Grad einsetzt wird es in diesem Bereich 
möglicherweise etwas genauer.

zu 2. meß doch mal den Strom den der offene Eingang des ADC gegen Masse 
bereitstellt. Wenn das zu etwa 20 kOhm Pull up im Prozessor paßt sind 
die Pullups noch eingeschaltet.

zu 3. Bei NTCs zur Temperaturmessung sollte der Fehler kleiner 5% sein. 
Im allgemeinen werden sogar enger tolerierte Widerstände bis 1% 
verwendet. Bei 15% gemessener Abweichung ist irgendwas an der Messung 
faul. Vielleicht Selbsterwärmung durch den Meßstrom des DMMs was auch zu 
dem zu niedrigen Wert paßt.

zu 4. Ich verwende NTCs nur in einem kleinen Temperaturbereich (10-40 
Grad). Da reicht eine Kennlinie mit 2 kalibrierten Stützstellen für die 
Linearisierung und maximal 0,3 Grad Fehler aus. Für Größere Bereiche 
würde ich die Kennlinie aus dem Datenblatt verwenden und die Abweichung 
ignorieren.

Eventuell solltes Du darüber nachdenken den NTC und den Widerstand zu 
tauschen. Über einen kleinen FET (3-6 Ohm) oder einen Port-Pin (ca 50 
Ohm?) könntest Du dann den Pull-up nur dann einschalten wenn tatsächlich 
gerade mit dem ADC gemessen wird um die Selbsterwärmung und den 
Stomverbrauch zu minimieren.
Alternativ kannst Du natürlich auch den ADC-Eingang als Ausgang 
konfigurieren und in den Meßpausen den NTC quasi kurzschließen.
(Spannung am NTC in den Meßpausen = 0V)

Gruß Anja

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.