Geschwindigkeit von Gelenken auslesen

Die Spannung an einem Potentiometer mit einem Hochpass ableiten und durch einen Operationsverstärker schicken

Motivation: Der Winkel von Gelenken lässt sich sehr günstig und mit mäßiger Genauigkeit durch ein Potentiometer auslesen. Es gibt eine Spannung proportional zum Winkel aus. Für viele Anwendungen ist es zudem wichtig, auch die Winkelgeschwindigkeit, also die Ableitung des Winkels zu kennen, z.B. bei einer Zustandsregelung. Die Geschwindigkeit lässt sich unter anderem mit folgenden Methoden bestimmen:

  • numerische Differentiation: In einem definierten Intervall den Winkel (also die Spannung am Potentiometer) messen und von diesem den Winkel bei der letzten Messung abziehen. Nun diese Winkeländerung durch das Zeitintervall teilen.Vorteile: Kein zusätzlicher analoger Eingang erforderlich, im Prinzip schnell zu implementieren. Nachteile: heftige Sprünge, viel Logik zur Glättung und Filterung notwendig.
  • modellhafte Differentiation mit Luenberger Beobachter: Der Prozessor rechnet sich aus, welche Geschwindigkeit infolge der Steuersignale ungefähr zustande kommen müssten und passt seine Simulation immer wieder an die tatsächlich auftretenden Messwerte an. Rechenaufwendig und anspruchsvoll, gängig in der Regelungstechnik.
  • analoge Differentiation: Die Potentiometerspannung wird im idealen Fall in Reihe mit einem Kondensator an einen analogen Eingang angeschlossen. Zudem wird die Leitung über einen Pulldown-Widerstand Richtung Masse gezogen. Der Fachmann erkennt: ein Hochpass! Und der hat differenzierenden Charakter. Mit üblichen Bauteilgrößen ergibt sich nur ein kleiner Ausgangsspannungsbereich. Den erweitern wir durch einen Operationsverstärker.

Im Folgenden zeige ich den Aufbau eines analogen Differenzierers, der beim Anschluss an einen Mikrocontroller wie z.B. den Arduino einen komfortablen Wertebereich hat.

Foto des Versuchsaufbaus - Breadboard mit 5V Spannungsquelle, Arduino Nano (Klon), Operationsverstärker, Hochpass, Potentiometer

Breadboard mit 5V Spannungsquelle, Arduino Nano (Klon), Operationsverstärker, Hochpass, Potentiometer

Folgende Elemente sind nötig:

  • Bauteil mit analogem Ausgang, z.B. Potentiometer
  • Operationsverstärker – in diesem Fall ein LM358, andere funktionieren ganz ähnlich, haben aber teilweise Spannungsbereiche, die der Ausgang nicht annimmt (z.B. geht der LM741 nicht unter 2V und hat damit einen viel kleineren nutzbaren Bereich)
  • Kondensator für den Hochpass, ich nehme hier 100nF, eine Größenordnung mehr oder weniger schadet auch nicht
  • Strombegrenzungswiderstand in Reihe zum Kondensator. Ich nehme 10 Kiloohm, wieder schadet eine Größenordnung mehr oder weniger nicht. Widerstand und Kondensator in bilden die Verbindung vom Potentiometer zum negativen Eingang des Operationsverstärkers.
  • Spannungsteiler: Zwei Widerstände vom gleichen Wert, zwischen einem Kiloohm und ein paar Dutzend Kiloohm. Damit legen wir die Hälfte der Versorgungsspannung auf den positiven Eingang. Wenn wir die Widerstände ungleich wählen, können wir Einschränkungen des Operationsverstärkers elegant umschiffen.
  • Rückkopplungswiderstand zwischen Ausgang und negativem Eingang des Operationsverstärker, sollte sehr eng sein, ich nehme 1 Megaohm.
  • Arduino oder anderer Mikrocontroller mit analogem Eingang, welcher mit dem Ausgang des Operationsverstärkers verbunden wird. Der Mikrocontroller muss mit derselben Spannung wie der Rest der Schaltung versorgt werden.
  • 5V Netzteil, notfalls reicht auch die Versorgung über USB, dann kommen etwa 4,4V noch an. Falls es der Mikrocontroller erfordert, ist der Betrieb mit 3,3V mit dem exakt gleichen Layout möglich.

Jetzt alles nach folgendem Foto aufbauen.

Erratum: Als Begrenzungswiderstand ist auf dem Foto ein 1K Widerstand (der mit dem roten Ring) statt des empfohlenen 10K Widerstandes (oranger Ring) zu sehen.

Operationsverstärker: oben links ist VCC+, unten sind von links nach rechts: Ausgang, negativer Eingang, negativer Eingang, VCC- Detaillierte Verschaltung: 5V an VCC+, Masse an VCC-, Spannungsteiler aus zwei 15K Widerständen zwischen 5V, positivem Eingang und Masse, 1M Widerstand zwischen Masse und negativem Eingang, 100nF Kondensator und 10K Widerstand in Reihe zwischen Potentiometerausgang und negativem Eingang.

Operationsverstärker: oben links ist VCC+, unten sind von links nach rechts: Ausgang, negativer Eingang, negativer Eingang, VCC-
Detaillierte Verschaltung: 5V an VCC+, Masse an VCC-, Spannungsteiler aus zwei 15K Widerständen zwischen 5V, positivem Eingang und Masse, 1M Widerstand zwischen Masse und negativem Eingang, 100nF Kondensator und 10K Widerstand in Reihe zwischen Potentiometerausgang und negativem Eingang.

Jetzt kann man den Strom einschalten und den Ausgang messen. Bei Stillstand sollte der Ausgang etwa 2,5V annehmen und beim Drehen proportional zur Geschwindigkeit steigen oder fallen.

Zeit um ein paar Messwerte zu sammeln!

Ausgangsspannung aufgetragen über die Zeit, für einen Motor, der sich vor und zurück dreht, ergibt sich ein Rechtecksignal

Screenshot aus dem Programm Megunolink Pro

Ich habe hier nicht von Hand am Poti gedreht, sondern das aus einem gehackten Servo angeschlossen. Der Servo hat sich vor und zurück gedreht (also ein Dreieckssignal). Man erkennt, wie die Spannung an unserem Differenzierer zwischen zwei konstanten Geschwindigkeiten wechselt. Ein Rechtecksignal und damit genau die Ableitung des Dreieckssignals, das wir in den Differenzierer hinein gefüttert haben!

Der Wertebereich 0-1023 des Analog-Digital-Wandlers vom Arduino wird noch nicht voll ausgeschöpft. Wir können höhere Ausschläge erreichen, indem wir den Rückkoppelwiderstand enger(höherer Wert) oder den Strombegrenzungswiderstand weiter(kleinerer Wert) wählen. Jeder Operationsverstärker braucht aber seine Reserve, er geht nicht unbedingt vollständig bis auf VCC+ und VCC-.

Im Vergleich zu einem einfachen numerischen Differenzierer hat das Signal keine riesigen Ausreißer aber ein hohes Rauschen und immer wieder Werte, die nicht vollständig plausibel sind. Dafür sollte man Filterroutinen schreiben.

Aber auch schon so haben wir eine sehr gute Möglichkeit gefunden, ohne großen Rechenaufwand und nahezu latenzfrei die Geschwindigkeit eines beliebigen Signals zu messen.

Zum Schluss noch der Quelltext auf GitHub.