Іноді те, що виглядає просто, не так просто. У вас є досить складне вимірювання, але ви хочете простий результат. Те, що ви хочете виміряти, не є постійним, воно змінюється за часом. Залежно від рівня вашої вимоги, ви можете обчислити одну або декілька властивостей поточного споживання. Ці властивості допоможуть вам краще контролювати систему. Я пропоную вам 3 різних рішення, у зростаючій складності.
Рішення 1: Середнє значення
Ви хочете отримати однозначний результат -> отримати середнє за часом. Як уже запропонував @akellyirl, використовуйте фільтр низьких частот. Обчисліть float y = alpha*input + (1-alpha)*y
для кожного зразка, де alpha
коефіцієнт згладжування. Докладніше див. У Вікіпедії .
Рішення 2: Макс. + Середнє значення
Вам цікаво отримати середнє та максимальне значення. Моніторинг максимального значення може бути цікавим, наприклад, для розміщення компонентів.
if (y > max)
max = y;
Рішення 3: Стандартне відхилення + Макс. + Середнє
Чому?
Дивіться нижче діаграми. Є 3 сигнали різної форми. Трикутник , A синус і пік сигналу. Всі вони періодичні з тим самим періодом, однаковою амплітудою , однаковими середніми і тими ж хв і макс . Але вони мають різні форми, і справді вони мають зовсім іншу історію ...
Одна з різниць - це стандартне відхилення. Ось чому я пропоную вам розширити свої вимірювання та включити стандартне відхилення. Проблема полягає в тому, що стандартним способом його обчислення є споживання процесора. Сподіваємось, є одне рішення.
Як?
Використовуйте метод гістограми . Побудуйте гістограму всіх вимірювань та ефективно витягніть статистичні дані (хв, макс, середнє, стандартне відхилення) набору даних. Гістограма групує значення разом, які мають одне і те ж значення або той самий діапазон значення. Перевага полягає в тому, щоб уникнути зберігання всіх зразків (збільшуючи кількість у часі) та швидкого обчислення обмеженої кількості даних.
Перш ніж починати з вимірювань, створіть масив для зберігання гістограми. Це масив з 1 розміром, розміром 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» .