Hi Leute,
als Lehrabschlussarbeit habe ich ein Projekt erhalten bei welchem
eine analoge Spannung in 12-Bit digital umgewandelt wird. 8 Eingänge
werden
über einen Multiplexer, nacheinander zum A/D Wandler geschaltet und
gewandelt. Die Kanalwahl wird über einen Master ausgewählt.
Zu meinem Problem:
Wandle ich nun z.B. einen 5V analog Wert, so erhalte ich digitale Werte
von 2045-2055. Diese Streuung ist viel zu gross. Zu erwähnen ist, dass
sonst ein schönes Histogramm(schöne Gausskurve), mit 2 Hauptwerten und
Werten die teilweise daneben liegen, entsteht. Nun möchte ich diese
Werte digital Filtern damit keine grosse Streuung mehr entsteht. Wie man
das Programmieren könnte um dies zu Filtern weiss ich leider nicht!
Im Internet findet man FIR oder IIR-Filter, leider hat es mich dies
nicht weitergebracht.
Vielleicht könnt Ihr mir helfen!?
Besten Dank für eure Bemühungen!
ich würde zuerst einmal klären, ob dein 5V-signal oder deine
referenz-spannung nicht verrauscht ist, ansonsten bringt dir ein filter
sowieso nicht viel...
Die Spannung ist nicht verrauscht und somit auch sehr schön.
Mit der Wandlung bin ich sehr zufrieden, allerdings muss ein
digitales Filter programmiert werden. Diese Abweichungen bei den Werten,
liegen daran dass die Wandlung teilweise durch die Kommunikation gestört
wird. Diese kleine Streuungen möchte ich nun per digitales Filter
herausfiltern.
Ein Filter bringt Dir nur etwas wenn Du die Störung im Frequenzbereich
lokalisieren kannst. Aber so einfach mit "Hau-Ruck" ein Filter
anzuwenden ohne zu wissen was es tut oder tun soll ist nicht der beste
Weg.
Wenn ich mal Zeit habe (seufz... Sch... Konjunktiv) werde ich mal ein
Tutorium für digitale Filter hier reinstellen.
@Deluxe:
Was du machen willst, ist eine Mittelwertbildung.
Dazu kannst du z.B. 8 ADC-Ergebnisse addieren, dann teilst du das dann
durch 8, in dem du das Ganze 3 Binärstellen nach rechts schiebst. Das
verlangsamt die Messerei zwar, aber das Resultat wird merklich ruhiger,
d.h. weniger springen zwischen den Werten.
Bei 12Bit geht das problemlos in einem 16Bit-Register ab.
Gruß
Jadeclaw.
Na ob er das machen will weiß er ja noch nicht. Eine Tiefpaß-Filterung
wird sicher gegen hochfrequente Störungen helfen. Aber konnte man nicht
bei vielen Mikrocontrollern den CPU-Kern für die Wandlung stillegen -
extra um solche Interferenzen zu vermeiden?
Mein Rat wäre die Störung im Frequenzbereich zu analysieren.
Richtig. Das wichtigste ist es, erstmal das Signal selbst nicht zu
verschmutzen.
> Aber konnte man nicht bei vielen Mikrocontrollern den> CPU-Kern für die Wandlung stillegen - extra um solche Interferenzen zu> vermeiden?
Richtig, die AVR-Controller haben einen Noise-Reduction-Mode, bei dem
für die Wandlung der Kern in den Sleep geschickt wird. bei anderen Typen
--> Datenblatt studieren.
Gruß
Jadeclaw.
Nun ja dass mit der mittelwert Berechnung wäre eine gute Idee.
Die gewandelten Werte sind sehr genau, diese habe ich einmal ohne
Kommunikation abgespeichert. Läuft die Kommunikation, so unterbricht
diese teilweise die Wandlung und stört diese damit.
Gibt es noch andere Möglichkeiten, die der mittelwert Berechnung
gleichen?
Digitale Filterung hin oder her...
>Läuft die Kommunikation, so unterbricht>diese teilweise die Wandlung und stört diese damit.
Dann behaupte ich mal, Dein Programm ist falsch gestrickt!
Fehler beheben, bisschen mitteln -> gut is!
Die Kommunikation hat Priorität und ist in den FIQ gelöst.
Die Wandlung in den IRQ`s. Da ein FIQ Priorität hat, wie soll ich dann
die Wandlung realisieren ohne dass diese unterbrochen werden kann?
Ich kenne Deinen Controller nicht (zumindest kenn ich FIQ nicht).
Ich meinte nur, dass es meiner Meinung nach ein Programmfehler ist, wenn
eine ADC-Messung unterbrochen wird, dadurch einen falschen Messwert
liefert und dieser trotzdem verwendet wird.
Irgendwie würde ich mir eine Logik ausdenken, die den Messwert verwirft,
wenn die Kommunikation dazwischengefunkt hat...
... oder natürlich noch besser: Das Dazwischenfunken kommt erst gar
nicht vor!
>Die Wandlung in den IRQ`s. Da ein FIQ Priorität hat, wie soll ich dann>die Wandlung realisieren ohne dass diese unterbrochen werden kann?
Wie wär's den ADC-IRQ während der Kommunikation temporär zu
deaktivieren...?
Im Grunde genommen bleiben nur 2 Möglichkeiten:
Entweder die IRQs tauschen, sprich den FIQ für die Wandlung und einen
normalen IRQ für die Kommunikation oder, wenn das Protokoll es
ermöglicht, die Kommunikation mit einem Busy-Code für den Zeitraum der
Wandlung zu blockieren, wie früher bei Modems mit XON / XOFF. Das
Platinenlayout/Schaltung könnten hier auch eine Rolle spielen, speziell
wenn der Kommunikationsport nicht galvanisch getrennt ist.
Gruß
Jadeclaw.
Da fallen mir mehrere Möglichkeiten ein:
1. gleitendes Mittelwertfilter nach jeder Wandlung:
Mittelwert += ADCwert - (Mittelwert >> 3);
das bewirkt, dass der Mittelwert auf den 8-fachen Wert des ADCwertes
ansteigt.
Willst Du den Wert auswerten (übertragen), verwende Mittelwert >> 3.
Wenn der Wertebereich es erlaubt (Vorzeichen und Overflow der 16-Bit
beachten) kannst Du auch statt 3 4 verwenden, dann wird die
Filterwirkung stärker, aber die Reaktion auf Änderungen langsamer.
Ist der Messwert eine konstante Spannung, dann könntest Du ein
gewichtetes Filter verwenden, bei dem Werte, die weiter vom Durchschnitt
liegen, schwächer oder garnicht gewertet werden.
2. echtes Digitalfilter (FIR oder IIR) ginge zwar auch, ist aber schwer
zu verstehen, anzupassen und zu debuggen (falls es nicht gleich klappt).
Man kann hier viel falsch machen und es gar nicht merken.
3. Untersuchen, warum und wann genau falsche Werte kommen. Das sollte
eigentlich nicht sein! Am besten nicht (oder nur wenig) an den Werten
rumfiltern, sondern nach der Ursache suchen.
Welchen Controller verwendest Du?