2017-04-26 36 views
0

이동 평균을 계산하려고합니다. ADC에서 시끄러운 값을 얻고 있기 때문에 이동 평균을 계산하려고합니다. 그러나 이동 평균을 계산하기 위해 값을 매번 0으로 설정합니다. 너 나 좀 도와 줄 수있어? 내가 값을 표시 USART를 통해 전송하고ADC 값을 읽음으로써 부동 소수점

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

이 결과 :

이이 마법을 만드는 코드의 일부이다.

+0

방정식이 올바르지 않습니다. ADCaverage + = (adc_result0-ADCaverage)/samples;을 시도하십시오. – eyllanesc

+0

ty mate, 작동합니다. – Branis

+0

노이즈가 염려되는 경우 정수를 사용하고 플로트하지 않을 수도 있습니다. – Lundin

답변

1

방정식이 올바르지 않습니다.

다음 s_n = (sum_{i=0}^{n} x[i])/n을 보자

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 

당신은

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

당신은 단지 1 개 메모리 유닛을 필요로하는 지수 이동 평균을 사용하여 사용해야합니다.
y[0] = (x[0] + y[-1] * (a-1))/a
은 필터 요소입니다.
y[0] = (x[0] + ((y[-1] << a) - y[-1])) >> a

이 왼쪽 정렬 ADC의와 특히 잘 작동 :

경우 당신이 변화를 사용하고 상당히 속도를 최적화 할 수 있습니다 2의 배수이다. 교대 결과의 단어 크기를 계속 주시하십시오.