Parfois, ce qui semble simple n'est pas si simple. Vous avez une mesure assez complexe à faire, mais vous voulez un résultat simple. Ce que vous voulez mesurer n'est pas constant, il varie dans le temps. Selon votre niveau d'exigence, vous pouvez calculer une ou plusieurs propriétés de la consommation actuelle. Ces propriétés vous aideront à mieux surveiller le système. Je vous propose 3 solutions différentes, en complexité croissante.
Solution 1: moyenne
Vous voulez obtenir un résultat à valeur unique -> obtenir la moyenne dans le temps. Comme déjà proposé par @akellyirl, utilisez un filtre passe-bas. Calculez float y = alpha*input + (1-alpha)*y
pour chaque échantillon, où alpha
est le facteur de lissage. Voir Wikipedia pour les détails.
Solution 2: Max + Moyenne
Vous êtes intéressant d'obtenir la moyenne et la valeur maximale. La surveillance de la valeur max pourrait être intéressante pour le dimensionnement des composants par exemple.
if (y > max)
max = y;
Solution 3: écart type + Max + Moyenne
Pourquoi?
Voir les graphiques ci-dessous. Il y a 3 signaux de formes différentes. Un triangle , un sinus et un signal de pointe . Ils sont tous périodiques avec la même période, la même amplitude , la même moyenne et les mêmes valeurs min et max . Mais, ils ont des formes différentes, et en effet ils ont une histoire complètement différente ...
L'une des différences est l'écart type. C'est pourquoi je vous suggère d'étendre vos mesures et d'inclure l'écart type. Le problème est que la façon standard de le calculer consomme beaucoup de CPU. J'espère qu'il y a une solution.
Comment?
Utilisez la méthode de l' histogramme . Construisez un histogramme de toutes les mesures et extrayez efficacement les statistiques (min, max, moyenne, écart-type) de l'ensemble de données. L'histogramme regroupe les valeurs qui ont la même valeur ou la même plage de valeurs. L'avantage est d'éviter de stocker tous les échantillons (augmentation du nombre dans le temps), et d'avoir un calcul rapide sur un nombre limité de données.
Avant de commencer l'acquisition des mesures, créez un tableau pour stocker l'histogramme. Il s'agit d'un tableau entier à 1 dimension, de taille 32 par exemple:
int histo[32];
Selon la plage de l'ampèremètre, adaptez la fonction ci-dessous. Par exemple, si la plage est de 256mA, cela signifie que la case 0 de l'histogramme sera incrémentée d'une valeur comprise entre 0 et 8 mA, la case 1 d'une valeur comprise entre 8 et 16 mA etc ... Donc, vous aurez besoin d'un entier pour représenter le numéro de l'histogramme:
short int index;
Chaque fois que vous obtenez un échantillon, recherchez l'index de corbeille correspondant:
index = (short int) floor(yi);
Et incrémentez ce bac:
histo[index] += 1;
Pour calculer la moyenne, exécutez cette boucle:
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.
Pour calculer l'écart type, exécutez cette boucle:
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 stratégie de la méthode de l'histogramme consiste à effectuer les opérations lentes sur quelques nombres de casiers, au lieu de tous les échantillons de signaux acquis. Plus la taille de l'échantillon est longue, mieux c'est. Si vous voulez plus de détails, lisez cette page intéressante L'Histogramme, Pmf et Pdf .