Habe das ori auch noch mal reingestellt.
Dabei wird der Atmega 88 und die Pins PB0 bis PB7 verwendet.
Was ich daran nicht verstehe ist das Messprinzip. Die ADC Eingänge werden nicht verwendet.
Kann mir jemand kurz erkläten wie das Funktioniert.
LG Klaus
Leider ist der Schaltplan kaum lesbar. Ich sehe an Port B aber einige gelbe Markierungen, deren Labels offenbar mit gleichnamigen Labels an ADC Eingängen entsprechen.
Dabei wird der Atmega 88 und die Pins PB0 bis PB7 verwendet.
Was ich daran nicht verstehe ist das Messprinzip. Die ADC Eingänge
werden nicht verwendet.
So wie ich das im Schaltplan verstehe:
Über die Port-Pins B werden die Spannungsteiler "ativiert" und die ADC von Port.C fragen die Spannungsteiler ab.
Soweit gut, mit den ADC erfolgt die Abfrage der ADC Werte. Dann schalten die anderen die Bereiche. Woraus besteht denn dann der Spannungsteiler? Wozu ist Ux? Ist die Bezugsspannung (Uref) die 5V?
Ux ist die Spannung am Probanden. Wenn man die Widerstandwerte kennt, kann Rx ausrechnen.
Ist die Bezugsspannung (Uref) die 5V?
Muss wohl, weil die Ausgänge von Port B ja auf 5V schalten. Ansonsten würden Abweichungen der Versorgungsspannung versus Referenz die Messung verfälschen. Stichwort: ratiometrische Messung
Es wird der Reihe nach jeweils ein Pin von PB0 .. PB6 auf H gesetzt (der Rest ist hochhohmig). Der jeweilige Widerstand bildet mit dem Testobjekt einen Spannungteiler. Das Teilerverhältnis wird mit dem ADC an Pin PC0 erfaßt. Es wird eine ratiometrische Messung gemacht (Vcc speist den Spannungsteiler und ist gleichzeitig Referenz).
Für die 5 niederohmigsten Widerstände (wo der Einfluß des Port- Ausgangswiderstands nicht mehr vernachlässigbar ist) wird außerdem die Spannung am Pin direkt über PC1 .. PC5 gemessen.
Genommen wird die Messung, bei der das ADC-Ergebnis am nähesten an Vcc/2 ist. Sprich, wo Testobjekt und Vergleichwiderstand am besten überein stimmen. Bei dieser Messung ist der Fehler durch die endliche ADC-Auflösung am kleinsten.
Wenn Vcc einer Schwankung unterliegt, liegt doch der Fehler in der Berechnung mit drin?
Wenn ich mir die Vorwiderstände so ansehe komme ich rechnisch eigentlich nicht auf eine Ergebnis. Um den gesamte Bereich der Messung abzudecken muss doch jeder Berech extra berechnet werden.
Wenn ein Ausgang auf H geschaltet wird kann doch eine unterschiedliche Spannung anliegen. Wie kommt dann eine exakte Wert zustande?
Wenn ich mir die Vorwiderstände so ansehe komme ich rechnisch eigentlich
nicht auf eine Ergebnis. Um den gesamte Bereich der Messung abzudecken
muss doch jeder Berech extra berechnet werden.
Wenn ein Ausgang auf H geschaltet wird kann doch eine unterschiedliche
Spannung anliegen. Wie kommt dann eine exakte Wert zustande?
Weil die Referenz des ADC die gleiche Spannung ist. Hast du dich zum Thema "ratiometrische Messung" wie empfohlen eingelesen?
Stelle dir vor, der Spannungteiler ergibt gerade 1/3. Dann ist dem ADC egal, ob das 1/3 von 5 Volt oder 1/3 von 4 Volt sind. Es ist so oder so 1/3 der Spannung, genau diese Info liefert der ADC bei der ratiometrischen Messung.
Genauer gesagt liefert er den Anteil der Spannung (egal wie hoch sie ist) in 1024 Schritten.
Morgen
Habe die Messung angeschaut. Habe dazu einen guten Artikel im Netz gefunden.
Bei dieser Methode ist die Messung relativ einfach. Wichtig dabei ist ein genauer Widerstand. In der Formel wird die Berechnung durchgeführt.
Was ich nicht verstanden habe ist die Vcc/Vref. Wenn ich zur Messung die selbe Spannung nehme stimmt die Messung z.B. bei 5V oder 3,3V. Wenn also die Spannung für Vcc/Vref schwankt z.B. zwischen 3,2.. bis 3,3.. hat das keinen Einfluss?
Wenn der Eingang des ADC auf 1/3 der maximal messbaren Spannung liegt, dann ist das immer 1/3, ganz egal wie hoch diese nun konkret ist. Das numerische Ergebnis wird immer 341 sein (= 1/3 von 1024).
Wenn die maximale Spannung des Spannungsteilers (VCC) nicht mit der Referenz des ADC identisch wäre, dann würde jede Schwankung der Versorgungsspannung zu anderen numerischen Ergebnissen führen.
Labels sind eine feine Sache um Verbindungen zu Schaltungsteilen auf einem anderen Blatt dazustellen.
Für Verbindungen innerhalb des Blattes sind sie einfach nur Schwachsinn weil man erst alle Vorkommen suchen muss um den Plan zu verstehen.
Sehen sie bald auf microcontroller.net: Schaltpläne als Excel Tabelle. Kein mühsames Zeichnen mehr, keine ausschweifende Prosa. Einfach nur alle Verbindungen aufgelistet. Da schlägt das Herz des Schachspielers schneller.
Habe die Berechnung mal durchgeführt, zwar erst mal auf dem Papier, sie stimmt. Es steht auch drin: Rx < Rf. Wenn ich also einen Rf von 10k nehme ist der max. Messbereich bis 10K. Das kann man dann ohne Probleme auf 1M oder 100 Ohm ausweiten.
Bleibt noch die Frage nach der Formel. Wie kann ich das am besten in C machen?
Bleibt noch die Frage nach der Formel. Wie kann ich das am besten in C
machen?
Eigentlich brauchst du dafür nur das Ohmsche Gesetz anzuwenden.
Der Spannungsteiler liefert abhängig von den Widerständen einen Bruchteil der Versorgungsspannung. Und der ADC sagt, wie hoch dieser Anteil ist (in 1024 Schritten).
Zu beidem gibt es reichlich Webseiten, die es im epischer Breite erklären. Man muss das nur noch miteinander kombinieren.
Habe die Messung angeschaut. Habe dazu einen guten Artikel im Netz
gefunden.
Wahrscheinlich nicht. Der Schaltplan sieht schonmal viel komplizierter aus, als er eigentlich sein müßte. Da sind lediglich 2 Widerstände von Vcc = Vref nach GND und ein ADC-Eingang am Teilerpunkt.
Welcher hochgeheime Artikel ist es denn?
Wichtig dabei ist ein genauer Widerstand.
Nicht genauer als nötig. 1% Toleranz reicht für diese Anwendung (als Ohmmeter zur schnellen Sortierung) vollkommen aus.
Was ich nicht verstanden habe ist die Vcc/Vref. Wenn also
die Spannung für Vcc/Vref schwankt z.B. zwischen 3,2.. bis 3,3..
hat das keinen Einfluss?
Nein. Sie muß natürlich für die Dauer einer Messung (bzw. mehrerer, wenn mehrere zusammengehörige Messungen gemacht werden) stabil sein. Mehr aber nicht.
Es steht auch drin: Rx < Rf. Wenn ich also einen Rf von 10k
nehme ist der max. Messbereich bis 10K.
Wo "steht das drin"? Für das Ohmmeter nach Zabex stimmt das schon mal nicht. Der Vergleichswiderstand kann sowohl größer als auch kleiner als Rx sein. Nur wird für eine größeres Widerstandsverhältnis der Einfluß der endlichen ADC-Auflösung immer größer.
Nimm einfach an, der Vergleichswiderstand wäre 1K. Dann kann der 10-Bit ADC eines ATMega Widerstände Rx im Bereich 1Ω bis 1MΩ prinzipiell erfassen. Denn einmal ergibt sich ein Spannungteiler 1000:1 und das andere Mal 1:1000. Der ADC liefert einmal den Wert 1 und das andere Mal 1023. Problem dabei: die Auflösung im Widerstandbereich wird an den Grenzen des Meßbereichs immer schlechter, weil die ADC-Ergebnisse ganze Zahlen sind. Ein "Klappern" des ADC um ±1 bedeutet vor allem am oberen Ende des Meßbereichs eine sehr große Änderung des berechneten Widerstandswertes.
Und deswegen verwendet Zabex mehrere Vergleichswiderstände in der Abstufung von ~ 1:6. Es läßt sich dann innerhalb der absoluten Grenzen immer ein Vergleichswiderstand finden, der nicht mehr als die 2.5-fache Größe von Rx hat oder der um Faktor 2.5 kleiner ist (weil 2.5² ~= 6).
Der von einem 10-Bit ADC gelieferte Wert liegt dann zwischen 293 (2.5 : 1) und 731 (1 : 2.5). Ein "Zappeln" des ADC um ±1 entspricht dann einem Fehler unter 0.5%. Genauer müssen die Vergleichswiderstände dann auch nicht sein.
Im Detail ist das Meßverfahren noch etwas trickreicher, vor allem am unteren Ende des Meßbereichs. Wenn du es genauer wissen willst, lies den Quellcode. Der ist recht verständlich geschrieben.
Meine diesen Stelle:
https://www.electronicdeveloper.de/ADCRatiometrisch.aspx
Nach deiner Aussage bin ich etwas verwirrt. Wenn der RF=10k ist, kann der Rx grüsser 10k sein?
Wenn ich mir die Formel anschaue und es nachrechne dürfte es nicht sein.
Du sprichst von einem ADC von 10 Bit. Welche Auswirkung hat den zusätzlicher AD Wandler von 12Bit oder 16 Bit? Wird daurch die Messung genauer oder lohnt sich der Aufwand nicht?
Welche Auswirkung hat den zusätzlicher AD Wandler von 12Bit
oder 16 Bit? Wird dadurch die Messung genauer oder lohnt sich der Aufwand nicht?
Die Messung wird höher aufgelöst. Das ist wie bei einem Thermometer, dass dir die Zimmertemperatur als 20.523 °C anzeigt. Stellst du zehn Stück davon nebeneinander, zeigt jedes etwas anderes an. In Wirklichkeit hat der Raum vielleicht 19°C. Hohe Auflösung heißt nicht zwingend, dass es genau ist.
Die Genauigkeit hängt der Messung hängt ab vom:
Rauschen der Versorgungsspannung
Rauschen des ADC
Linearität des ADC
Präzision der Vergleichswiderstände
Rauschen der Widerstände
Innenwiderstand des Mikrocontrollers (die sich zu den Vergleichswiderständen addiert)
Rauschen der Ausgänge des Mikrocontrollers
Elektromagnetische Einflüsse
Bis 10 Bit ist es noch relativ einfach hin zu bekommen, dass nur das unterste Bit rauscht. Du wärst nicht der erste, der einen 16 Bit ADC einsetzt aber trotzdem nur 10 nutzbare Bits erreicht, wie die anderen nur Rauschen.
Bei der Schaltung aus dem Eröffnungsbeitrag wäre ein ADC mit mehr als 10 Bits wie Perlen vor die Säue geworfen. Damit gewinnst du nur scheinbare Genauigkeit, wie im obigen Beispiel mit dem Thermometer.
Und weil beim Zabex-Ohmmeter R_ref umgeschaltet werden kann, liegt das Teilerverhältnis immer innerhalb 2.5 : 1 und 1 : 2.5. Außer an den Meßbereichsgrenzen, da wird es dann etwas ungenauer.
Im Prinzip wäre mit einen 10-Bit ADC auch 4:1 bis 1:4 noch mit 0.5% Meßfehler machbar. Rechen wir vereinfachend mit 1000 counts fullscale, dann entspricht 4:1 ^= 200 counts und 1:4 ^= (1000 - 200) = 800 counts. Ein Wackler um ±1 entspricht dann gerade 0.5% Fehler.
Wenn man 1% Fehler zuläßt, kommt man sogar auf 9:1 bis 1:9. Dann dürfte R_x also von 1/9 bis zum 9-fachen von R_ref haben.
Das beantwortet auch deine Frage. Mit einem breiteren ADC (vulgo: höherer ADC-Auflösung) kann man mit weniger Werten für R_ref auskommen oder wahlweise einen größeren Meßbereich abdecken oder genauer messen.
Hallo
Habe mir das Programm Zabex angeschaut. Berücksichtige jetz die Teile nicht mit Autorange und Mittelwertbildung (64). Durch das Autorange werden die Messbereiche umgeschaltet. (0-1k, 1k-10k, 10k-100k, 100k-9890k)
Bei einem Messbereich von 1k bis 10k mit einem Rv von 10k ergibt sich
1
Zaehler=ADC_Wert*10
Bei 10 Bit:
1
Nenner=1024-ADC_Wert
Zur Berechnung:
1
Rx=Zaehler/Nenner
Im untersten Bereich verwendet er das:
1
Zaehler=ADC_Wert*1000/973
973 zut Kompensation?
Ux ist der Messwert über Rx nch eurem Bild. Wo wird hierbei aber Uref verwendet?
Leider komme ich mit der Berechnung nicht klar.
Soweit klar. Deshalb hat er auch die Mittelwert berechnung drin um die Anzeige ruhiger zu bekommen.
Wenn ich die Rechnung verstanden habe, sind die 1024 die 10 Bit. Wenn ich mit 12 Bit rechne müsste dort 4096 stehen.
Werde mal eine Schaltung auf meinem Grett aufbauen, mal sehen ob ich auf die Werte komme.
Der Rf beträgt 9,98 kOhm
Der berechnete Wert für 1,5 kOhm sind vielleicht ein Abweichungen bei der Messung. Der berechnete Wert für 8,2 kOhm ist zu gross.
Wodurch kommt diese Abweichung?
Ist das BASIC? Wo endet die Schleife? Mit der Einrückung? Muß die Division durch 50 nicht außerhalb der Schleife stehen? Mach das doch einfach mal nur mit einer Messung. Für den Test genügt das.
Habe noch mal aööes gemessen und versteh noch weniger
Rf = 9,98 kOhm (mit Ohmmeter ermittelt)
Rx = 8,196 kOhm (mit Ohmmeter ermittelt)
Vcc = 3,260 V
I berechnet = 0.000181 A
damit ergibt sich für ADC ein berechneter Wert von 1,48 V (gerundet)
Annahme zu den berechneten Werten aus dem Programm:
Rf = 9,98 kOhm
Rx = 6,4 kOhm (angenommener Wert aus Berechnung des Programmes)
Vcc = 3,260 V
I berechnet daraus 0.0001987 A
damit ergibt sich ein ADC ein berechneter Wert von 1,268 V
Gemessener Wert für ADC 1,263V über Rx von 8,2 kOhm ????
(Unterschiede durch Rundung oder Schwankungen möglich)
Alles nach dem Ohmschen Gesetz. Leider stimmt da was nicht. Entweder bin ich zu doof oder sollte doch anfangen mit Stricken ???
Glaube das Problem gefunden zu haben.
Nach DB hat der ADc des Prozessors ca. 100k Eingangs R. Wenn ich diese ca. 100k parralle zum 8,2k Rx setze bekomme ich so was bei 7,4 k.
ärgerlich, mal sehn wie ich das Problem löse,
Wenn ich diese ca. 100k parralle zum 8,2k Rx setze bekomme ich so was bei 7,4 k.
Wie rechnest du das?
1÷((1÷100000Ω)+(1÷8200Ω)) = 7578,56Ω
Aber auch das ist Quatsch, denn die ADC Eingänge sind sehr viel hochohmiger. Sie haben allerdings eine gewisse Kapazität die umgeladen werden muss. Dass ist im Timing zu berücksichtigen.
Rf = 9,98 kOhm (mit Ohmmeter ermittelt)
Rx = 8,196 kOhm (mit Ohmmeter ermittelt)
Vcc = 3,260 V
I berechnet = 0.000181 A
damit ergibt sich für ADC ein berechneter Wert von 1,48 V (gerundet)
Ja. Aber den Strom braucht man dafür nicht. Spannungsteiler reicht.
Gemessener Wert für ADC 1,263V über Rx von 8,2 kOhm ????
Dein ADC mißt falsch. Warum können wir dir nicht sagen. Wir wissen ja noch nicht mal, was das für ein ADC ist. Oder welcher µC.
Soll natürlich Brett sein. Hat sich aber auch schon wieder erledigt.
Als Prozessor verwende ich ein Pico mit dem 2040 und einer Spannung von 3,3V. Meine damit keinen Raspi und co., sondern den Raspberry Pi Pico. Die verwendeten Widerstände habe ich jetzt direkt an die Kontakte gelötet und das selbe Ergebnis. Der Pico hat 3 x ADC.
Die Widerstände im Vergleich zum Zabex sind anders. Er verwendet 5V und ich 3,3V.
.-------- U_ref ------->|
|
| .--- U_x -->|
v v
o--[R_ref]--*--[ R_x ]--|
|
Vcc ADC GND
Habe mir die Hardware von Zabex noch mal vorgenommen. Er verwendet im Bereich 1-10kOhm einen Rf von 5,6kOhm. Habe mal ein bischen gemessen und getestet.
Bei einem Rf = 7.5 kOhm und einem Rx von 10 kOhm bekomme ich eine Anzeige von 10 kOhm. Dabei beträgt die Spannung ADC 1,668V. Das könnte schon stimmen. Wenn ich dabei einen R von 1,5k als Rx einsetze bekomme ich 1,9k angezeigt. Wieso???
Habe in das Programm eine Pause von 1mS eingebaut, leider mit dem gleichen Ergebniss.
Habe mir die Hardware von Zabex noch mal vorgenommen. Er verwendet im
Bereich 1-10kOhm einen Rf von 5,6kOhm.
Das Zabex Ohmmeter hat keinen "Bereich 1-10kOhm"
Bei einem Rf = 7.5 kOhm und einem Rx von 10 kOhm bekomme ich eine
Anzeige von 10 kOhm. Dabei beträgt die Spannung ADC 1,668V. Das könnte
schon stimmen.
Nein, das stimmt nicht. Nach Spannungteiler-Rechnung sind es
U_x = 3.3V × 10K ÷ (7.5K + 10K) = 1.886V
Wenn ich dabei einen R von 1,5k als Rx einsetze bekomme
ich 1,9k angezeigt. Wieso???
Weil dein ADC falsch mißt.
Warum? Keine Ahnung. Weder kenne ich die Spezifikation des ADC im Raspberry Pi Pico noch habe ich Muße, sie nachzusehen. Es /kann/ sein, daß der ADC des Pico schlicht höhere Eingangsströme (Leckströme) hat, schließlich sind die Strukturen auf den Chip viel kleiner als für den im Vergleich dazu steinalten ATMega.
Es kann aber auch jeder andere Fehler sein. Schon beim AVR gab es die Möglichkeit, den µC-Core für die Dauer der Messung anzuhalten, damit es keine Beeinflussung des ADC gibt. Das Problem ist mit 16 statt 10 Bit sicher nicht kleiner geworden.
Aber auch Sample&Hold und die Arbeitfrequenz des ADC (vorausgesetzt es ist ein kapazitiver SA ADC!) spielen da rein.
Bevor du den Grund für die Fehlmessungen des ADC nicht kennst, brauchst du die Ohmmeter-Funktion gar nicht anzusehen. Möglichkeiten dazu hast du jede Menge:
du kannst mehrere Messungen machen und dir anzeigen lassen. Gibt es einen Trend der Meßwerte?
du kannst einen OPV als Impedanzwandler zwischen Spannungsteiler und ADC schalten. Wird das besser?
und vor allem: du kannst das Manual zu deinem µC + ADC lesen. Was sagt das zu genauen Messungen an hochohmigen Quellen?