A veces lo que parece simple no es tan simple. Tiene que realizar una medición bastante compleja, pero desea un resultado simple. Lo que quieres medir no es constante, varía en el tiempo. Dependiendo de su nivel de requerimiento, podría calcular una o varias propiedades del consumo actual. Estas propiedades lo ayudarán a monitorear mejor el sistema. Te propongo 3 soluciones diferentes, en complejidad ascendente.
Solución 1: promedio
Desea obtener un resultado de un valor -> obtenga el promedio en el tiempo. Como ya propuso @akellyirl, use un filtro de paso bajo. Calcule float y = alpha*input + (1-alpha)*y
para cada muestra, donde alpha
está el factor de suavizado. Ver Wikipedia para los detalles.
Solución 2: Max + Promedio
Es interesante obtener el promedio y el valor máximo. Monitorear el valor máximo podría ser interesante para el dimensionamiento de componentes, por ejemplo.
if (y > max)
max = y;
Solución 3: Desviación estándar + Max + Promedio
¿Por qué?
Ver abajo los cuadros. Hay 3 señales de diferentes formas. Un triángulo , un seno y una señal de pico . Todos son periódicos con el mismo período, la misma amplitud , el mismo promedio y el mismo mínimo y máximo . Pero, tienen formas diferentes, y de hecho tienen una historia completamente diferente ...
Una de las diferencias es la desviación estándar. Es por eso que le sugiero que extienda sus medidas e incluya la desviación estándar. El problema es que la forma estándar de calcularlo consume mucha CPU. Con suerte, hay una solución.
¿Cómo?
Usa el método del histograma . Cree un histograma de todas las mediciones y extraiga de manera eficiente las estadísticas (mín., Máx., Promedio, desviación estándar) del conjunto de datos. El histograma agrupa valores que tienen el mismo valor o el mismo rango de valores. La ventaja es evitar almacenar todas las muestras (aumento del conteo en el tiempo) y tener un cálculo rápido en un número limitado de datos.
Antes de comenzar a adquirir mediciones, cree una matriz para almacenar el histograma. Es una matriz entera de 1 dimensión, de tamaño 32 por ejemplo:
int histo[32];
Dependiendo del rango del amperímetro, adapte la siguiente función. Por ejemplo, si el rango es de 256 mA, 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 ... Entonces, necesitará un número entero para representar el número del contenedor de histograma:
short int index;
Cada vez que obtenga una muestra, busque el índice bin correspondiente:
index = (short int) floor(yi);
E incremente este bin:
histo[index] += 1;
Para calcular la media, ejecute este ciclo:
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 ciclo:
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 es realizar operaciones lentas en un número reducido de bins, en lugar de todas las muestras de señales adquiridas. Cuanto más largo sea el tamaño de la muestra, mejor. Si desea más detalles, lea esta página interesante El histograma, Pmf y Pdf .