Ein logarithmisches Poti wird per AD Wandler eines AVR ausgelesen. Gibt es raffinierte Algorithmen, wie man auf einem 8-Bit Mikrocontroller diese Messwerte wieder linearisieren kann? Mir fällt da nur eine LUT ein, aber die braucht mir zu viel Platz.
>Gibt es raffinierte Algorithmen, wie man auf einem 8-Bit Mikrocontroller >diese Messwerte wieder linearisieren kann? Ja, man lötet das logaritmische aus und ein lineares ein.
Sorry, dass ich nicht erwähnt hatte, dass eine elektronische / mechanische Modifikation des Eingangssignals keine Option ist. Da ich explizit nach einer algorithmischen Lösung fragte, hielt ich das für überflüssig. Hintergrund: Mit dem Poti wird eine analoge Elektronik gesteuert. Durch ein Stereo-Poti ersetzt habe ich zwar einen separaten Kanal für den AD Wandler des Mikrocontrollers, aber der ist dann immer noch logarithmisch.
Thomas M. schrieb: > Hintergrund: Mit dem Poti wird eine analoge Elektronik gesteuert. Durch > ein Stereo-Poti ersetzt habe ich zwar einen separaten Kanal für den AD > Wandler des Mikrocontrollers, aber der ist dann immer noch > logarithmisch. Dann ersetz die Widerstandsbahn des zweiten Potis durch die eines baugleichen linearen Potis. Grundsätzlich kannst Du mit dem µC zwar auch per Formel mathematisch delogarithmieren; das wird aber m.E. wesentlich aufwändiger als das Auslesen einer Tabelle. Gruss Harald
Da die meisten Mikrokontroller auch rechnen können ist das eigentlich kein Problem. Wie bereits angedeutet könnte auch eine Tabelle helfen. Bedingt durch die Kennlinie selbst wirst Du aber hinter einem 10- oder 12-Bit-Wandler, mächtig Abstriche von der Genauigkeit bzw. der Auflösung machen müssen.
Ich vergaß: Es gibt natürlich auch analoge Lösungen. Die Meisten aber erfordern eine trickreiche Temperaturkompensation, da sie häufig an Dioden- oder Transistorkennlinien arbeiten. Möglicherweise haben aber Analog Devices oder TI oder ... auch fertige Schaltungen zu diesem Zweck.
Amateur schrieb: > mächtig Abstriche von der Genauigkeit Bei einem logarithmischen Poti sind Fehler von 10...30% üblich.
Also logarithmisches rechnen auf einem Mikrocontroller benötigt auch einiges an Instuktionen - unterschätze das nicht. Wenn dir eine Tabelle zu groß ist, solltest du evtl an einen Algorithmus denken, der die Tabelle verkleinert. Man muss z.B. nicht jeden Punkt speichern sondern: 1) Erstmal nur 3..4 Werte gleichverteilt über den gesamten Messbereich Dann Kubisch Interpolieren und mit dem Sollwert vergleichen 2) Dort, wo die Abweichung durch das Interpolieren zu groß werden, fügst du eine weitere Stützstelle in deine Tabelle ein. Und zwar dort, wo das Maximum der Abweichung war. 3) Das wiederholst du so lange, bis du bei einer zufriedenstellenden Genauigkeit angelangt bist. Durch das Kubische interpolieren wirst du merken, dass du der Kurvenform mit schon recht wenig stützstellen recht nahe kommst. Das ist schnell, Platzeffizient, und wenn du einmal die Minimal-Tabelle gefunden hast auch extrem platzsparend, da weder Tabelle noch der Auslese-Algorithmus besonders kompliziert sind.
>Durch >ein Stereo-Poti ersetzt habe ich zwar einen separaten Kanal für den AD >Wandler des Mikrocontrollers, aber der ist dann immer noch >logarithmisch. Dann miss mal ein paar Spannungen für ein paar Stellungen mit deinem Multimeter an deinem logarithmischen Poti. Dann rechnest du dir aus wie gut du diese mit einem 10Bit ADC überhaupt auswerten kannst. Wahrscheinlich reicht die Auflösung des ADC dafür gar nicht. Was ist das überhaupt für eine Schaltung an der dein Poti hängt?
Sicherlich hilft schon ein geschickt platzierter Widerstand.
Logarithmische Potis sind in Wahrheit auch seltenst solche, sondern haben meist eine aus etlichen linearen Stücken mehr oder weniger sorgfältig angenäherte Kennlinie. Wenn es also nur um ein Einzelexemplar geht, könnte Ausmessen der Kennlinie dabei helfen, die Kennlinie ebenfalls stückweise linear zurückzuinterpolieren. XL
Axel Schwenke schrieb: > Wenn es also nur um ein Einzelexemplar geht, könnte Ausmessen der > Kennlinie dabei helfen, die Kennlinie ebenfalls stückweise linear > zurückzuinterpolieren. ...und dann wird das mit dem Rechnen noch aufwändiger. Ich halte die LUT für die günstigste Variante. AD beim AVR sind 10 Bit, also 2kB Platzbedarf, angesichts der Genauigkeit reichen womöglich schon 1kB. Das Einbinden der math-Lib braucht wahrscheinlich mehr Platz. Volker
Danke für die Ideen! Ich werde mal den Ansatz probieren den 10-Bit Wertebereich in Segmente zu unterteilen, die Segmente unterschiedlich zu stauchen und dann ggfs durch eine entsprechend kleine LUT zu schicken. Wenn ich damit die Potistellung mit einer Auflösung von 6 Bit ermitteln kann, reicht mir das. (Heimlich hatte ich ja gehofft, dass es möglicherweise irgendeine pfiffige Bitschubserei und -rollerei gibt.)
Möglicherweise gibt es auch einen Mittelweg. Du misst das Poti aus und zerlegst den Arbeitsbereich in z.B. 5 Segmente mit jeweils eigener, linearer Steigung. Das wäre mathematisch nicht besonders anspruchsvoll (Zeitintensiv) und lässt den Platz für andere Tabellen frei.
Thomas M. schrieb: > wenn ich damit die Potistellung mit einer Auflösung von 6 Bit > ermitteln kann, reicht mir das. Dann brauchst du auch nur eine Tabelle mit 64 Einträgen. Dann suchst du einfach mit deinem ADC-Wert in der Tabelle, zwischen welchen 2 Stützstellen der liegt. Ob 8 Bit ADC-Auflösung reichen, mußt du ausprobieren. Das würde die Tabelle nochmal verkleinern. XL
.... schrieb: > Also logarithmisches rechnen auf einem Mikrocontroller benötigt auch > einiges an Instuktionen - unterschätze das nicht. Wenn Du es schaffst, das Poti schneller zu drehen, als der MC Logarithmen rechnen kann, dann wird der Poti-Schleifer durch die Reibung rot glühen oder er reißt durch die Fliehkraft einfach ab. Echte logarithmische Potis wird man heutzutage kaum finden, um ein Ausmessen wird man daher nicht drumrum kommen. Oftmals sind es nur 2 verschiedene Bahnsegmente, dann reichen 2 Geraden.
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.