Verwendung eines digitalen Potentiometers in einem Spannungsteiler

Ich verwende einen ADC MCP3008 und ein digitales Potentiometer MCP4131-103 (10k), um zu versuchen, eine Art "einstellbaren Spannungsteiler" zu erstellen.

Für das Projekt wird der Widerstand, den ich messe, variieren, und ich hoffte, den MCP4131 verwenden zu können, um meinen Referenzwiderstand im laufenden Betrieb anzupassen. Nämlich:

Vin
|
R1
|
|--Vout
R2
|
GND

Ich messe und protokolliere R1(ein Material) im Laufe der Zeit, und es steigt von vielleicht 500 bis 20 kOhm über die Dauer des Interesses. Wenn ich einen Festwiderstand für verwende R2, erhalte ich eine schlechte Auflösung, wenn der Wert nicht mit dem aktuellen Wert von übereinstimmt R1. Ich hatte gehofft, dass sich der digitale Poti basierend auf dem laufenden Durchschnitt anpasst, damit ich auch meine Auflösung behalte.

Ich glaube, ich habe sowohl den MCP3008 ADC als auch den MCP4131, die einzeln mit meinem Raspberry Pi 3 über SPI arbeiten, aber sie scheinen nicht so zu funktionieren, wie ich es in einem Spannungsteiler-Setup erwarte.

Beim Verkabeln des MCP3008 wie in dieser Adafruit-Anleitung habe ich einen Spannungsteiler mit einem 10k-Widerstand R2verwendet, um die folgende Formel zu finden R1:

v_out = adc * 3.3/1024
R1 = R2*(3.3 - v_out)/v_out

| resistor used |  calculated |
|---------------+-------------|
|          1000 |        1010 |
|          4700 |        4628 |
|         47000 |       46574 |

Das bestätigte, dass mein ADC gut zu funktionieren scheint.

Außerdem habe ich die Einstellungen für den MCP4131 durchlaufen und den Wert zwischen Hoch (3,3 V) und Wischer mit einem Multimeter manuell gelesen. In jedem Fall sende ich einen Wert von target resistance * 128/10000. Ich habe die Ergebnisse aufgetragen und bekomme:

Geben Sie hier die Bildbeschreibung ein

Das sah gut genug aus, um zu glauben, dass der Topf auch angeschlossen ist und korrekt funktioniert.

Wenn ich jetzt versuche, einen Spannungsteiler wie den obigen einzurichten, um sowohl das digitale Poti als auch den ADC zusammen zu testen, erhalte ich wackelige Ergebnisse. Ich habe zwei Konfigurationen zur Fehlerbehebung ausprobiert und den 4131 entweder als R1 oder R2 durch einen Festwiderstand als den anderen verwendeten ersetzt:

wiper pin of 4131 --|-- resistor -- GND
                    |
                    |
                   ADC

3.3V -- resistor --|-- wiper pin of 4131
                   |
                   |
                  ADC

Wenn ich in der ersten Konfiguration einen 10k-Widerstand verwende und das digitale Poti auf 5k einstelle, erhalte ich einen ADC-Rohwert von 403 oder 1,3 V. Ich hätte erwartet:

3.3V * (10000 / (10000+5000)) = 2.2V

Daraus ergibt sich eine Berechnung von:

10000*(3.3 - v_out)/v_out = 15384 # should be 5000

Wenn ich die Dinge vertausche und die zweite Konfiguration verwende, erhalte ich einen ADC-Wert von 624 oder 2,01 V. Ich erwarte einen Wert von:

3.3V * (5000 / (10000+5000)) = 1.1V

Daraus ergibt sich eine Berechnung von:

5000*(3.3 - v_out)/v_out = 3209 # should be 10000

Ich frage mich, ob das Potentiometer an und für sich wirklich ein Spannungsteiler ist und sich nicht so verhält, wie ich es erwarte. Sollte ich zum Beispiel meinen ADC ändern Arefoder GNDauf einen der R_aoder R_bPins am Potentiometer? Oder liegt der Fehler vielleicht in meinem Code und ich muss zwei Spannungsteiler hintereinander berücksichtigen?

Ich habe keine Beispiele für die Verwendung eines Potentiometers als einen der Widerstände in einem Spannungsteiler gefunden. Leider ist ein Potentiometer eines , die Suche nach "Verwendung eines Potentiometers in einem Spannungsteiler" erhält eine Menge Treffer, die einfach erklären, was Potis sind.

