使用 uC 和电流分流器测量平均电流

电器工程 微控制器 ADC 测量 电流测量 分流
2022-01-08 16:12:37

这是我的第一篇文章。我是一个试图做硬件的软件人,所以要温柔:)

电路

我正在设计一个小电路(见图片,对于混乱的原理图感到抱歉),它简单明了是一堆 MOSFET 和栅极驱动器,旨在从微控制器切换电阻负载(在这种情况下为加热垫)。加热元件通常具有非常低的电阻,为了将功率保持在所需水平,MOSFET 使用 PWM 进行切换。

测量

除了纯粹的功能方面,还有一个教育重点。我希望能够获得有关当前消耗的一些反馈。而我天真的方法是简单地放入一些电流分流传感器 IC。当使用万用表测量传感器的输出电压时,由于电流表的“缓慢”,我实际上得到了一些看起来像平均电流(使用 PWM 切换)的东西。但是,当将相同的输出连接到 atmega328p ADC 时,我会得到一些不好的读数 - 这里的速度会在 PWM 方波的任何位置读取。

所以,我的问题是如何在使用 PWM 切换时测量(平均)电流?

看起来设计还可以,但我可能错过了设计以及在这种情况下应该如何使用 uC ADC 的一些内容。

示意图

2个回答

有时候看起来很简单的事情并不那么简单。你有一个相当复杂的测量要做,但你想要一个简单的结果。您要测量的不是恒定的,而是随时间变化的。根据您的要求级别,您可以计算当前消耗的一个或多个属性。这些属性将帮助您更好地监控系统。我向您建议 3 种不同的解决方案,其复杂性不断增加。

解决方案 1:平均

你想得到一个单值结果 -> 及时得到平均值。正如@akellyirl 已经提出的那样,使用低通滤波器。计算float y = alpha*input + (1-alpha)*y每个样本,其中alpha是平滑因子。有关详细信息,请参阅维基百科

解决方案 2:最大值 + 平均值

您对获取平均值和最大值很感兴趣。例如,监视最大值对于组件尺寸标注可能很有趣。

if (y > max)
  max = y;

解决方案 3:标准差 + 最大值 + 平均值

为什么?

请参见下面的图表。有3种不同形状的信号。一个三角形、一个正弦和一个尖峰信号。它们都是周期性的,具有相同的周期、相同的振幅、相同的平均值以及相同的最小值最大值但是,它们有不同的形状,而且确实有着完全不同的故事……

信号及其直方图

差异之一是标准偏差。这就是为什么我建议你扩展你的测量,并包括标准偏差。问题是计算它的标准方法是消耗 CPU 的。希望有一个解决方案。

如何?

使用直方图方法。构建所有测量值的直方图,并有效地提取数据集的统计信息(最小值、最大值、平均值、标准差)。直方图将具有相同值或相同值范围的值组合在一起。优点是避免存储所有样本(及时增加计数),并在有限数量的数据上进行快速计算。

在开始获取测量值之前,创建一个数组来存储直方图。它是一个一维整数数组,大小为 32,例如:

int histo[32];

根据电流表的量程,调整以下功能。例如,如果范围是 256mA,这意味着直方图的 bin 0 将增加 0 到 8 mA 之间的值,bin 1 增加 8 到 16 mA 之间的值等等......所以,你需要一个整数来表示直方图 bin 编号:

short int index;

每次得到一个样本,找到对应的bin索引:

index = (short int) floor(yi);

并增加这个 bin:

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 进行慢速操作,而不是对所有获取的信号样本进行操作。样本量越长越好。如果您想了解更多详细信息,请阅读这个有趣的页面The Histogram, Pmf and Pdf

您正确理解了这个问题:您需要获得 PWM 的“平均值”,就像您用于测量的仪表一样。

您可以在 A1、2、3 信号上使用 RC 滤波器,其时间常数至少是 PWM 周期的十倍。这意味着如果您的 PWM 周期为 10 微秒,那么 RC 时间常数应为 100 微秒。例如 10kOhms x 10nF = 100us

更好的解决方案是在微控制器中对信号进行数字过滤,如下所示:

float y = (1-0.99)*input + 0.99*y; 

更改“0.99”值以更改此数字滤波器的时间常数。