Hi zusammen!
Wenn man den Wert der Schleiferstellung eins Potis über den ADC eines
Mikrocontrollers einliest, flackert der eingelesene Messwert, wenn er
zufällig auf der Bereichsgrenze zwischen zwei digitalen Werten liegt.
(klar, Brummen oder schlechte Masseführung tun noch ihr übriges dazu)
Gibt es eine Methode, wie man dieses Springen zwischen zwei Werten
softwaremäßig "rausrechnen" kann?
Mittelwertbildungen bringen hier wohl nichts, das verlangsamt, wenn ich
das richtig sehe, nur die Hin- und Herspringfrequenz.
Letztlich soll jede Stellung des Potis genau einen Wert als natürliche
Zahl ergeben, egal, ob man das Poti hoch- oder runterdreht und der Wert
soll in keiner Potistellung von selber flackern.
Das Poti hat eine reale Auflösung die nicht unendlich klein ist, allein
schon bedingt durch die Schleiferbreite. Die Verfahrgeschwindigkeit wird
auch nicht übermässig groß sein, sonst wäre ein Poti die falsche Wahl.
Und falls es nicht gerade ein Mehrgang-Wendelpoti ist, ist die
notwendige Auflösung doch eher übersichtlich. Also bitte erstmal
ausrechnen, was denn sinnvolle Eckdaten für Auflösung und Abtastrate
sind. Dann sieht man weiter.
Bau per Software eine kleine Hysterese ein.
Wenn der neue Wert sich nur um max. 1 vom alten Wert unterscheidet, dann
lass den alten Wert.
Das eine Bit an Auflösungsverlust musst du dann halt verschmerzen, aber
für einen einfachen Poti sollten 512 Werte genügen.
Ansonsten kannst du das natülich noch komplizierter machen. Du merkst
dir den vorherigen und vorvorherigen Wert.
Nur wenn der neue Wert anders als der vorherige und gleich dem
vorvorherigen Wert ist dann ignorierst du ihn.
Damit kannst du auch eine kleine Änderung erfassen, nur wenn es wieder
zurückspringt wird die Änderung ignoriert.
Du musst natürlich bei jedem (akteptierten) neuen Wert die vorherigen
Werte entsprechend umspeichern.
jörn_s schrieb:> Gibt es eine Methode, wie man dieses Springen zwischen zwei Werten> softwaremäßig "rausrechnen" kann?
Du brauchst eine Hysterese.
Denn auch wenn du mit vielen Messwerten überabtastest und die dann mit
einem Tiefpass filterst, wird dein Ergebnis trotzdem zappeln. Nimm
einfach mal an, du würdest laufend die Werte 127 und 128 bekommen: 127,
128, 127, 128, 127, 128, usw. Nach der Tiefpassfilterung wirst du
feststellen, dass sie gar nichts gebracht hat. Probiers aus.
Mit genau dieser Zahlenkette wirst du auch feststellen, dass es nichts
bringt, das unterste Bit "abzuschneiden". Allein die
"Zappelwahrscheinlichkeit" wird dadurch geringer, weil jetzt nur Werte
kritisch sind, bei denen das zweitniedrigste Bit zappelt.
jörn_s schrieb:> Letztlich soll jede Stellung des Potis genau einen Wert als natürliche> Zahl ergeben, egal, ob man das Poti hoch- oder runterdreht und der Wert> soll in keiner Potistellung von selber flackern.
Mir kommen primär zwei Verfahren in den Sinn:
1. analoges Tiefpassfilter + digitales Oversampling + Erzeugen einer
Hysteresis
2. Inkrementalgeber statt Potentiometer
Zu 1.: Durch das Tiefpassfilter soll nicht nur das normale Rauschen
reduziert werden, sondern insbesondere auch Einstreuungen durch
Funksignale. Das Oversampling reduziert ebenfalls das analoge und das
Wandlerrauschen. Anschließend zeichnet man eine Vielzahl von Messwerten
für mehrere Potentiometerstellungen auf. Für jede Stellung bestimmt man
dann die Streuung der gemittelten Messwerte. Die Hysteresis stellt man
dann etwas größer als die größte Streuung ein. Sobald die Hysteresis
durch Betätigen des Potentiometers überschritten wurde, folgt das
resultierende Messergebnis den gemittelten Messwerte. Nach einer
experimentell zu bestimmtenden Zeit rastet das Messergebnis dann ein, so
dass die Hysteresis wieder wirksam wird. Der Nachteil dieses Verfahrens
besteht darin, dass man nicht auf sehr kleine Änderungen der
Potentiometerstellung reagieren kann. Die Praxis zeigt aber, dass die
Haftreibung des Schleifkontaktes und die Elastizität der
Schleiferaufhängung eh zu einer deutlichen Hysteresis führt, d.h. der
Schleifer muss nach dem Stillstand eh erst einmal "losbrechen". Bei
geschickter Wahl der Parameter ist die softwaremäßige Hysteresis
überhaupt nicht zu merken.
Die Erfahrung zeigt, dass mit bei einem normalen Potentiometer etwa 1000
Stellungen auflösen kann. Diese sind zwar monoton angeordnet, aber die
Linerarität ist deutlich schlechter. Mit einem 12-Bit-ADC und ca.
achtfachem Oversampling liegt man in einem akzeptablen Bereich. Ich
schätze , dass man dann bei einer Hysteresis von ca. +/-2
ADC-Inkrementen landet.
Zu 2.:
Bei einem Inkrementalgeber mit mechanischer Rastung gibt es gar keine
Wackler, sondern die Rastung nicht genau auf einer Kante liegt. Bei
einem Inkrementalgeber ohne Rastung beträgt der Wackler entweder -1 oder
+1 Inkrement bzw. Graycode-Wert. Hier ist die Implementierung einer
Hysteresis sogar noch viel einfacher.
Herzlichen Dank für die vielen superschnellen und ausführlichen
Antworten!
Hysterese klingt gut! Die Auflösung muss nicht besonders hoch sein, nur
eben flackerfrei :)
Ein Inkrementalgeber scheidet leider aus und ein TP ist vor dem ADC
schon installiert.
Anselm schrieb:> Oversampling und dann reduzierenAndreas S. schrieb:> 1. analoges Tiefpassfilter + digitales Oversampling + Erzeugen einer> Hysteresis
Was bedeutet in diesem Zusammenhang Oversampling?
Eine einfache Hysterese ist gut, klaut dir aber Auflösung. Dagegen
kannst sie zeitlich begrenzen, z.b. nur zurück wenn 5 Mal oder 8 von 10
Mal der vorherige Wert kam.
jörn_s schrieb:> Hysterese klingt gut! Die Auflösung muss nicht besonders hoch sein, nur> eben flackerfrei :)
Wie hoch denn? Wieviele Stufen willst du auflösen?
> Was bedeutet in diesem Zusammenhang Oversampling?
Man mißt deutlich öfter als man eigentlich muss.
Andreas S. schrieb:> 2. Inkrementalgeber statt Potentiometer
Warum sollte das Signal eines Inkrementalgeber nicht hin- und her
springen, wenn er an einer Grenze steht?
Wolfgang schrieb:> Warum sollte das Signal eines Inkrementalgeber nicht hin- und her> springen, wenn er an einer Grenze steht?
Weiterlesen hilft...
Andreas S. schrieb:> Zu 2.:> Bei einem Inkrementalgeber mit mechanischer Rastung gibt es gar keine> Wackler, sondern die Rastung nicht genau auf einer Kante liegt. Bei> einem Inkrementalgeber ohne Rastung beträgt der Wackler entweder -1 oder> +1 Inkrement bzw. Graycode-Wert. Hier ist die Implementierung einer> Hysteresis sogar noch viel einfacher.
jörn_s schrieb:> Was bedeutet in diesem Zusammenhang Oversampling?
In meinem Aufbau von 2017 fragt der A*-Nano zwei Drehpotis ab.
Beitrag "Re: Leitungsschutzschalter kommt beim Abschalten"
Mein System hat Zeit, man dreht den Knopf ja relativ langsam und der µC
hat dazwischen nicht sonderlich viel zu tun.
Nahe zu den beiden Potis habe ich 1µF Folie zwischen +5V und GND.
Am Schleifer der Drehpotis (10k) sind 220nF nach GND.
Mir ist der Grund nicht klar, aber manchmal liefert analogRead beim
ersten Zugriff Unfug, also einmal lesen und wegwerfen.
Dann hole ich mir 25 Meßwerte mit jeweils 2ms Pause dazwischen. Den
maximalen und minimalen Wert werfe ich weg, teile den Rest durch 23.
Eine Einlesung dauert also kurz über 50ms.
Was ich da an der seriellen Ausgabe sehe, finde ich stabil.
------
Wenn ich mit dem A* analoge Werte verarbeite, mache ich generell
Oversampling. Die Anzahl der Meßwerte und die Pause gucke ich aus, je
nachdem, wie lange es dauern darf.
Abhängig von der Anwendung kann es auch sein, z.B. bei einer
Temperaturregelung, dass ich erst reagiere, wenn der neue Wert um
mindesten X vom letzten abweicht.
jörn_s schrieb:> Gibt es eine Methode, wie man dieses Springen zwischen zwei Werten> softwaremäßig "rausrechnen" kann?
Das Zauberwort heißt Hysterese. Modellbau Servos verhindern so, dass die
bei Erreichen der Soll-Position anfangen, zu knurren und heiß laufen.
In Software könnte das bedeuten, dass du geringe Änderungen (z.B. +/-2)
gegenüber der vorherigen Messung ignorierst. Erst bei größeren
Änderungen reagierst du.
Stefan ⛄ F. schrieb:> Das Zauberwort heißt Hysterese.
Das war die dritte Antwort.
> In Software könnte das bedeuten, dass du geringe Änderungen (z.B. +/-2)> gegenüber der vorherigen Messung ignorierst. Erst bei größeren> Änderungen reagierst du.
Genau damit wirst Du nicht glücklich, weil es Dir nicht möglich ist,
z.b. 100 einzustellen. Du stehst bei 98 und irgendwie "spinnt" das
Dingen dann.
A. S. schrieb:>> In Software könnte das bedeuten, dass du geringe Änderungen (z.B. +/-2)>> gegenüber der vorherigen Messung ignorierst. Erst bei größeren>> Änderungen reagierst du.> Genau damit wirst Du nicht glücklich, weil es Dir nicht möglich ist,> z.b. 100 einzustellen. Du stehst bei 98 und irgendwie "spinnt" das> Dingen dann.
In meiner Software würde das bedeuten, dass ich 16-fach überabtaste,
diese 16 Werte dann mittele und die durch die Überabtastung gewonnenen 4
binären "Nachkommastellen" als Information für die Hysterese verwende.
Lothar M. schrieb:> In meiner Software würde das bedeuten, dass ich 16-fach überabtaste,> diese 16 Werte dann mittele und die durch die Überabtastung gewonnenen 4> binären "Nachkommastellen" als Information für die Hysterese verwende.
Probiers aus, Du wirst Dich wundern.
Ist die Spannung zu glatt, kannst Du nicht ein einziges Bit hinzu
zaubern. Du mußt einen Sägezahn addieren, so daß immer mehrere Werte
durchlaufen werden.
Was aber geht, wenn die reale Auflösung des ADC größer als die
gewünschte Schrittweite ist. Z.B. Du willst 100 Stufen, dann geht ein
10Bit-ADC und eine Hysterese von 5.
jörn_s schrieb:> Was bedeutet in diesem Zusammenhang Oversampling?
Das, was du eigentlich nicht willst:
jörn_s schrieb:> Mittelwertbildungen bringen hier wohl nichts, das verlangsamt,
Nur wird es dann nicht langsamer, wenn du x mal schneller abtastet und
dann x Werte mittelst.
Lothar M. schrieb:> In meiner Software würde das bedeuten, dass ich 16-fach überabtaste,> diese 16 Werte dann mittele und die durch die Überabtastung gewonnenen 4> binären "Nachkommastellen" als Information für die Hysterese verwende.
Je nach Abtastrate oder Anforderungen kann man da viel oder wenig rein
stecken oder besser machen. Und Peter hat natürlich recht, der ADC muss
mindestens 1 Bit mehr auflösen, sonst gibt es keine Möglichkeit,
dauerhaft zu entflackern.
Es ging mir nur darum, dass Stefan nach all der Diskussion quasi wieder
bei 0 (Hysterese) anfing, die halt allein nicht sinnvoll funktioniert.
Zusätzlich zu dem Geagten habe ich die Erfahrung gemacht, daß
ratiometrisches Erfassen von Potie Wertensviel stabilere Werte bringt
und Flackern praktisch überhaupt nicht vorkommt. Man könnte also beim
Erfassen von Potiwerten die AREF auf AVCC umschalten sofern sonst eine
Spannungsreferenz benutzt wird. Also ausprobieren. Es versteht sich von
selber durchdachtes Design und Verdrahtung anzuwenden.