IIR Filter mit Mega 16

OP #4718672
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:
1
int main(void)
2
{
3
  float a[3], b[3], w[3]={0,0,0};
4
  //koeffizienten
5
  a[0]=1;
6
  a[1]=-1.9961;
7
  a[2]=0.5157;
8
  b[0]=1;
9
  b[1]=1.9961;
10
  b[2]=1;
11
  float y=0;
12
  float sample;
13
  DDRA=0x00;
14
  DDRC=0xff;
15
  ADMUX|=(1<<REFS0);
16
  ADCSRA|=(1<<ADEN)|(1<<ADSC);
17

18
    while (1) 
19
    {
20
  ADCSRA|=(1<<ADSC);
21
  while(ADCSRA &(1<<ADSC));
22
  sample = ADC;  
23
    w[0]=a[0]*sample-a[1]*w[1]-a[2]*w[2];
24
    y=b[0]*w[0]+b[1]*w[1]+b[2]*w[2];
25
    //w[2]=w[1];
26
    //w[1]=w[0];
27
    PORTC=y;
28
    _delay_ms(1);
29
    }
30
}

Koeffizienten habe ich mit Matlab (fdatool) ausgerechnet.
#4718719
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.
(Firma: matzetronics) #4718891
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/ece4760/Math/Floating_point/
Gast #4718896
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren