STM8学习笔记---ADC平均值采样和有效值采样算法分析
2021-09-18 来源:eefocus
在开关电源中,电流采样是非常重要的。常用的电流采样计算方法有平均值采样法和有效值采样法。现将这两种电流采样算法进行分析比较。
硬件连接示意图
交流220V通过全桥整流滤波后变为直流310V,直流310V给后端负载供电,采样电阻Rs串联在直流回路的地线中。
当设备工作时,电流从整流桥正极流出经过负载,然后经过采样电阻Rs回到整流桥负极。由于采样电阻Rs的阻值很小,采样电阻上的压降只有零点几伏,所以采样电阻不会对负载造成影响。由于采样电阻上的压降很小,MCU不能直接使用,所以通过放大电路,将采样电阻上的电压放大到MCU能直接识别的范围内,然后通过MCU上的ADC口直接读取放大电路出来的电压信号,就能计算出输入电流值的大小。这样只需通过一个采样电阻同时结合软件的算法,就能计算出电源输入电流大小,简化了硬件电路,节约了开发成本,同时又缩短了开发周期。
平均值采样:
通过MCU的ADC输入口,直接读取采样到的电压值。将采样到N个数据直接求算数平均值。
软件流程如下:
图2
程序开始采样后,每采样一次就累加一次采样个数,当采样个数小于N时,继续采样,当采样个数大于N时,计算N个采样值的累加和,再求出N个采样数据的算术平均值。然后复位采样个数计数器,继续进行下一次采样。这个平均值就可以用来计算当前电源输入电流值。
采样个数N的值根据不同的波形选择不同的大小,选取原则是,要保证采样的值至少要包含输入电流波形的一个周期。这样才能保证将波形中的最大值和最小值都能采样到,计算出来的平均值才能更准确。
软件核心代码如下:
u16 get_ave( void )
{
static u8 cnt = 0;
static u32 sum = 0;
static u16 ave = 0;
if( cnt < N)
{
sum += ReadVol_CH4(); //采样值累加和
cnt++;
}
if( cnt >= N)
{
ave = sum / N; //计算算术平均值
cnt = 0;
sum = 0;
}
return ave;
}
采样数据分析:
通过函数发生器产生一个幅度为0.2V--2V,频率为100Hz的正弦波。用来模拟电源输入电流波形,将函数发生器产生的正弦波直接送入MCU的ADC采样端口。
用示波器观察输入波形入下图所示:
图3
由于MCU采样的数据不好观察,所以将ADC口采样的数据通过串口发送出来,然后将数据绘制成曲线,通过观察曲线的波动来判断采样值的稳定性。
MCU采样数据及曲线如下图所示:
图4
MCU采样的数据最大值为472,最小值为467。MCU的ADC分辨率为10位,可以计算出ADC的最大采样值为2^10=1024。MCU为5V供电,可以计算出采样值的电压为
472/1024*5=2.3046875 467/1024*5=2.2802734375
通过计算可知ADC采样值在2.28V到2.3V之间波动。
由图3示波器上所测Vavg=2.22V可知,送入ADC口的波形平均值是2.22V,MCU通过平均值采样计算出来的值在2.28V到2.3V之间。说明MCU计算的值基本准确。通过图4中绿色的数据采样波形也可以看出,MCU计算的平均值有轻微的波动。
将输入波形幅度降低到0.5V--1.5V测试,输入波形如下图所示:
图5
MCU采样数据及曲线如下图所示:
图6
MCU采样最大值为425,最小值为421,换算为电压值为
425/1024*5=2.0751953125 421/1024*5=2.0556640625
MCU采样值在2.05V到2.07V之间。由图5示波器所测Vavg=2.02V可知送入ADC口的波形平均值是2.02V。可以看出,MCU采样的值已经比较接近实际值了。通过图6中绿色的数据波形可以看出,平均值波动比较小。
通过上面两组测试对比可以发现,当ADC口输入波形的幅值降低,MCU计算出来的平均值就比较接近输入波形真实的平均值。
采样时间分析:
MCU采样一是要求准确性,二是要求实时性。也就是说不仅要采样准确,而且要采样速度快,能及时反应输入电流变化。上面已经验证了采样的准确性,下来开始验证采样的实时性。由于MCU采样的速度比较快,很难直接观测到采样一次需要多长时间,这里采用LED指示灯的亮灭来间接观测ADC采样一次需要的时间。LED亮--->采样一次数据--->LED灭--->采样一次数据--->LED亮--->采样一次数据,这样一直循环。每次采样前让LED指示灯的状态变化一次,这样LED灯从亮到灭,从灭到亮的过程中都是采样了一次数据。然后用示波器观察LED灯高低电平的时间,就可以间接的看出,采样一次数据花费的时间了。相关代码如下:
While(1)
{
LED3 = 1; //LED 亮
val = get_ave(); //采样
LED3 = 0; //LED 灭
val = get_ave(); //采样
}
示波器测试LED波形如下图所示:
图7
通过示波器测量值可以看到 +wid=60us -wid=59us 说明LED高电平时长为60us,低电平时长为59us。通过LED电平可以间接的看出,采样一次数据MCU所耗费的时间为60us左右。
有效值采样:
通过MCU的ADC输入口,直接读取采样到的电压值。将采样到一个周期的数据求平方累加和,然后累加和求平均值,最后在开方。所求的结果就是均方根值,也就是有效值。
软件流程如下:
图8
程序开始采样后,计时器开始计时,当计时时间小于T,就继续采样。当计时时间大于T时,结束采样。然后将采样值取平方,再求累加和,然后再将累加和进行开方运算。所求的值就是在采样T时间内电流波形的均方根值,也就是有效值。这个有效值值就可以用来计算当前电源输入电流值的有效值。
采样时间T的值根据不同的波形选择不同的大小,选取原则是,要保证采样的值为输入电流波形的一个周期。这样计算出来的值就是周期均方根值,最接近输入波形真实有效值。
软件核心代码如下:
u16 get_rms( void )
{
static u16 ave_value = 0;
u16 tem_time = 0;
u8 cnt = 0, num = 0;
u32 sum = 0, value = 0;
u16 rms = 0;
while( cnt <= T) //采样一个周期
{
if( tem_time != time_cnt )
{
tem_time = time_cnt;
cnt++;
}
value = ReadVol_CH4();
sum += value * value;
num++;
}
rms = (u16)sqrt( sum / num ); //求均方根值
ave_value = rms;
return ave_value;
}
采样数据分析:
通过函数发生器产生一个幅度为0.2V--2V,频率为100Hz的正弦波。用来模拟电源输入电流波形,将函数发生器产生的正弦波直接送入MCU的ADC采样端口。
用示波器观察输入波形入下图所示:
图9
MCU采样数据及曲线如下图所示:
图10
MCU采样最大值为536,最小值为504。计算采样电压值为
536/1024*5=2.6171875 504/1024*5=2.4609375
通过计算可以看出,MCU采样值在2.62V和2.46V之间波动。
由图9示波器波形可以看出,输入波形有效值Vrms=2.56V,MCU采样计算出的有效值在真实的有效值上下波动,由图10中绿色波形可以看出采样值波动情况。
将输入波形幅度降低到0.5V--1.5V测试,输入波形如下图所示:
图11
MCU采样数据曲线如下图所示:
图12
MCU采样最大值为447,最小值为428。计算采样电压值为
447/1024*5=2.1826171875 428/1024*5=2.08984375
通过计算可以看出,MCU采样值在2.18V和2.08V之间波动。
由图9示波器波形可以看出,输入波形有效值Vrms=2.15V,MCU采样计算出的有效值在真实的有效值上下波动,由图11中绿色波形可以看出采样值波动情况。
通过上面两组测试对比可以发现,当ADC口输入波形的幅值降低,MCU计算出来的有效值精度无明显变化,计算的有效值都在真实的有效值上下波动。说明有效值的计算不受波形幅值的影响。
采样时间分析:
由于MCU采样的速度比较快,很难直接观测到采样一次需要多长时间,这里同样采用LED指示灯的亮灭来间接观测ADC采样一次需要的时间。LED亮--->采样一次数据--->LED灭--->采样一次数据--->LED亮--->采样一次数据。每次采样前让LED指示灯的状态变化一次,这样LED灯从亮到灭,从灭到亮的过程中都是采样了一次数据。然后用示波器观察LED灯高低电平的时间,就可以间接的看出,采样一次数据花费的时间了。相关代码如下:
while( 1 )
{
LED3 = 1; //LED 亮
val = get_rms(); //采样
LED3 = 0; //LED 灭
val = get_rms(); //采样
}
示波器测试LED波形如下图所示:
通过示波器观测可以看到 +wid=10.4ms -wid=10ms 说明LED高电平时长为10.4ms,低电平时长为10ms。通过LED电平可以间接的看出,采样一次数据MCU所耗费的时间为10ms左右。
结论:
通过上面平均值采样和有效值采样的分析对比可以看出。平均值采样耗时比较短,采样速度快,但是和输入波形关系比较大,输入波形幅度越小,采样值与实际值误差越小。有效值采样耗时比较长,采样速度慢,但是不受输入波形幅度影响。
结合在实际项目中的应用经验来看,若采样的波形为直流或者畸变很小的交流,同时对系统的实时性要求比较高的情况下,可以考虑用平均值采样法。若设备的运行环境比较复杂,输入波形在不同的环境下会发生不同畸变,同时对系统的实时性要求不高的话,可以考虑用有效值采样法。有效值采样相当于计算的是输入波形的面积,所以不论现场环境多复杂,输入波形发生多严重的畸变。通过有效值采样法计算出来的电流值,最接近真实值。所以在开关电源电路中用有效值采样法计算的电流值比平均值采样法计算的电流值稳定性要好。
下一篇:STM8单片机产生随机数
- gd32f103可以完全替代stm32f103吗
- STM32CUBEMX开发GD32F303(4)----GPIO输出模式,速率测试、开漏和输出说明
- STM32转AT32代码转换
- STM32 MPU是什么产品?了解嵌入式系统中微处理器的新变化
- 【GD32 MCU 移植教程】9、从 STM32F10x 系列移植到 GD32F30x 系列
- 【GD32 MCU 移植教程】8、从 STM32F4xx 系列移植到 GD32F4xx 系列
- 【GD32 MCU 移植教程】10、从STM32F030系列移植到GD32E230系列
- GD32单片机STM32远程下载手机程序升级固件下载局域网网页升级工具
- GD32代码移植STM32(一)
- GD32单片机和STM32单片机的区别