Widerstandsmessung über Spannungsteilerverhältnisse
Hallo,
ich möchte ganz ohne weitere Bauteile einen Widerstand mit einem Mikrocontroller messen.
Der Mikrocontroller verfügt über einen eingebauten Referenzspannungsgenerator der aus einer Kette von Widerständen besteht. Den kann ich auf einen Portpin schalten, da den Widerstand anlegen und die Spannung am Portpin messen.
Jetzt möchte ich den Wert des Widerstandes in Ohm herausfinden in dem ich bei verschiedenen Einstellungen der Referenzspannungsquelle die Spannung am Portpin messe.
In dem µC sind 8R, dann 16x R und zum abschluß wieder 8R drin wobei der letzte R überbrückt werden kann. Ich kann auf einen der 16 Punkte zwischen den R umschalten. Die R sind laut Hersteller alle identisch, R an sich ist aber unbekannt was daran liegt, dass die Laserabgeglichen werden um die alle gleich zu machen, dafür haben die dann von IC zu IC verschiedene Werte. Das reicht um die Referenzspannung sehr genau schalten zu können, dafür ist R eben unbekannt.
Jetzt möchte ich in dem Programm den gesuchten, außen angeschlossenen Widerstand berechnen in dem ich die Widerstandskette umschalte und bei verschiedenen einstellungen die Spannung am gesucten Widerstand messe.
VCC
+
|
|
.-.
| | 8R
| |
'-'
|
|
.-.
| |
| | R
'-'
| .------.
o-----------------o |
| 1 | |
.-. | |
| | | |
| | R | |
'-' | |
| 2 | |
o-----------------o |
………………………………………………|…………………………………………
o-----------------o |
| 14 | |
.-. | |
| | | o---o---|
| | R | | |
'-' | | |
| 15 | | .-.
o-----------------o | | |
| | | | |
.-. | | '-'
| | | | |
| | R | | |
'-' | | ===
| 16 | | GND
o--------o--------o |
| | '------' R unbekannt
.-. |
| | 8R o |
| | |=|
'-' o |
| |
| |
=== ===
GND GND
Ich hatte da schon mit Formeln hantiert und ein Programm geschrieben, da kommt aber "alles und nichts" bei raus, die Ergebnisse sind völlig unbrauchbar. Vermutlich wie die Formel zu kompliziert ist und die Rundungsfehler extrem werden.
Hat einer eine Idee wie man das in einfachen Formeln und/oder Programmschritten (ich benutze hier C) möglichst ohne Fließkomma und mit wenigen Multiplikationen und divisionen hin kriegt?
4 Antworten
Das ist etwas seltsam was du da beschreibst.. Um welchen Mikrocontroller handelt es sich denn?
Deine Zeichnung zeigt einen 4 Bit D/A Wandler zwischen 1/4 Vcc und 3/4 Vcc.
Diese Spannung jetzt an den externen unbekannten Widerstand zu leiten bringt nix.
Normalerweise haben Mikrocontroller "Komparatoreingänge" A und B.
Du kannst jetzt A an die D/A Wandler hängen und Rx an eine Konstantstromquelle von etwa 5V / Rx hängen. Das bringt eher gar nichts, da Du den Bereich kennen musst.
Üblicherweise verwendet man dann eine "Bereichsumschaltung": Du speist den unbekannten Widerstand der Reihe nach mit MIkrocontrollerausgängen, an denen jeweils 1M, 100k, 10k, 1k,. Für kleinere Widerstände musst Du einen Impedanzwandler nachschalten, etwa einen FET...
Der "normale" Weg besteht darin, einen Kondensator zu spendieren, und die Lade- und Entladezeit über den unbekannten Widerstand zu messen. Ziemlich simpel..
Der Kondensator muss natürlich kalibriert werden (ist +/- 10% ungenau, wenigstens...)
Einen Kondensator kann ich bereits über diese Cref Kette durch umschalten und messen der Zeiten sehr exakt bestimmen,
Das klingt interessant... Welche Zeit misst du? Bis ein Pin ein High erkennt? Das würde ich gerne mal nachbauen.
Edgar
Ich schalte einfach die Cref Kette um.
Die Formel wie lange es dauert bis ein Kondensator eine Spannung erreicht hat ist:
t=-R*C * ln(1-Uss/Uref)
Und Uss/Uref ist genau das Verhältnis was man am Referenzspannungsgenerator in form von x/24 einstellen kann. Damit wird der Teil mit dem Logaritmus völlig unabhängig von der Betriebsspannung und kann im Programm durch ein Array aus Konstanten vorbereitet werden die man mit Excel oder dem Taschenrechner erzeugt hat. Der µC braucht da nicht mit rechnen!
Der ADC, der ebenfalls nur das Verhältnis der angelegten Spannung zur Betriebsspannung misst kann dannn überwachen wie lange es dauert bis die SPannung im Kondensator eine Spannung zwischen Cref alt und Cref neu erreicht hat. Ich benutze hier die Hälfte. Der ADC hämmert seine Werte im 37µs Takt raus, ist also schnell genug, der vom QUarz angetriebene Timer1 misst dann die Zeiten und wird durch eine Schleife die den ADC auswertet gestartet und gestoppt. Die Unschärbe beträgt selbst in C geschrieben nur 3µs bei einem 4,0000MHz Quarz.
Wegen dem R das erst mal übrig bleibt:
Stellst Du die Formel nach C um und setzt die zwei mal ineinander ein mit unterschiedlichen Cref Teilungsverhältnissen, kannst Du R ebenfalls wegkürzen, also ist es egal wie groß die einzelnen Rs im µC sind, hauptsache die sind alle gleich groß!
Leider habe ich keine funktionierenden Formeln parat, die die ich aufgestellt habe sind verkehrt, aber anhand der Ergebnisse konnte ich das Programm richtig stellen.
Wenn es Dir gelingt, die richtigen Formeln auszuknobeln wäre schön, ich habe da versagt und kann den Fehler nicht finden, erzeuge ich die Formeln aus dem Programm, passen die seltsammerweise nicht mehr, da kommt dann so was wie R/R=4 raus!
Ups, Udd/Uref ist richtig, mit Masse funktioniert das nicht :D
Hier ist ein ähnliches Projekt was vieles Erklärt was man um C messen zu können braucht:
http://elm-chan.org/works/cmc/report.html
Bei mir kommen aber keine externen Bauteile zum Einsatz, der Ladewiderstand ist die Cref Widerstandskette im µC und die genauigkeit der Ganzen Sache basiert rein auf der genauigkeit des Quarzes und wie genau die einzel Rs im µC sind - und die sind "verdammt" genau, bleibt nur der Quarz als Tolleranzquelle und die Fähigkeiten des Programms (Unschärfe in der Zeitmessung durch aktivieren der Register nacheinander und ADC Messzeit, das lässt sich aber zum großteil per Software beheben) und natürlich der Genauigkeit der Variablen, ich habe hier Integer verwendet und "mache das Komma selber" so dass keine Rundungsfehler entstehen die sichtbar werden!
Gerade bastel ich noch an einem LC DIsplay, ich erstelle gerade einen Zeichensatz für riesige Zeichen, so ähnlich wie hier:
https://www.mikroe.com/forum/viewtopic.php?f=13&t=32369
Aber auch mit Buchstaben und den vielen anderen Zeichen die man oft braucht wie µ, Ω, p usw.
Ich bastel auch gerade an einem LCD :D, jedoch habe ich das nur aus dieser schebigen Hülle namens "Radio" befreit, eine Schande ein 2 x 16 Industriestandard-LCD so zu verunschandeln... Und dann auch noch eines in negativ...
Das mit dem Kondensator werde ich mal probieren, sobald ich Zeit habe(ich habe eindeutig zu viele Projekte nebeneinander [VFD-Uhr, Universalfernbedienung] ...und dabei kann ich noch nicht mal wirklich gut C...)
Danke dir,
Edgar
Hallo Leute,
ich fange noch mal von vorne an, weil meine erste Antwort schon zu viel Kommentar-Ebenen enthält.
Das R-Netzwerk erzeugt genau 16 verschiedene Werte. Mit einem Komparator kann man dadurch 16 verschiedene Dinge unterscheiden. Das ist keine gute Auflösung...
Natürlich kann man damit eine Kapazität bestimmen. EIn A/D-Wandler wird dazu auch nicht benötigt, sondern nur ein Komparatoreingang.
Ich bezweifle allerdings, dass der Innenwiderstand des "Spannungs"-Pins etwas mit den R-Werten zu tun hat, aus vielerlei Gründen muss der gepuffert sein! Du benutzt also diesen Innenwiderstand bei den Messungen.
Ein C lässt sich messen (über eine quasi-analoge Zeitmessung), weil Du da das RC Glied in natürlicher Weise hast.
Wenn Du einen externen Rx hast, dann fehlt Dir ein "internes" C.
Du kannst es mit der parasitären Kapazität der Pins versuchen (5-10 pF), aber da wirken dann schon die Kontaktierungen des Widerstands in der gleichen Größenordnung.
Kurs gesagt, es KANN NICHT gehen ohne ein weiteres Bauelement.
Ach ne und warum nicht?
Ich will ja keine Zeiten messen, warum auch?
Ich schalte mir hier einen "Belasteten Spannungsteiler" aus dem Cref Generator und einem externen Widerstand zusammen. Gepuffert ist da nix, wozu auch? Jetzt kann ich das Teilungsverhältnis verstellen und die Ausgangsspannung des Spannungsteilers messen.
Damit müsste alles vorhanden sein um die Unbekannte, also den angeschlossenen Widerstand auszurechnen.
Bei der Kondensatormessung habe ich schon erfolgreich alle internen Rs weggekürzt und behielt einzig und alleine die Umladezeit, das Verhältnis der internen Rs und eben die gesuchte Kapazität als Variablen. Das Spannungsteilerverhälnis kann ich selbst bestimmen, die Zeit messen und dann das C ausrechnen.
EIn A/D-Wandler wird dazu auch nicht benötigt, sondern nur ein Komparatoreingang.
Klar, normal macht man das mit einem externen RC GLied und dem eingenauten Komparator der den Timer steuert. Aber hier habe ich nur ein einziges R oder C und missbrauche die eingebaute Referenzspannungsquelle so dass der eingebaute Komparator nur noch dann funktionieren kann, wenn ich dem eine externe Referenzspannung gebe - und das wäre wieder mehr externer Aufwand.
Ziel ist es eben nur ein Bauteil an den nackten µC anzuschließen und der misst das dann mit den Fähigkeiten seiner Eingeweide durch. Es geht nicht darum dass ich zu geizig bin einen zweiten WIderstand einszusetzen, mich fasziniert hier die Herausforderung und die habe ich für einen Kondensator "ohne alles" schon gemeistert. Leeren Kondensator (<5V geladen) an den Portpin und der µC knobelt ohne die Hilfe eines einzigen weiteren Bauteils (außer Quarz) den Wert aus.
Mir ist sogar gelungen mit einem PIC einen DCF77 Funkuhrempfänger mit einem PIC und drei weiteren Bauteilen zu bauen - nur der absolute Verkaufsschlager wird das nicht sofern man die 20m lange Antenne die dazugehört nicht als Wäscheleine anpreist.
Lieber Commodore64, nimm meine Nörgeleien bitte nicht krumm. Du machst da gute Sachen mit Deinem Mikrocontroller, die eigentlich alle "Bastler" seit 20 Jahren (damals gab es die ersten günstigen PICs und den ATmega8 ) machen. Das nennt man Hobby :-)
Aber was Du da mit Deinem "R" vorhast geht nicht, weil es auf einigen Missverständnissen beruht.
Wieviele solche Geräte möchtest du bauen? Wenn es ein Gerät ist dann schlage ich vor du bestimmst mit Hilfe eines bekannten externen Widerstandes den unbekannten inneren, dann wird die Rechenaufgabe ganz einfach. Baust du mehrere Geräte dann würde ich den Widerstand als Variable einfügen und pro Seriennummer dann den Wert mitgeben. Sonst gibt es fürchterliche Rechenaufgaben. Du brauchst dann ein Programm das aus 2 unterschiedlichen Messungen die je nach Einstellung (1-16) und eventuell gedrückter Taste dann eine Differenzspannung erhält und aus einer serien/parallel Schaltung 2 unbekannte Widerstände errechnet und dabei ein Ergebnis liefert und das andere wieder vergisst. Hast einmal die Innenwiderstandskaskade errechnet dann reicht dir jedesmal eine Messung mit einer einfachen Rechnung.
Es geht nicht um Einsparen bei Massenproduktion sondern das ist einfach ein Projekt "Aus Spaß an der Freude", also einfach nur eine herausforderung.
Mit Kondensatoren ist mir das schon gelungen da sich die Formeln zusammengefügt auf Widerstandsverhältnisse umarbeiten lassen, auch die Spannung kürzt sich komplett raus. Die einzigen Unnbekannten bleiben C und t₁ und t₁ die Zeit des Umladens kann über den Quarz sehr genau bestimmt werden. Also lässt sich C sehr exakt ausrechnen.
Zweiter Widerstand in Reihe zum Prüfling -> dazwischen Spannung abnehmen(-> ADC) Allerdings kann der Widerstand dann nur in einem Bestimmten Bereich liegen(abhängig von zweiten Widerstand).
Klar geht das, macht man ja auch im einfachsten Fall.
Richtig macht man das, in dem man eine Konstantstromquelle baut und dann den Spannungsfall des Prüflings misst. In einem Multimeter ist die Konstantstromquelle so eingestellt, dass die Anzeige die in in "mV" misst dann direkt das Ergebnis in Ohm anzeigt.
Aber mir geht es darum, das ganz ohne irgendein anderes Bauteil außer dem Mikrocontroller zu machen. Nicht weil ich muß, rein aus Spaß an der Freude.
Kondensatoren kann ich über das umgeschaltete Widerstandsverhälnis bereits messen und das sehr genau (Messauflösung 0,0121pF, Mindestkapazität 0,5pF, maximalkapazität 200000µF, ermittelte Abweichung mit einem kalibrierten KARU Messgerät +/-0,5%!)
Das wäre hier ein PIC 16F87x.
Und Du hast recht, es ist eine Art D/A Wandler. Der dient dazu die Versorgungsspannung zu teilen und damit zwei eingebaute Komparatoren zu betreiben. Man kann diese Spannung aber auch auf einen Portpin schalten um diese Spannung extern zu verwenden. Da man aber den Pin auch gleichzeitig messen kann (oder den ADC direkt auf Cref schalten kann), kam mir die Idee eine Widerstandsmessung per belastetem Spannungsteiler durchzuführen.
Klar könnte ich auch einen zweiten, bekannten Widerstand nach Vcc anbringen und dann die Spannung eines unbelasteten Spannungsteilers messen und leicht auf den Widerstandswert schließen, mir geht es aber darum ganz ohne irgendwelche Zusatzteile so was zu machen, einfach aus Spaß an der Freude.
Außerdem sind die Widerstände im PIC so perfekt gleich wie es nur geht. Da müsste man doch eigentlich den WIderstand ziemlich exakt messen können ohne den Messwert durch zusätzliche Bauteile mit deren Toleranz zu verfälschen.
Einen Kondensator kann ich bereits über diese Cref Kette durch umschalten und messen der Zeiten sehr exakt bestimmen, hier ist das einzige Teil was die tolleranz mit bringt der Quarz und den ich da verwendet habe, der ist extrem genau.