Forum: Mikrocontroller und Digitale Elektronik Digitales Filter


von Deluxe (Gast)


Lesenswert?

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!

von Master S. (snowman)


Lesenswert?

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...

von Glurus (Gast)


Lesenswert?

Das ist ein schwarzes Problem

von Chrislight (Gast)


Lesenswert?

Vielleicht liegt es an der Frequenz deiner CPU? Oder du könnstet einen 
AD-Wandler mit weniger Streuung verwenden...

von Deluxe (Gast)


Lesenswert?

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.

von Rudi (Gast)


Lesenswert?

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.

von Jadeclaw (Gast)


Lesenswert?

@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.

von Rudi (Gast)


Lesenswert?

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.

von Jadeclaw (Gast)


Lesenswert?

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.

von Deluxe (Gast)


Lesenswert?

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?

von Stefan (Gast)


Lesenswert?

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!

von Deluxe (Gast)


Lesenswert?

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?

von Stefan (Gast)


Lesenswert?

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!

von Stefan (Gast)


Lesenswert?

>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...?

von Jadeclaw (Gast)


Lesenswert?

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.

von eProfi (Gast)


Lesenswert?

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?

von Deluxe (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.