Vielen Dank für jede Anleitung, und ich freue mich, alle anderen Informationen zu veröffentlichen, die hilfreich wären.

Versuchen Sie, W + A am digitalen Poti miteinander zu verbinden, und verwenden Sie dann B, um eine Verbindung zu Ihrem Spannungsteiler herzustellen.
Sind Sie immer unter der erforderlichen Eingangsimpedanz des ADC?
@Szidor Ich schaue mir das Datenblatt an und bin mir nicht sicher, welche Spezifikation diesen Wert auflistet. Welcher Wert wäre anhand der ersten Schaltungsskizze oben zu niedrig R1(was ich messe). Die Bereiche sollten zwischen dem liegen, was ich aufgelistet habe: 500-20k Ohm. Ich habe noch einmal überprüft, ob ich "Impedanz" verstehe und es scheint sich auf Wechselstromkreise zu beziehen ... Entschuldigung, wenn ich falsch verstehe (Mech Engr hier!); Ich bin davon ausgegangen, dass Sie angedeutet haben, dass die Zuführung zu meinem ADC-Kanal einen Mindestwiderstand aufweist.
@Hendy Eigentlich gibt es s Maximum. ADCs benötigen normalerweise einen Eingang, der nicht über einer bestimmten Impedanz liegt. Ich habe Werte zwischen 500 Ohm und 10 kOhm gesehen. Das heißt, wenn Sie größere Widerstände haben, kann ADC ungenau sein und wird es normalerweise auch sein.
@Hendy Überprüfen Sie Abbildung 4-2 im ADC-Datenblatt. Du hast viel zu große Widerstände.
Abbildung 4-2 sieht so aus, als ob sie diktiert, wie schnell ich basierend auf dem Widerstand lesen kann, oder interpretiere ich das falsch? Mit spidevhabe ich derzeit spi.max_speed_hz = 976000; sieht so aus, als könnte ich das um ein Haar fallen lassen, wenn ich mir Sorgen um die 10k-Seite mache. Meine Testergebnisse sind nah genug, dass ich keinen Grund zu der Annahme sehe, dass ich in Bezug auf den Eingangswiderstand, den dieser Chip verarbeiten kann, weit daneben liege.
@Szidor Das OP ist korrekt, mit der maximalen Impedanz von 10 K, die sie verwenden, liegt die maximale Abtasttaktfrequenz bei etwa 1 MHz. Es ist also ein SAR-ADC C s a m p l e wird als Sample-and-Hold verwendet, und es ist die daraus gebildete Zeitkonstante und die Eingangsimpedanz, die die Abtastrate begrenzt.
@awjlogan Er schrieb, dass R1 20.000 erreichen kann ...
@Szidor Die Impedanz beträgt R1||R2, daher beträgt die maximale Impedanz des Teilers nur 6K7, wenn das Material 20K beträgt. Ich stimme zu, dass ein Puffer angesichts der unterschiedlichen Impedanz sinnvoll ist.
Das kann nicht stimmen. Wenn er also 10.000 für R2 hat und Vin vollständig abgeschnitten ist (unendlich für R1), ist er immer noch in Ordnung? Aus einer anderen Perspektive betrachtet: Die Kapazität von S & H + Pin beträgt 21 pF. Bei R1 = 20K haben Sie einen Serienwiderstand von 21K. Unter der Annahme, dass an keiner anderen Stelle eine parasitäre Kapazität und unendlich R2 vorhanden sind, würde das Aufladen dieser von 0 V auf fast 3,3 V (nahe genug für 10 Bit) etwa 2-3 us dauern. Der ADC tastet für 1,5 Takte ab, was eine Taktfrequenz von 600-700 kHz impliziert. Wenn Sie die parasitäre Kapazität (muss auch aufgeladen werden) und R2 (die einen Teil des Stroms stehlen) berücksichtigen, ist es noch schlimmer.
@Szidor Warum ist es nicht richtig? Das digitale Poti ist maximal 10K, daher kann die Impedanz des Teilers nicht mehr als 10K betragen. Um Ihr Beispiel zu nehmen, wenn R1 unendlich wäre, würde die Eingangsspannung durch einen 10K-Widerstand mit Masse verbunden. Das OP gibt an, dass der Maximalwert von R1 20 K beträgt, was einer Impedanz von 6 K7 (R1 | | R2) entspricht. Ein Spannungsteiler kann keine Impedanz haben, die größer ist als der niedrigste Wert electronic.stackexchange.com/questions/243277/…
@awjlogan Das steht alles in meinen Kommentaren oben.
@Szidor Aber du liegst falsch in deiner Analyse. Lesen Sie den Link in meinem Kommentar, dort gibt es eine Diskussion über Spannungsteiler. Der Teiler entspricht zu 100% einem einzelnen Widerstand in Reihe mit 3V3 mit einem Wert von R1 | | R2 und kann daher nicht größer als 10 K sein, selbst wenn die OP-Spezifikation für das Material ignoriert wird.
@awjlogan Dann sag mir: Wenn Vin 3,3 V und R1 unendlich ist, was lädt dann den S & H-Kondensator auf? Je?
@Szidor Wenn R1 unendlich ist, wird der S & H-Kondensator über einen 10-K-Widerstand auf Masse gehalten. Lesen Sie hier, insbesondere über den LDR-Sensor: electronicsclub.info/impedance.htm
@awjlogan Genau. Der ADC-Wert wird also niemals in der Nähe von Vin liegen. Die Größe von R1 spielt also eine Rolle, wie klein R2 auch sein mag. Wobei es für ein ausreichend kleines R2 keine Rolle spielen würde, wenn wir die R1||R2-Formel anwenden würden.
@Szidor Wenn R1 unendlich ist, sollte der ADC nicht in der Nähe von Vin liegen und über eine Impedanz von 10 K mit Masse verbunden sein, dh R1 | | R2. Bei einem Spannungsteiler ist die maximale Ausgangsimpedanz der niedrigste Wert des Teilers. Sie sehen, wenn R2 unendlich und R1 10K wäre, wäre die Impedanz immer noch 10K. Natürlich ist R1 wichtig, aber das bedeutet nicht, dass die Impedanz des Teilers immer größer als R2 ist, unabhängig vom Wert von R1.

