Arduino analoger Eingangswert oszilliert, warum funktioniert das DMM und Arduino nicht so sehr

Ich messe den Spannungsausgang von einem Gerät mit einer Ausgangsimpedanz von 10 kOhm mit einem analogen Arduino-Eingangspin. Ich sehe, was ich mit einem Multimeter erwarten würde, aber mit dem Arduino bekomme ich entweder Müll oder bestenfalls oszillierende Messungen, die ungefähr dem entsprechen, was ich erwarten würde.

Ich weiß, dass die Impedanz der analogen Pins 100 MOhm beträgt, während sie auf dem DMM etwa 10 MOhm betragen würde, also hatte ich nicht erwartet, dass das Arduino unbrauchbar ist, während das DMM gut funktioniert.

Ich habe schließlich herausgefunden, dass das Kurzschließen der Ausgänge mit einem Kondensator mir das gibt, was ich erwarte, aber nicht wirklich verstehe, warum. Widerstände halfen, aber ich sah immer noch Oszillationen, und ich nahm an, dass die Widerstandsfehlanpassung der Schuldige war, da es anscheinend ein Problem mit der Impedanz war.

"Die Impedanz der analogen Pins beträgt 100 MOhm" ist mehr als unwahrscheinlich, insbesondere wenn eine Konvertierung stattfindet. Woher hast du diese Idee?
Es ist nur das, woran ich mich von einem vorläufigen Googeln erinnere: hier

Antworten (3)

Die MCU in Arduino hat einen sukzessiven Approximations-ADC.

Es funktioniert, indem es kurzzeitig eine Spannungsprobe über einen Multiplexer in einen kleinen Speicherkondensator nimmt, um mehrere Eingangskanäle mit einem ADC zu verarbeiten.

Bei einer hohen Quellenimpedanz hat der Abtast/Halte-Kondensator möglicherweise keine Zeit, sich vollständig aufzuladen, und daher ähnelt die Abtastung der Spannung nicht der tatsächlichen Spannung.

Die Impedanz eines analogen Eingangspins beträgt also nicht 100 MOhm, da er momentan einen 14-pF-Kondensator mit einem Reihenwiderstand von 1 kOhm auflädt und Strom in oder aus dem Pin fließen kann.

Daher muss die Quellenimpedanz niedrig genug sein, um den Abtast/Halte-Kondensator während der Abtastzeit auf innerhalb von 0,5 ADC-Zählungen aufzuladen.

Unter der Annahme, dass die MCU auf Ihrem Arduino ein AVR ist, besagen die ADC-Spezifikationen, dass sie am besten funktioniert, wenn die Quellenimpedanz 10 k oder weniger beträgt. Es scheint, dass Ihr Sensor eine hohe Ausgangsimpedanz hat.

Auch wenn der Sensorausgang das periodische Laden des Abtastkondensators nicht bewältigen kann, kann er instabil werden und ein Klingeln zeigen, wenn der leere Kondensator plötzlich zum Laden angeschlossen wird.

Das Gleiche gilt im Grunde, wenn Sie einen Filterkondensator am AVR-Eingang haben, um eine kurzzeitige AC-Impedanz zu haben, die niedrig genug ist, sodass Sie eine Messung durchführen können, ohne den Wert stark zu beeinflussen. Aber wenn die Filterkappe durch einen 1-MOhm-Widerstand aufgeladen wird, hat sie immer noch eine hohe langfristige DC-Impedanz, so dass es lange dauert, den Kondensator wieder auf den ursprünglichen Wert aufzuladen, so dass zu häufige Messungen den Filterkondensator langsam entladen.

Es gibt also viele Gründe, warum analoge Messungen mit Arduino im Vergleich zu einem Multimeter nicht funktionieren. Der Arduino hat keine eingebaute Signalkonditionierung und -pufferung wie ein Multimeter. Die benötigte analoge Eingangsstufe sollte zwischen Sensor und MCU eingebaut werden.

> Bei einer hohen Quellenimpedanz hat der Sample/Hold-Kondensator möglicherweise keine Zeit, sich vollständig aufzuladen, und daher entspricht die Abtastung der Spannung nicht der tatsächlichen Spannung. Das klingt, als würde es alles erklären. Und die Oszillation, die ich sehe, ist das Ergebnis des langsamen Ladens / Entladens dieser Kappe?
Es könnte sein. Ziemlich schwer zu sagen, ohne Oszilloskopmessungen zusammen mit den ADC-Ergebnissen zu sehen oder unter anderem die Abtastrate oder die tatsächliche Sensorausgangsimpedanz zu kennen.

