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.
:
Bearbeitet durch Moderator
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 reduzieren Andreas 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.
Beitrag #6389490 wurde von einem Moderator gelöscht.
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.
Beitrag #6391225 wurde von einem Moderator gelöscht.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.