Lesen von Joystick-Potentiometern mit einem Arduino

Ich versuche, meinen Arduino dazu zu bringen, die 10K-Potentiometer auf einem Joystick mit analogRead() zu lesen, aber die zurückgegebenen Werte schwanken zu stark, wenn der Joystick nicht berührt wird. Ich verwende keine abgeschirmten Kabel, aber sie sind sehr kurz (die Entfernung vom Joystick zur MCU beträgt nur etwa die Länge der MCU selbst).

Das Arduino, das ich verwende, ist ein Teensy 3.2, also ging ich auf ihre Website, um technischen Support zu erhalten. Die Lösung, die ich am meisten fand, war die Verwendung eines Unity-Gain-Puffers, also hoffte ich, etwas Hilfe beim Aufbau einer Schaltung für meine Situation zu bekommen.

Der Teensy 3.2 ist ein 3,3-V-Gerät, das 5-V-tolerante Pins hat und USB verwendet, um die Programme direkt hochzuladen. Ich habe einige 358 Operationsverstärker zur Hand, aber ich verstehe, dass diese keine Rail-to-Rail-Spannung liefern, die ich benötigen würde, wenn sich der Schleifer des Potentiometers in der minimalen und maximalen Position befindet. Ich habe auch viele 4558 Operationsverstärker, aber ich glaube nicht, dass diese für Einzelversorgungsschaltungen geeignet sind, von denen ich gehofft hatte, sie über den USB mit Strom zu versorgen, den dieses Gerät verwendet.

Ich bezweifle sehr, dass es darum geht, Puffer hinzuzufügen, die dabei helfen würden. Im Allgemeinen können MCUs 10k-Pots gut lesen.
Die gelesenen Werte waren zittrig und dies war der Rat, den ich fand, um das verrauschte Signal zu bereinigen. Ich sage nicht, dass Sie falsch liegen, aber das war die Spur, der ich folge.
Nun, es ist schwer herauszufinden, was Sie fragen. Es gibt auch keine Links zu Puffern oder Filtern, daher ist es schwer zu sagen, ob Sie einen benötigen oder nicht. Außerdem kann das Filtern auch in der Software erfolgen.
Woher sollte der Joystick überhaupt wissen, wo sich die Mitte des Bildschirms befindet? Klingt nach einem Treiberproblem, nicht nach einem Rauschproblem. Eine Sache, die Sie überprüfen könnten, ist, ob Sie versehentlich Daten senden, die von Ihrer "Maus" manchmal außerhalb der Grenzen liegen. Vielleicht könnte das den Cursor in die Mitte des Bildschirms bewegen?
Versuchen Sie, den Jitter durch Software zu bereinigen ... senden Sie den Durchschnitt von drei Messwerten ... Jitter, da die Ursache des Problems wahrscheinlich ein Ablenkungsmanöver ist
@Justme Was ich gerade gefunden habe, sagte, um einen Unity-Gain-Puffer hinzuzufügen, und dass Rauschprobleme am besten zuerst in der Hardware behoben werden sollten, bevor versucht wird, in der Software zu bereinigen.
@Drew Der Joystick ist federbelastet, um den Wischer in der Mitte des Widerstands zu positionieren. Also habe ich den Code geschrieben, um die Position des Zeigers zu aktualisieren, wenn es eine Wertänderung gab, die von einem Topf zurückgegeben wurde. Wenn es irgendeine Schwankung gäbe, die nahe der Mitte wäre, würde der Mauszeiger aktualisiert werden, um die Werte wiederzugeben, die von den zwei Töpfen gegeben werden, die der Mitte des Bildschirms entsprechen. Als ich die Empfindlichkeit genug verringerte, um Schwankungen herauszufiltern, verringerte dies die effektive Auflösung und die Bewegung des Zeigers war nicht gleichmäßig.
@jsotola Ich habe eine Bibliothek gefunden, die die Messwerte glätten soll, wie Sie gesagt haben, aber ich habe den Rat befolgt, zunächst alle Probleme mit der Hardware zu beheben. Ich bin mir nicht sicher, ob ich den Begriff „Jitter“ in diesem Zusammenhang richtig verwende, aber ich habe ihn verwendet, um eine Zufälligkeit in der Art und Weise zu beschreiben, wie die Messwerte vom Normalwert abweichen.
Jitter wird normalerweise verwendet, um Rauschen im Zeitbereich zu bedeuten, aber ich denke, Ihre Absichten sind offensichtlich. Wie viel Lärm sehen Sie? Versuchen Sie vielleicht, einen kleinen Kondensator entweder zwischen den Enden des Topfes oder zwischen Masse und dem Wischer oder beidem hinzuzufügen. Top-Tipp: Wenn Sie in der Firmware mitteln möchten, machen Sie eine Potenz von 2 für die Anzahl der Messungen (2, 4, 8 usw.) und verwenden Sie dann eine Verschiebungsoperation anstelle einer Division, da letztere rechenintensiv ist.
Ich schlage vor, dass Sie versuchen, das Problem aufzuteilen – Analyse, bevor Sie versuchen, eine Lösung zu finden. Ersetzen Sie beispielsweise das Poti durch zwei Widerstände mit niedrigerem Wert, z. B. 1K, und stellen Sie sicher, dass Sie einen akzeptablen Messwert erhalten. Tauschen Sie sie dann gegen zwei 5K-Widerstände aus und so weiter.
Zumindest könnte man einen Kondensator zum "kleinen" Filtern verwenden ... Und es würde auch helfen, den Mittelwert von 3 oder 5 Proben zu nehmen.

Antworten (1)

Der richtige Weg ist, Software zu filtern, nicht Hardware hinzuzufügen. Wenn Sie den Treiber bereits so geschrieben haben, dass er bei Änderung sofort einen neuen Wert sendet, hilft ein Filter hier nicht weiter. Befindet sich ein analoges Signal zwischen zwei Werten, liegt es nach der Filterung immer noch zwischen zwei Werten und kann beim Lesen mit dem ADC zwischen diesen springen.

Die üblichen Lösungen könnten zum Beispiel sein, eine Totzone in der angenommenen Mittelposition zu haben, wo keine neuen Positionen an den PC gesendet werden, vorausgesetzt, dass eine Art Kalibrierung durchgeführt wird, um die tatsächliche Mitte zu kennen, anstatt sie anzunehmen. Ein Filter erster Ordnung könnte in Software verwendet werden, aber die Ausgabe könnte immer noch zwischen zwei Werten umschalten, wenn die Eingabe dies tut.