Forum: Mikrocontroller und Digitale Elektronik ADC-Werte entflackern


von jörn_s (Gast)


Lesenswert?

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.

von Anselm (Gast)


Lesenswert?

Oversampling und dann reduzieren

von ths (Gast)


Lesenswert?

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.

von Udo S. (urschmitt)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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.

: Bearbeitet durch Moderator
von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

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.

von jörn_s (Gast)


Lesenswert?

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 reduzieren

Andreas S. schrieb:
> 1. analoges Tiefpassfilter + digitales Oversampling + Erzeugen einer
> Hysteresis

Was bedeutet in diesem Zusammenhang Oversampling?

von A. S. (Gast)


Lesenswert?

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.

von jörn_s (Gast)


Lesenswert?

Das klingt clever :)

von Falk B. (falk)


Lesenswert?

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.

Beitrag #6389490 wurde von einem Moderator gelöscht.
von Wolfgang (Gast)


Lesenswert?

Andreas S. schrieb:
> 2. Inkrementalgeber statt Potentiometer

Warum sollte das Signal eines Inkrementalgeber nicht hin- und her 
springen, wenn er an einer Grenze steht?

von M. P. (phpmysqlfreak)


Lesenswert?

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.

von Manfred (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von A. S. (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

Beitrag #6391225 wurde von einem Moderator gelöscht.
von HildeK (Gast)


Lesenswert?

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.

von A. S. (Gast)


Lesenswert?

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.

von Zerberus (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.