单片机ADC采样算法有效值采样法

在使用单片机ADC功能采样数据时,通常情况下用平均值计算就够了,但是在计算功率时就需要用有效值来计算真正做功的情况。如果是标准的正弦波的话,正弦波的峰值是有效值的1.414倍,可以通过峰值来计算有效值。但是实际应用中波形往往会发生畸变,如果按照1.414这个比例计算的话,误差往往会比较大。所以必须通过计算正弦波的面积来求有效值。

有效值又叫均方根值,对数据的平方和取平均值再开方所计算出来的值。所以通常情况下采用的计算方法是:将所有值平方求和,求其平均值,再开平方,就得到均方根值。用公式表达的话就是这样。

1
2
3
4
5
6
7
8
9
10
11
// dsp28335中实现
float32 get_rms(float32 values[], int length) {
float32 sumOfSquares = 0.0;
Uint16 i;
for (i = 0; i < length; ++i) {
sumOfSquares += values[i] * values[i]; // 累加每个值的平方
}

float32 meanSquare = sumOfSquares / length; // 计算均方值
return sqrtf(meanSquare); // 返回均方根值
}

每采样一个数据后,先对这个数据取平方,然后计算累加和,采样一定数量数据之后,对累加的平方和求平均值,然后再开方。

下面通过函数发生器产生一个50Hz的标准正弦波,最大值为4V,最小值为0V。通过单片机采样并计算此正弦波的有效值,将计算的结果通过串口发送出来,并在串口波形软件上显示采样的值。

这是示波器测的波形:

这是串口波形软件显示的单片机实时采样正弦波的有效值,通过蓝色的数据曲线可以看到,采样的有效值还是比较稳定的,计算出的有效值是520,单片机的ADC是10位分辨率,2^10=1024,单片机为5V供电,所以有效值为520/1024*5=2.5390625V,示波器测出的有效值为2.50V,单片机通过ADC采样计算的有效值与示波器测试的有效值误差为0.039V。