2017-04-26 5 views
0

Ich möchte einen gleitenden Durchschnitt oder etwas Ähnliches machen, weil ich laute Werte von ADC bekomme, dies ist mein erster Versuch, um den gleitenden Durchschnitt zu berechnen, aber die Werte gehen jedesmal auf 0, kannst du mir helfen?Gleitender Durchschnitt mit dem Lesen von ADC-Werten

Dies ist Teil des Codes, die diese Magie macht:

unsigned char buffer[5]; 
    int samples = 0; 
    USART_Init0(MYUBRR); 
    uint16_t adc_result0, adc_result1; 
    float ADCaverage = 0; 

    while(1) 
    { 

     adc_result0 = adc_read(0);  // read adc value at PA0 
     samples++; 
     //adc_result1 = adc_read(1);  // read adc value at PA1 

     ADCaverage = (ADCaverage + adc_result0)/samples; 

     sprintf(buffer, "%d\n", (int)ADCaverage); 
     char * p = buffer; 
     while (*p) { USART_Transmit0(*p++); } 
     _delay_ms(1000); 
    } 
    return(0); 
} 

Dieses Ergebnis, das ich über USART sende Wert anzuzeigen.

+0

Ihre Gleichung nicht korrekt ist, versuchen Sie mit 'ADCaverage + = (adc_result0-ADCaverage)/samples;' – eyllanesc

+0

ty Kumpel, es funktioniert – Branis

+0

Wenn Lärm ein Problem ist, möchten Sie vielleicht auch ganze Zahlen verwenden und schweben nicht. – Lundin

Antwort

1

Ihre Gleichung ist nicht korrekt.

Lassen s_n = (sum_{i=0}^{n} x[i])/n dann:

s_(n-1) = sum_{i=0}^{n-1} x[i])/(n-1) 

sum_{i=0}^{n-1} x[i] = (n-1)*s_(n-1) 
sum_{i=0}^{n} x[i] = n*s_n 


sum_{i=0}^{n} x[i] = sum_{i=0}^{n-1} x[i] + x[n] 

n*s_n = (n-1)*s_(n-1) + x[n] = n*s_(n-1) + (x[n]-s_(n-1)) 
s_n = s_(n-1) + (x[n]-s_(n-1))/n 

Sie

ADCaverage += (adc_result0-ADCaverage)/samples; 
0

verwenden müssen, können Sie einen exponentiellen gleitenden Durchschnitt verwenden, die nur benötigt 1 Speichereinheit.
y[0] = (x[0] + y[-1] * (a-1))/a
Dabei ist ein der Filterfaktor.

Wenn ein ist ein Vielfaches von 2 Sie Verschiebungen können und deutlich für Geschwindigkeit optimieren:
y[0] = (x[0] + ((y[-1] << a) - y[-1])) >> a

Das funktioniert besonders gut mit linksbündig ADCs. Behalten Sie die Wortgröße des Shiftergebnisses im Auge.

Verwandte Themen