Antworten (4)

Sie müssen Ihr digitales Potentiometer als Rheostat konfigurieren. Wenn Sie den Schleifer mit einer der Klemmen A oder B verbinden, erhalten Sie einen variablen Widerstand zwischen den beiden Klemmen A und B.

Laut Datenblatt steht der Schleifer auf B, wenn das digitale Potentiometer auf 0 steht, und A auf Vollausschlag. Das bedeutet, dass Sie wählen können, ob der Widerstand nahe 0 sein soll   Ω oder 10k Ω wenn Sie den Min/Max-Wert in der Software einstellen, je nachdem, ob Sie A oder B an den Scheibenwischer anschließen. Dies kann Ihre Softwareroutine bequemer machen.

Das ist fantastisch. Es scheint definitiv zu funktionieren und ich werde auch ein Update mit Daten veröffentlichen. Ich denke, sowohl Sie als auch @carloc haben beide Recht. Seine Antwort lautet, dass ich wirklich einen "doppelten Spannungsteiler" hatte, aber ich denke, das Überspringen der Klemmen ist die einzige praktische Lösung für das, was ich tun möchte, was meine Daten zeigen werden. Danke dafür.
@Hendy Pleasure, freut mich zu hören. Bin gespannt auf deine Daten :)
Wollte es zu meinem Q hinzufügen, aber es wurde viel zu lang. Es ist jetzt als Antwort, was hoffentlich zeigt, warum das Akzeptieren des doppelten Spannungsteilers, den @carloc illustriert hat, die Schaltung suboptimal macht. Das Springen des Wischers zu einem Stift gab mir genau das, was ich wollte. Die verbleibende Frage ist die Genauigkeit. Wir werden sehen!

Die Zahlen, die Sie lesen, stimmen fast perfekt mit der Schaltung überein, die Sie gebaut haben (deren Schaltplan Sie leider noch nicht gepostet haben, aber umgekehrt werden können).

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Auf dem ersten:

v = 3.3 v × 3.33 k Ω 3.33 k Ω + 5 k Ω 1.32 v

während auf der zweiten

v = 3.3 v × 5 k Ω 3.33 k Ω + 5 k Ω 1,98 v

Ich denke jedoch nicht, dass dies die beste Schaltung zum genauen Messen von Widerständen ist: Der Wischerwiderstand, der normalerweise weit davon entfernt ist, stabil und sowohl in elektromechanischen als auch in elektronischen Potentiometern wiederholbar zu sein, wird wahrscheinlich driften und Ihre Messungen ausgleichen.

Das ist es, wonach mein Verstand zu greifen begann, und ich konnte es nicht zum Klicken bringen. Das macht sehr viel Sinn. Wenn ich in den mentalen Tresor meines Kurses für Einzelschaltkreise am College gehe, verwendest du 1/R_eq = 1/R1 + 1/R2, richtig? Tatsächlich habe ich die Schaltung nicht wie Sie gezeichnet; Ich habe versucht, meine Konfigurationen zu zeigen, damit es kein Ratespiel war. Entschuldigen Sie die Unannehmlichkeiten und ich werde versuchen, meine Berechnungen auf der Grundlage dieser großartigen Erkenntnis zu aktualisieren!
Betreff. die Genauigkeit, ich fühle mich, als würde ich zwischen den Übeln stecken. Ich war mir nicht bewusst, dass der Topf abdriften könnte und hoffte, dass er „genau genug“ sein würde. Ich kann dafür eine neue Frage eröffnen, aber ich habe die ADC-Messwerte für stark abweichende Werte meines Materials ( R1) und meines Referenzwiderstands simuliert R2. An beiden Extremen sind die Werte unglaublich „steppig“, wobei ein ADC-Wert einen riesigen Bereich von abdeckt v_out. Ich bin mir nicht sicher, was üblich ist, wenn versucht wird, eine breite Palette potenzieller Widerstände zu messen.
Kein Problem @Hendy, keine Notwendigkeit, sich zu entschuldigen :) Stellen Sie nur fest, dass es unklar war, ob die A & B Ihres Pots an die Stromversorgung (wie sie tatsächlich sind) oder den Rheostat angeschlossen waren, und das ändert viel, was passiert. Sie haben Recht, wenn Sie "stufige" Werte an Bereichsgrenzen finden. Dies wird als schlecht konditioniertes Problem bezeichnet. Wenn Sie versuchen könnten, die Messempfindlichkeit (dV / dR-Differenz) zu ermitteln, werden Sie feststellen, dass sie sich über den Bereich stark ändert. Versuchen Sie, einige Spezifikationen, Reichweite, Genauigkeit, kann der Widerstand schwebend sein oder muss auf Masse bezogen sein, Systembandbreite (dh Aktualisierungsgeschwindigkeit) zu skizzieren und ein weiteres Q zu öffnen.
Ich werde meine Frage später heute mit Daten aktualisieren, die auf dieser Antwort basieren, aber dies spricht definitiv an, was vor sich ging. Ich bin mir jedoch nicht sicher, ob ich es in der Praxis so einfach verwenden kann wie die andere Antwort, bei der ich Terminals überspringe. Ich kaue immer noch gedanklich daran!

Ich weiß, dass dies wahrscheinlich keine großartige Form ist, aber ich wollte zusätzliche Daten / Diagramme für andere erfassen, die darauf stoßen. Ich habe angefangen, es auf die Frage zu setzen, aber das hat es wirklich lang gemacht, also wird es nur als Antwort hier sitzen.


Vielen Dank an awjlogan und carloc für ihre Antworten.

Ich beginne mit Carloc , der ein wunderbares Schema von dem erstellt hat, woran ich nicht denken konnte. In Anbetracht dieser Realität des "doppelten Spannungsteilers" musste ich nur meine Berechnungen ändern, fand jedoch, dass dies aufgrund der äquivalenten Widerstandsformel alles andere als ideal ist. Nehmen Sie dieses Szenario aus der Antwort, das ist die Konfiguration, die ich verwenden wollte:

Geben Sie hier die Bildbeschreibung ein

Für das Schema auf der linken Seite stelle ich mir meinen Pot-Sollwert setptals eine Art "vorgeschalteten" Widerstand vor, der vom Wischer erzeugt wird, und ich bekomme einen R2als meinen "nachgeschalteten" Widerstand. R1, meine Messung von Interesse und bilden am setptEnde einen äquivalenten Widerstand, R_eq, was Rparrechts dargestellt ist. Ich habe verschiedene Bereiche meines Materials von 1000 bis 20 kOhm und eine Reihe von Poti-Sollwerten simuliert. Für alle setpt:

