ADC采样 真有效值计算问题
1.有效值、真有效值、全有效值
有效值主要用于衡量交流电压、交流电流的幅值大小,出发点是热效应与直流电相同。
1.1 电流电压有效值
电压/电流有效值:
在相同的电阻两端分别施加直流电压和交流电压/电流,经过一个交流电压周期的时间,如果它们在电阻上所消耗的电能相等,则把该直流电压的幅值作为交流电压/电流的有效值。
正弦电压、电流有效值等于其最大值(幅值)的 1/2–√ 1/ 2 ,约0.707倍。
1.2 校准平均值
有效值的“有效”有等效的意思。因为交流电的瞬时幅值是变化的,用有效值可以反映交流电对电阻负载的平均做功能力。
然而,有效值的方均根计算方式电路实现较为复杂。为了简化电路,某些仪器仪表往往利用正弦波的峰值或整流平均值与有效值的换算关系,采用峰值检波电路或均值检波电路,先测量出峰值,再乘以对应的系数转变为有效值。传统的毫伏表、微安表、电压表、电流表、万用表等等大多采用这种方法,其中峰值转变为有效值的系数为0.707,而整流平均值转变为有效值的系数为1.1107。采用均值检波法得到的有效值,也称校准到有效值的整流平均值,简称校准平均值。
1.3 真有效值
峰值检波法或均值检波法利用了正弦波的峰值、整流平均值与有效值的换算关系,因此,这类方法只适合正弦信号的有效值测量(详见“均值检波、峰值检波及方均根检波电路原理及区别”)。
对于非正弦信号,测量得到的“有效值”不准确。为了区分这种有效值与严格依照有效值定义得到的有效值的区别,后者也称为真有效值,采用Trms表示,其中,T是Ture的缩写,意为“真正的”。
2.有效值计算方法
有效值的计算方式有两种,就是课本上经常说的,同样的原理。
2.1 时域计算
有效值等于其瞬时值在一个周期内的方均根值
G和g可以表示电压和电流,时域方法,需要知道表达式。
2.2频域计算
有效值等于直流分量、基波分量及所有谐波分量的有效值的方和根。
注意:G可以表示电压和电流,Gh表示电压或电流的h次谐波,h=0时,为零次谐波,表示直流分量,h=1时,为一次谐波,表示基波。
3.真有效值实现过程
真有效值的计算,单片机是直接采样成抽样信号的,采样时间是间隔的,采样信号连续。就有信号在T时间内的有效值定义如下:
离散化,在T内均匀采样N个数
值得注意的是,这里的
ui u i
是有正有负交流信号,单片机采样回来全部都是直流信号,你需要减去这个采样周期的平均值。
如果要提高计算精度和数据显示的稳定度,建议T取实际信号周期的若干倍,如果用到稳定电压电流的话即用到PI调节,PI控制需要使用到输出信号的有效值,因此该值刷新率不能太低,可以取5~10个T。
4. 程序设计实现
4.1 峰值检测法
我们在计算有效值时,一般都是直接拿峰峰值,直接峰峰值/ 22–√ 2 2 ,程序写出来的话,就直接在采一个周期内,将最大最小值找到算出来就行了。
/*****************************************************
* 函数功能:峰峰值计算有效值
* 作者版权:klaus 邮箱:xcf2016a@outlook.com
* 功能介绍:传入完整一次周期采样数据和采样点数
* 返回一次有效值计算结果
* 版本:1.0(无改动)
******************************************************/
double PEAK_RMS(u32 *arr,u32 num)
{
u32 Peak_Max,Peak_Min;
double Peak_To_Peak;
double Ture_Peak;
int i;
Peak_Max=Peak_Min=arr[0];
for(i=0;i<num;i++){
if(arr[i]>=Peak_Max)Peak_Max=arr[i];
if(arr[i]<=Peak_Min)Peak_Min=arr[i];
}
Peak_To_Peak=Peak_Max-Peak_Min;
Ture_Peak=3.3*sqrt(Peak_To_Peak)/4096;
return Ture_Peak;
}
4.2 真有效值计算
按照上面步骤就可以直接写出程序了
/*****************************************************
* 函数功能:真有效值计算
* 作者版权:klaus 邮箱:xcf2016a@outlook.com
* 功能介绍:传入完整一次周期采样数据和采样点数
* 返回一次真有效值计算结果
* 版本:1.0(无改动)
******************************************************/
double TRUE_RMS(u32 *arr,u32 num)
{
u32 sum_pre,sum_lat;
double ave_pre;
double ture_value;
int i;
for(i=0;i<num;i++)
sum_pre+=arr[i];
ave_pre=sum_pre/num;
for(i=0;i<num;i++)
sum_lat+=pow((double)(arr[i]-ave_pre),2);
ture_value=3.3*sqrt(sum_lat/num)/4096;
return ture_value;
}
今天的文章有效值和真有效值的区别_有效值如何计算出来的分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/83397.html