www.mikrocontroller.net

Forum: Mikrocontroller und Elektronik Digitales Filter

Autor: Deluxe (Gast)
Datum: 12.03.2008 11:26

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!
Autor: Master Snowman (snowman)
Datum: 12.03.2008 11:31

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...
Autor: Glurus (Gast)
Datum: 12.03.2008 11:35

Das ist ein schwarzes Problem
Autor: Chrislight (Gast)
Datum: 12.03.2008 11:35

Vielleicht liegt es an der Frequenz deiner CPU? Oder du könnstet einen
AD-Wandler mit weniger Streuung verwenden...
Autor: Deluxe (Gast)
Datum: 12.03.2008 11:38

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.
Autor: Rudi (Gast)
Datum: 12.03.2008 11:39

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.
Autor: Jadeclaw (Gast)
Datum: 12.03.2008 11:39

@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.
Autor: Rudi (Gast)
Datum: 12.03.2008 11:45

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.
Autor: Jadeclaw (Gast)
Datum: 12.03.2008 11:52

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.
Autor: Deluxe (Gast)
Datum: 12.03.2008 12:04

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?
Autor: Stefan (Gast)
Datum: 12.03.2008 12:11

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!
Autor: Deluxe (Gast)
Datum: 12.03.2008 12:15

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?
Autor: Stefan (Gast)
Datum: 12.03.2008 12:20

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!
Autor: Stefan (Gast)
Datum: 12.03.2008 12:21

>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...?
Autor: Jadeclaw (Gast)
Datum: 12.03.2008 12:22

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.
Autor: eProfi (Gast)
Datum: 12.03.2008 12:44

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?
Autor: Deluxe (Gast)
Datum: 12.03.2008 20:14

Besten Dank für eure Hilfe.

Ich verwende den ADuC7021! Ich werde eure Tipps sicher einmal
versuchen.

Antwort schreiben

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net