A veces lo que parece sencillo no lo es tanto. Tienes que hacer una medición bastante compleja, pero quieres un resultado sencillo. Lo que quieres medir no es constante, sino que varía en el tiempo. Dependiendo de su nivel de exigencia, puede calcular una o varias propiedades del consumo de corriente. Estas propiedades te ayudarán a controlar mejor el sistema. Te propongo 3 soluciones diferentes, en complejidad ascendente.
Solución 1: Media
Quiere obtener un resultado de un valor -> obtener la media en el tiempo. Como ya propuso @akellyirl, utiliza un filtro de paso bajo. Calcula float y = alpha*input + (1-alpha)*y
para cada muestra, donde alpha
es el factor de suavización. Véase Wikipedia para los detalles.
Solución 2: Máximo + Promedio
Te interesa obtener la media, y el valor máximo. El seguimiento del valor máximo podría ser interesante para el dimensionamiento de los componentes, por ejemplo.
if (y > max)
max = y;
Solución 3: Desviación estándar + Max + Media
¿Por qué?
Vea los gráficos de abajo. Hay 3 señales de diferentes formas. A triángulo , a sine y un espiga señal. Todas son periódicas con el mismo periodo, el mismo amplitud , igual media y lo mismo min y max . Pero, tienen formas diferentes, y de hecho tienen una historia completamente diferente...
Una de las diferencias es la desviación estándar. Por eso te sugiero que amplíes tus mediciones e incluyas la desviación estándar. El problema es que la forma estándar de calcularla consume mucha CPU. Afortunadamente, hay una solución.
¿Cómo?
Utilice el histograma método. Construye un histograma de todas las mediciones y extrae de forma eficiente las estadísticas (mínimo, máximo, promedio, desviación estándar) del conjunto de datos. El histograma agrupa los valores que tienen el mismo valor, o el mismo rango de valor. La ventaja es evitar el almacenamiento de todas las muestras (el aumento de la cuenta en el tiempo), y tener un cálculo rápido en un número limitado de datos.
Antes de empezar a adquirir mediciones, cree una matriz para almacenar el histograma. Se trata de un array de 1 dimensión entera, de tamaño 32 por ejemplo:
int histo[32];
Dependiendo del rango del amperímetro, adapte la función de abajo. Por ejemplo, si el rango es de 256mA significa que el bin 0 del histograma se incrementará en un valor entre 0 y 8 mA, el bin 1 en un valor entre 8 y 16 mA, etc... Por lo tanto, necesitarás un número entero para representar el número del bin del histograma:
short int index;
Cada vez que obtengas una muestra, encuentra el índice de la bandeja correspondiente:
index = (short int) floor(yi);
E incrementa esta papelera:
histo[index] += 1;
Para calcular la media, ejecute este bucle:
float mean = 0;
int N = 0;
for (i=0; i < 32 ; i++) {
mean = i * histo[i]; // sum along the histogram
N += i; // count of samples
}
mean /= N; // divide the sum by the count of samples.
mean *= 8; // multiply by the bin width, in mA: Range of 256 mA / 32 bins = 8 mA per bin.
Para calcular la desviación estándar, ejecute este bucle:
float std_dev = 0;
for (i=0; i < 32 ; i++) {
std_dev = (i - mean) * (i - mean) * histo[i]; // sum along the histogram
}
std_dev /= N; // divide the sum by the count of samples.
std_dev = sqrt(std_dev); // get the root mean square to finally convert the variance to standard deviation.
La estrategia del método del histograma consiste en realizar las operaciones lentas en un número reducido de bins, en lugar de en todas las muestras de señal adquiridas. Cuanto mayor sea el tamaño de la muestra, mejor. Si quieres más detalles, lee esta interesante página Histograma, Pmf y Pdf .