Иногда то, что выглядит просто, не так просто. У вас есть довольно сложное измерение, но вы хотите простой результат. То, что вы хотите измерить, не является постоянным, оно меняется во времени. В зависимости от вашего уровня требований, вы можете рассчитать одно или несколько свойств текущего потребления. Эти свойства помогут вам лучше контролировать систему. Я предлагаю вам 3 разных решения, в порядке возрастания сложности.
Решение 1: Среднее
Вы хотите получить однозначный результат -> получить среднее по времени. Как уже предложено @akellyirl, используйте фильтр нижних частот. Вычислить float y = alpha*input + (1-alpha)*y
для каждого образца, где alpha
коэффициент сглаживания. Смотрите Википедию для деталей.
Решение 2: Макс + Средний
Вы заинтересованы в получении среднего и максимального значения. Мониторинг максимального значения может быть интересен, например, для определения размеров компонентов.
if (y > max)
max = y;
Решение 3: Стандартное отклонение + Макс. + Среднее
Почему?
Смотрите ниже графики. Есть 3 сигнала разных форм. Треугольник , A синус и пик сигнала. Все они периодические с одинаковым периодом, одинаковой амплитудой , одинаковым средним и одинаковыми минимальными и максимальными значениями . Но они имеют разные формы, и действительно, у них совершенно другая история ...
Одним из различий является стандартное отклонение. Вот почему я предлагаю вам расширить ваши измерения и включить стандартное отклонение. Проблема в том, что стандартный способ его вычисления потребляет процессор. Надеюсь, есть одно решение.
Как?
Используйте метод гистограммы . Постройте гистограмму всех измерений и эффективно извлеките статистику (min, max, avg, стандартное отклонение) набора данных. Гистограмма группирует значения, имеющие одинаковое значение или одинаковый диапазон значений. Преимущество состоит в том, чтобы избежать сохранения всех выборок (увеличивая счет во времени), и иметь быстрые вычисления для ограниченного числа данных.
Перед началом сбора измерений создайте массив для хранения гистограммы. Это одномерный целочисленный массив размером 32, например:
int histo[32];
В зависимости от диапазона амперметра, адаптируйте ниже функции. Например, если диапазон равен 256 мА, это означает, что интервал 0 гистограммы будет увеличиваться на значение от 0 до 8 мА, интервал 1 на значение от 8 до 16 мА и т. Д. Итак, вам нужно целое число для представления номер ячейки гистограммы:
short int index;
Каждый раз, когда вы получаете образец, найдите соответствующий индекс корзины:
index = (short int) floor(yi);
И увеличить этот мусорный ящик:
histo[index] += 1;
Чтобы вычислить среднее значение, запустите этот цикл:
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.
Чтобы вычислить стандартное отклонение, запустите этот цикл:
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.
Стратегия метода гистограммы состоит в том, чтобы выполнять медленные операции на нескольких бинах вместо всех полученных выборок сигнала. Чем длиннее размер выборки, тем лучше. Если вы хотите больше подробностей, прочитайте эту интересную страницу Гистограмма, Pmf и Pdf .