Às vezes, o que parece simples não é assim tão simples. Você tem uma medida bastante complexa para fazer, mas deseja um resultado simples. O que você deseja medir não é constante, está variando no tempo. Dependendo do seu nível de exigência, você pode calcular uma ou várias propriedades do consumo atual. Essas propriedades ajudarão você a monitorar melhor o sistema. Eu proponho a você 3 soluções diferentes, em complexidade crescente.
Solução 1: média
Você deseja obter um resultado de um valor -> obter a média no tempo. Como já proposto por @akellyirl, use um filtro passa-baixo. Calcule float y = alpha*input + (1-alpha)*y
para cada amostra, onde alpha
está o fator de suavização. Veja a Wikipedia para detalhes.
Solução 2: Máx. + Média
Você é interessante em obter a média e o valor máximo. O monitoramento do valor máximo pode ser interessante para o dimensionamento de componentes, por exemplo.
if (y > max)
max = y;
Solução 3: desvio padrão + máximo + médio
Por quê?
Veja os gráficos abaixo. Existem 3 sinais de diferentes formas. Um triângulo , um seno e um sinal de pico . Todos são periódicos com o mesmo período, a mesma amplitude , a mesma média e os mesmos mínimos e máximos . Mas eles têm formas diferentes e, de fato, têm uma história completamente diferente ...
Uma das diferenças é o desvio padrão. Por isso, sugiro que você estenda suas medidas e inclua o desvio padrão. O problema é que a maneira padrão de computá-lo consome CPU. Felizmente, existe uma solução.
Quão?
Use o método de histograma . Crie um histograma de todas as medições e extraia com eficiência as estatísticas (mín, máx, média, desvio padrão) do conjunto de dados. O histograma agrupa valores que têm o mesmo valor ou o mesmo intervalo de valor. A vantagem é evitar o armazenamento de todas as amostras (aumento da contagem no tempo) e ter um cálculo rápido em um número limitado de dados.
Antes de começar a adquirir medições, crie uma matriz para armazenar o histograma. É uma matriz inteira de 1 dimensão, de tamanho 32, por exemplo:
int histo[32];
Dependendo da faixa do amperímetro, adapte a função abaixo. Por exemplo, se o intervalo for 256mA, significa que a posição 0 do histograma será incrementada em valores entre 0 e 8 mA, posição 1 em valores entre 8 e 16 mA etc ... Portanto, será necessário um número inteiro para representar o número da lixeira do histograma:
short int index;
Cada vez que você obtém uma amostra, encontre o índice de compartimento correspondente:
index = (short int) floor(yi);
E incremente esta lixeira:
histo[index] += 1;
Para calcular a média, execute este loop:
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 o desvio padrão, execute este loop:
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.
A estratégia do método do histograma é fazer operações lentas em um número pequeno de posições, em vez de todas as amostras de sinal adquiridas. Quanto maior o tamanho da amostra, melhor. Se você quiser mais detalhes, leia esta página interessante O Histograma, Pmf e Pdf .