R2 = 10000 - setpt
R_eq = 1/((1/R1) + (1/setpt))

Hier ist ein Diagramm von R_eqvs. R2mit R1gruppiert/farbig:

Geben Sie hier die Bildbeschreibung ein

Es funktioniert also , aber beachten Sie, dass das Maximum, das R2ich erreichen kann, viel geringer ist, R1als es größer wird, weshalb ich diesen Ansatz sowieso ausprobieren wollte.

Allerdings war die Beleuchtung der Rennstrecke goldrichtig und traf den Nagel auf den Kopf in Bezug auf die Messwerte, die ich für so seltsam hielt.


Weiter zu awjlogans Vorschlag, der darin bestand, den Wischerstift und einen von P0Aoder P0Bkurzzuschließen, einen davon (im Gegensatz zum Wischer) als Eingang für meinen ADC zu verwenden. Ich stelle mir eine Schaltung so vor:

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Ich habe das Potentiometer in diesem Fall als zwei Widerstände gezeichnet, und der elektrische Fluss ist aufgrund des Kurzschlusses für die obere Hälfte irgendwie "blind". Auf diese Weise bekomme ich genau das, wonach ich gesucht habe, nämlich einen einfachen Spannungsteiler, bei dem ein Bein einstellbar ist.

carloc wies darauf hin, dass dies zu laut/ungenau/nicht wiederholbar sein könnte und dass einige Überprüfungen erforderlich sind. Für meinen vorläufigen Test habe ich Folgendes mit einigen Widerständen und verschiedenen Potentiometer-Sollwerten erhalten:

Geben Sie hier die Bildbeschreibung ein

Hier die entsprechenden Rohdaten, mit Fehler abs((adc-measured)/adc)in Prozent:

   setpt     adc  measured  error
1   2000  9441.3      9880   4.65
2   4000  9429.5      9880   4.78
3   6000  9515.2      9880   3.83
4   8000  9467.0      9880   4.36
5  10000  9504.8      9880   3.95
1   2000  4340.6      4610   6.21
2   4000  4376.3      4610   5.34
3   6000  4431.2      4610   4.03
4   8000  4431.0      4610   4.04
5  10000  4442.9      4610   3.76
1   2000   913.2       981   7.42
2   4000   934.9       981   4.93
3   6000   958.1       981   2.39
4   8000   914.0       981   7.33
5  10000   998.9       981   1.79

Zum Abschluss werden wir sehen, ob dies für meinen Testfall funktioniert. ~5% ist nicht schlecht, aber auch nicht großartig. Vergleichen Sie das mit einer Wiederholung meines ersten Tests des ADC selbst, angepasst an den gemessenen Wert meines 10k R2 (9880):

     adc  measured  error
0    998       981   1.70
1   4635      4610   0.54
2  46640     46500   0.30

Das lässt 5% ziemlich schlecht aussehen!

Ich werde eine neue Frage stellen, wie ich den Widerstand eines variablen Materials messen kann, aber das war eine lustige Übung und hoffentlich hilft es jemandem auf dem Weg.

Ihre Widerstände sind zu groß für diesen ADC, siehe Abbildung 4-2 des Datenblatts. Sie können direkt vor dem ADC einen Puffer hinzufügen, z. B. einen auf einem Operationsverstärker basierenden Unity-Gain-Pufferverstärker. Ich denke, ein MCP6001 sollte für Ihre Konfiguration ausreichen.

Geben Sie hier die Bildbeschreibung ein

Ich habe nicht genug Repräsentanten auf dieser Seite, um sie zu bearbeiten, aber ich habe die Abbildung hinzugefügt, auf die Sie sich beziehen. Es ist hilfreich, es einzuschließen, damit andere es leicht sehen/verstehen können. Ich verstehe immer noch nicht, wie das zusammenhängt. Nichts deutet darauf hin, dass sie meiner Meinung nach "zu groß" sind, nur dass die Taktgeschwindigkeit reduziert werden muss, wenn Sie höher werden, um die Genauigkeit aufrechtzuerhalten. Bitte klären Sie, ob ich mit dieser Interpretation falsch liege.
Das Reduzieren der Taktrate hilft nur bis zu mehreren kOhm. Ich rate dringend davon ab, Werte in der Nähe von oder außerhalb veröffentlichter Diagramme zu verwenden.