2017-04-26 6 views
0

Je veux faire une moyenne mobile ou quelque chose de similaire, parce que je reçois des valeurs bruyantes de l'ADC, c'est mon premier essai, juste pour calculer la moyenne mobile, mais les valeurs vont à 0 à chaque fois, Pouvez-vous m'aider?Moyenne flottante avec lecture des valeurs ADC

Cela fait partie du code, ce qui rend cette magie:

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); 
} 

Ce résultat j'envoie via USART à la valeur afficher.

+0

Votre équation n'est pas correcte, essayez avec 'ADCaverage + = (adc_result0-ADCaverage)/samples;' – eyllanesc

+0

ty mate, ça marche – Branis

+0

Si le bruit est une préoccupation, vous pouvez également utiliser des entiers et ne pas flotter. – Lundin

Répondre

1

Votre équation est incorrecte.

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

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 

Vous devez utiliser

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

Vous pouvez utiliser une moyenne qui n'a besoin que d'une unité mobile exponentielle de la mémoire.
y[0] = (x[0] + y[-1] * (a-1))/a
un est le facteur de filtre.

Si un est un multiple de 2, vous pouvez utiliser des changements et d'optimiser la vitesse de manière significative:
y[0] = (x[0] + ((y[-1] << a) - y[-1])) >> a

Cela fonctionne particulièrement bien avec aligné à gauche ADC. Gardez juste un oeil sur la taille des mots du résultat du changement.