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...
Vielleicht liegt es an der Frequenz deiner CPU? Oder du könnstet einen AD-Wandler mit weniger Streuung verwenden...
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?
Besten Dank für eure Hilfe. Ich verwende den ADuC7021! Ich werde eure Tipps sicher einmal versuchen.
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.