Das Messgerät hat intern entweder einen echten Kondensator oder eine Software-Simulation eines solchen.

Wenn dies nicht der Fall wäre, würden Sie niemals eine stabile Zahl zur Anzeige bekommen und es wäre unmöglich, sie zu lesen.

Sie können sicher sein, dass dies nichts mit einer „Widerstandsfehlanpassung“ zu tun hat.

Eine kleine Geschichte....

Als ich auf dem College war, nahm ich an einem CMOS-Kurs teil - Wir haben integrierte Schaltkreise entworfen und hergestellt. Mein Team entschied sich für ein "Voltmeter auf einem Chip" --- Es hatte die analogen Eingänge und würde direkt an eine typische 7-Segment-LED-Digitalanzeige ausgegeben. Als wir es einschalteten, zeigte es „888“ an. Natürlich waren wir total deprimiert, bis jemand vorschlug, der Eingabe eine kleine Kappe hinzuzufügen. Plötzlich funktionierte es. Was also passierte, war, dass die Zahlen so schnell hüpften, alle LED-Segmente leuchteten so schnell auf, dass sie dauerhaft zu leuchten schienen.

Wenn Sie Ihren Arduino irgendwie in einer Umgebung ohne elektromagnetisches Rauschen betreiben könnten, würden Sie ohne die Kappe vollkommen stabile Messwerte erhalten. Aber eine solche Umgebung existiert nicht. Es wird IMMER etwas geben, das die Drähte bis zu einem gewissen Grad stört. Der Arduino lügt Sie also nicht an. Es meldet, was es an den Pins sieht. So passiert es, dass sich der Wert an den Pins bewegt. Wenn Sie die Kappe dort platzieren, wird die Spannung geglättet, sodass sie stabil genug wird, um eine Messung durchzuführen.

Das heißt, Sie müssen dem Arduino helfen, indem Sie die Spannung so stabil wie möglich machen. Beispielsweise führt die Verwendung von eng verdrilltem Draht anstelle von zwei separaten Leitungen fast immer zu einer Verbesserung. Rauschunterdrückung und richtige Erdungstechniken könnte ich nicht in einem kurzen Beitrag beschreiben, Sie könnten Lehrbücher mit dem Zeug füllen. Aber wenn Sie einfach nicht die gewünschte Stabilität erreichen können, erhalten Sie hier möglicherweise nützliches Feedback, wenn Sie einige Bilder Ihres Setups posten.

Folgen Sie der Antwort von Kyle B, wenn Sie keine GROUND PLANE verwenden, tun Sie dies.

Ich helfe einem Typen beim Erfassen/Digitalisieren von Transienten von Musikinstrumenten.

Im Laufe des letzten Jahres haben er/wir gelernt, wie man den Fehlerboden von 90 Millivolt auf etwa 0,3 Millivolt reduziert.

  • Haben Sie eine 0,01uF-Kappe am Eingang zum ADC

  • Haben Sie einen Unity_gain-Puffer vor dieser 0,1-uF-Obergrenze.

  • Verwenden Sie keine Schaltregler-Netzteile.

  • Wenn Sie SwitchRegs verwenden müssen, zahlen Sie für die bessere Note.

  • Verwenden Sie eine Grundebene.

  • Möglicherweise benötigen Sie Gleichtaktdrosseln für die VDD / GROUND-Verdrahtung zu den SwitchRegs.

  • In der VDD zu jedem Operationsverstärker-Puffer 10 Ohm in Reihe und 100 uF Rangieren.

Die von mir verwendete Obergrenze musste einen höheren Wert haben. Obwohl ich nicht sicher bin, was es ist, hatte ich es herumliegen, aber ich denke, es liegt in den 10s-100s von uF. Eine 10nF-Kappe tat nichts. Wenn ich gewusst hätte, wie viel Frustration daraus resultieren würde, kein EE zu sein, wäre ich nur ein EE gewesen>:( Die Verwendung einer Grundebene ist ein Problem, da ich nicht genau weiß, wie das Arduino ausgelegt ist.
Ich glaube, ich habe einmal einige Berechnungen angestellt, dass der Filterkondensatorwert am AVR-ADC-Eingang etwa 33 nF betragen sollte, um unter ungünstigsten Bedingungen einen stabilen Messwert zu liefern. Und dann hängt die Zeit zwischen den Messungen von der tatsächlichen Quellenimpedanz ab. Kontinuierliche Messwerte würden den Kondensator immer noch entleeren, wenn die Impedanz der Sensorquelle extrem hoch ist. Die 10 nF sollten also geholfen haben, wenn die Quellenimpedanz sie zwischen den Messungen aufladen kann.