有时候看起来简单的事情并不那么简单。您需要进行相当复杂的测量,但是想要一个简单的结果。您想要测量的不是恒定的,而是随时间变化的。根据您的需求水平,您可以计算电流消耗的一个或多个属性。这些属性将帮助您更好地监视系统。我向您提出3种不同的解决方案,以提高复杂性。
解决方案1:平均
您想要一个单值结果->及时获得平均值。如@akellyirl所建议的,使用低通滤波器。计算float y = alpha*input + (1-alpha)*y
每个样本,其中alpha
的平滑因子。有关详细信息,请参见Wikipedia。
解决方案2:最大+平均
您对获得平均值和最大值很感兴趣。例如,监视最大值可能对组件尺寸确定很有用。
if (y > max)
max = y;
解决方案3:标准差+最大值+平均值
为什么?
请参见以下图表。有3种不同形状的信号。甲三角形,一个正弦和一个尖峰信号。它们都是周期性的,具有相同的周期,相同的幅度,相同的平均值以及相同的min和max。但是,它们具有不同的形状,实际上它们的故事完全不同...
差异之一是标准偏差。因此,我建议您扩展测量范围并包括标准偏差。问题是计算它的标准方法消耗CPU。希望有一种解决方案。
怎么样?
使用直方图方法。建立所有测量值的直方图,并有效地提取数据集的统计信息(最小,最大,平均,标准差)。直方图将具有相同值或相同值范围的值组合在一起。优点是避免存储所有样本(时间计数增加),并且可以对有限数量的数据进行快速计算。
在开始获取测量值之前,创建一个数组来存储直方图。它是一维整数数组,大小为32,例如:
int histo[32];
根据电流表的范围,调整以下功能。例如,如果范围为256mA,则表示直方图的bin 0将增加0到8 mA之间的值,bin 1将增加8到16 mA之间的值等等...因此,您需要一个整数来表示直方图箱号:
short int index;
每次获取样本时,请找到相应的bin索引:
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.
直方图方法的策略是对几个bin进行慢速操作,而不是对所有采集的信号样本进行慢速操作。样本量越长越好。如果需要更多详细信息,请阅读此有趣的页面直方图,Pmf和Pdf。