He probado algunas técnicas de promedio en ejecución para suavizar el cambio en los datos de ADC en AtMega48 para controlar las luces (PWM) al girar un potenciómetro (ADC).
Los filtros (pseudo códigos):
Media móvil:
adc_avg += new adc_raw;
adc_avg >>= 1;
Filtro de media móvil de 8 puntos :
fill adc_raw_array[i] = adc_raw;
adc_raw_array[8] <-- delete left most, move left, push adc_raw.
adc_avg = sum(adc_raw_array);
adc_avg >>=3 ; // divide by 8
Observé que los filtros son muy bonitos. Pero lento en respuesta lo que se espera.
Estoy buscando técnicas como Promedio móvil exponencial . Se dice que es más receptivo. ¿Hay otro como este? Como dice:
adc_Eavg = α * adc_raw + ( 1 - α ) * adc_Eavg ;
donde α está entre 0 y 1.
Cómo codificar y optimizar esos; código sabio (sin usar flotadores) ? O ¿Cómo convertiría los flotantes en enteros correspondientes para hacer código pequeño, rápido y sensible?
Lo intenté como
adc_Eavg += α * ( adc_raw - adc_Eavg );
y seguí α = 1;
Aparte de eso, no funcionará como se esperaba. Porque tendría que cambiar todas las variables para flotar.
Por favor, no se concentre en la siguiente declaración por el momento, pero tenga en cuenta. Mantener flotantes en mi base de código está llenando la memoria del programa del 45% al 137%, en caso de
adc_avg = adc_avg * 0.8f + adc_raw * 0.2f;