mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik IIR Filter mit Mega 16


Autor: Daniel Bechter (yzdani)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

möchte ein IIR Filter "basteln".
Fpass 100Hz
Fs=1Khz

Der Wert nach dem Filte soll danach auf Port C ausgegeben werden
Umso mehr ich die Frequenz erhöhe sollten dann immer ein kleinerer binär 
wert am Port C anliegen.
Nun ja bei einem Hz blinken die Leds am Port C aber wenn ich die 
Frequenz erhöhe leuchten die Leds dann immer gleich.

Der Sinus hat 1V offset und 1V Amplitude
ADC funktioniert

Was mach ich falsch?
Hat mir jemand ein Lösungsansatz?

Code:
int main(void)
{
  float a[3], b[3], w[3]={0,0,0};
  //koeffizienten
  a[0]=1;
  a[1]=-1.9961;
  a[2]=0.5157;
  b[0]=1;
  b[1]=1.9961;
  b[2]=1;
  float y=0;
  float sample;
  DDRA=0x00;
  DDRC=0xff;
  ADMUX|=(1<<REFS0);
  ADCSRA|=(1<<ADEN)|(1<<ADSC);

    while (1) 
    {
  ADCSRA|=(1<<ADSC);
  while(ADCSRA &(1<<ADSC));
  sample = ADC;  
    w[0]=a[0]*sample-a[1]*w[1]-a[2]*w[2];
    y=b[0]*w[0]+b[1]*w[1]+b[2]*w[2];
    //w[2]=w[1];
    //w[1]=w[0];
    PORTC=y;
    _delay_ms(1);
    }
}

Koeffizienten habe ich mit Matlab (fdatool) ausgerechnet.

Autor: Jim Meba (turboj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit den Auskommentierten 2 Zeilen ist das eine 1-Stufige IIR, da w[1] 
und w[2] immer Null sind.

Höhere Frequenzen würden einen Logic analyser erfordern, menschliche 
Augen sind eher langsam und können zu schnelles Blinken nicht erkennen.

Workaround: Delay verlängern und mit so niedrigen Frequenz testen, wo 
die Augen noch schnell genug fürs LED Blinken sind.

Autor: Matthias S. (Firma: matzetronics) (mschoeldgen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel R. schrieb:
> PORTC=y;

Schau dir mal an, wie ein float intern im AVR representiert wird und was 
passiert, wenn man das ohne jedes Casting auf einen 8-Bit Port schreibt. 
Da kann nichts vernünftiges bei passieren. Du kannst mal wenigstens 
einen 16-bit Timer für PWM konfigurieren und den als Ausgang nach einer 
float2short Umsetzung benutzen.
https://gcc.gnu.org/wiki/avr-gcc
https://people.ece.cornell.edu/land/courses/ece476...

: Bearbeitet durch User
Autor: Peter II (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Matthias S. schrieb:
> Schau dir mal an, wie ein float intern im AVR representiert wird

das spielt überhaupt keine rolle.

> wenn man das ohne jedes Casting auf einen 8-Bit Port
> rauswirft.
das ist klar in C definiert.

Ob es das ist was er will, kann ich aber nicht erkennen. Grundsätzlich 
falsch ist es zumindest nicht.

Autor: Matthias S. (Firma: matzetronics) (mschoeldgen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter II schrieb:
> das ist klar in C definiert.

Definiert ist es, sonst hätte sich der Kompiler geweigert. Aber es ist 
nicht das, was der TE am Ausgang erwartet.

Autor: Peter II (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Matthias S. schrieb:
> Definiert ist es, sonst hätte sich der Kompiler geweigert. Aber es ist
> nicht das, was der TE am Ausgang erwartet.

und was soll da der Hinweis auf die interne Darstellung von Float?

Antwort schreiben

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

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.