A volte ciò che sembra semplice non è così semplice. Hai una misurazione abbastanza complessa da fare, ma vuoi un risultato semplice. Quello che vuoi misurare non è costante, varia nel tempo. A seconda del livello del requisito, è possibile calcolare una o più proprietà del consumo corrente. Queste proprietà ti aiuteranno a monitorare meglio il sistema. Ti propongo 3 diverse soluzioni, in crescente complessità.
Soluzione 1: media
Vuoi ottenere un risultato di un valore -> ottenere la media nel tempo. Come già proposto da @akellyirl, utilizzare un filtro passa-basso. Calcola float y = alpha*input + (1-alpha)*y
per ogni campione, dove si alpha
trova il fattore di livellamento. Vedi Wikipedia per i dettagli.
Soluzione 2: massimo + medio
Sei interessante ottenere la media e il valore massimo. Il monitoraggio del valore massimo potrebbe essere interessante, ad esempio, per il dimensionamento dei componenti.
if (y > max)
max = y;
Soluzione 3: deviazione standard + max + media
Perché?
Vedi sotto i grafici. Ci sono 3 segnali di forme diverse. Un triangolo , un seno e un segnale di punta . Sono tutti periodici con lo stesso periodo, stessa ampiezza , stessa media e stesso min e max . Ma hanno forme diverse e in effetti hanno una storia completamente diversa ...
Una delle differenze è la deviazione standard. Ecco perché ti suggerisco di estendere le tue misure e di includere la deviazione standard. Il problema è che il modo standard per calcolarlo richiede l'utilizzo della CPU. Speriamo che ci sia una soluzione.
Come?
Usa il metodo dell'istogramma . Crea un istogramma di tutte le misurazioni ed estrai in modo efficiente le statistiche (min, max, media, deviazione standard) del set di dati. L'istogramma raggruppa valori che hanno lo stesso valore o lo stesso intervallo di valori. Il vantaggio è quello di evitare di memorizzare tutti i campioni (aumentando il conteggio nel tempo) e di avere un rapido calcolo su un numero limitato di dati.
Prima di iniziare l'acquisizione delle misurazioni, creare un array per memorizzare l'istogramma. È un array intero a 1 dimensione, ad esempio di dimensione 32 :
int histo[32];
A seconda della gamma dell'amperometro, adattare la funzione di seguito. Ad esempio, se l'intervallo è 256 mA significa che il cestino 0 dell'istogramma verrà incrementato di un valore compreso tra 0 e 8 mA, il contenitore 1 di valore compreso tra 8 e 16 mA ecc ... Quindi, sarà necessario un numero intero per rappresentare il numero del cestino dell'istogramma:
short int index;
Ogni volta che ottieni un campione, trova l'indice bin corrispondente:
index = (short int) floor(yi);
E incrementa questo cestino:
histo[index] += 1;
Per calcolare la media, esegui questo 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.
Per calcolare la deviazione standard, eseguire questo 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 strategia del metodo dell'istogramma è di eseguire le operazioni lente su un numero limitato di bin, anziché su tutti i campioni di segnale acquisiti. Maggiore è la dimensione del campione, meglio è. Se vuoi maggiori dettagli, leggi questa interessante pagina L'istogramma, Pmf e Pdf .