搜索
bottom↓
回复: 39

用STM32采集了64个点的交流信号,如何计算有效值。。

  [复制链接]

出0入20汤圆

发表于 2013-7-2 16:46:32 | 显示全部楼层 |阅读模式
采集的交流信号经过了FFT,出来了64点的幅度,相位,虚部和实部。如何计算交流电流有效值,频率?
现在用了很多计算方法,结果不太好!

出0入0汤圆

发表于 2013-7-2 16:49:01 | 显示全部楼层
本帖最后由 Clinging 于 2013-7-2 16:54 编辑

有效值算法,俗称 “均方根”,就是先对这64个数分别求平方,然后平均,再然后开方,结果就是有效值

测频率最好用比较器,采样频率要和测量到的频率同步

相位差可以由有功功率和视在功率计算得出

出0入0汤圆

发表于 2013-7-2 17:00:59 | 显示全部楼层
不理解你做FFT意欲何为?

出0入0汤圆

发表于 2013-7-2 17:14:21 | 显示全部楼层
给你个三点校正算法,精度已经满高的!自己慢慢研究吧!这些算法我们都是实际应用于现场的!
clear all;clc  
N=256;
fs=1000;
f=51.1234;
a=1.2345;
ph=30.123;
dc=0.123;
t=0:N-1;
x=a*sin(2*pi*f*t/fs+ph*pi/180)+dc;
xfft=fft(x,N);
y=abs(xfft);
[Y1, k]=max(y(2:N/2));
k=k+1;
z1=xfft(k)-(xfft(k-1)+xfft(k+1))/2;
z2=xfft(k+1)-(xfft(k)+xfft(k+2))/2;
ka=abs(z1)/abs(z2);
r=(2-ka)/(1+ka)
fo=(k-1+r)*fs/N
ao=2*pi*r*(1-r*r)*(abs(z1))/(N*sin(r*pi))
pho=(angle(z1)-pi*r)*180/pi+90

MATLAB输出结果,精度自己看
fo =

  51.123401059088216


ao =

   1.234499850166726


pho =

  30.122670622875049

出0入20汤圆

 楼主| 发表于 2013-7-2 17:18:26 | 显示全部楼层
均方根用过了,但和万用表对比,误差大,所以就是想用Fft处理后,再用各分量的均方和对比一下。

出0入20汤圆

 楼主| 发表于 2013-7-2 17:45:38 | 显示全部楼层
again 发表于 2013-7-2 17:14
给你个三点校正算法,精度已经满高的!自己慢慢研究吧!这些算法我们都是实际应用于现场的!
clear all;clc  ...

有标准的C代码吗?或者说明一下Fft如何处理这64个数据?

出0入0汤圆

发表于 2013-7-2 18:14:56 | 显示全部楼层
mon51 发表于 2013-7-2 17:18
均方根用过了,但和万用表对比,误差大,所以就是想用Fft处理后,再用各分量的均方和对比一下。 ...

均方根我用过,很容易做到1%的精度

出0入0汤圆

发表于 2013-7-2 18:18:42 来自手机 | 显示全部楼层
切。楼上看来不懂万用表的工作原理,一般来说万用表的交流电压档是采用峰值检波原理,故对于有谐波的交流信号,误差相当的大。

出0入20汤圆

 楼主| 发表于 2013-7-2 19:05:51 | 显示全部楼层
yxw_bob 发表于 2013-7-2 18:18
切。楼上看来不懂万用表的工作原理,一般来说万用表的交流电压档是采用峰值检波原理,故对于有谐波的交流信 ...

我这个万用表是真有效值!

出0入0汤圆

发表于 2013-7-3 00:32:15 | 显示全部楼层
能告诉我万用表的型号吗?

出0入0汤圆

发表于 2013-7-3 00:51:11 | 显示全部楼层
将幅度数值积分,精度可以用龙贝格求积控制

出0入4汤圆

发表于 2013-7-3 07:25:29 | 显示全部楼层
一周波采样64点,64点的时间间隔必须一样,采用定时器触发采样,这个时间由测量的频率计算产生,频率必须先测准,采样时间实时更新,实时变化

出0入0汤圆

发表于 2013-7-3 08:14:14 | 显示全部楼层
采用锁相倍频采样对谐波或者其次频段干扰严重的情况下也是没用的,采用FFT选频外加高精度频谱泄漏校正算法是非常可靠准备的

出0入20汤圆

 楼主| 发表于 2013-7-3 08:14:14 | 显示全部楼层
yxw_bob 发表于 2013-7-3 00:32
能告诉我万用表的型号吗?

日本共立 数字万用表1051 !

出0入0汤圆

发表于 2013-7-3 08:16:02 | 显示全部楼层
频谱泄漏校正算法可以看看“丁康”老师的书

出0入20汤圆

 楼主| 发表于 2013-7-3 08:19:41 | 显示全部楼层
again 发表于 2013-7-3 08:14
采用锁相倍频采样对谐波或者其次频段干扰严重的情况下也是没用的,采用FFT选频外加高精度频谱泄漏校正算法 ...

我就是想简化计算:先用St的fft库快速计算后,直接用A[1]的幅值除以根号2,得到有效值。不知行否!

出0入0汤圆

发表于 2013-7-3 08:39:37 | 显示全部楼层
你对FFT后的意义都不了解哦!FFT是把时域信号转换到频域,每一根谱线就是对应频率的信息,比如你以1024等间隔采样64点,那么频谱分辨率为1024/64=16HZ,第1根代表直流分量,第2根就是16HZ频率。。。如果实际信号不是刚好落在第N根谱线即不是频谱分辨率的N倍,那么需要做泄漏校正,用我前面提的三点校正算法就行这个算法是最简单的精度不算很高,想要更高的可以用5点、7点等等很多,丁康老师书里就有很多

出0入20汤圆

 楼主| 发表于 2013-7-3 08:43:17 | 显示全部楼层
again 发表于 2013-7-3 08:39
你对FFT后的意义都不了解哦!FFT是把时域信号转换到频域,每一根谱线就是对应频率的信息,比如你以1024等间 ...

我的采集频率是3200 ,64个采集!A[0]是直流分量;A[1]是50HZ的基波幅值,我说的是这个A[1]。

出0入0汤圆

发表于 2013-7-3 08:49:41 | 显示全部楼层
如果是整数倍周期没有发生泄漏那就可以直接取对应谱线就对了

出0入76汤圆

发表于 2013-12-23 21:46:32 | 显示全部楼层
again 发表于 2013-7-3 08:14
采用锁相倍频采样对谐波或者其次频段干扰严重的情况下也是没用的,采用FFT选频外加高精度频谱泄漏校正算法 ...

不错,学习, 希望again大侠能讲讲原理就更好了

出0入0汤圆

发表于 2014-4-16 10:51:38 | 显示全部楼层
我很想知道楼主怎么样采集64个点的。楼主能否说一说

出0入20汤圆

 楼主| 发表于 2014-4-16 14:43:07 | 显示全部楼层
1米49 发表于 2014-4-16 10:51
我很想知道楼主怎么样采集64个点的。楼主能否说一说

用定时器控制的。用周期除以64个点。

出0入0汤圆

发表于 2014-4-16 15:00:10 | 显示全部楼层
mon51 发表于 2014-4-16 14:43
用定时器控制的。用周期除以64个点。

谢谢您的帮助。再做进一步的调试。非常感谢

出0入0汤圆

发表于 2017-7-12 06:52:46 | 显示全部楼层
again 发表于 2013-7-2 17:14
给你个三点校正算法,精度已经满高的!自己慢慢研究吧!这些算法我们都是实际应用于现场的!
clear all;clc  ...

请教一下 again,你这三点校法是根据丁康的频谱校正的第四章的比值校正法来写的吗 ,我现在就在看比值校正法,但还是不太理解你这个程序的计算公式

出0入0汤圆

发表于 2017-7-12 08:55:00 | 显示全部楼层
NIC 发表于 2017-7-12 06:52
请教一下 again,你这三点校法是根据丁康的频谱校正的第四章的比值校正法来写的吗 ,我现在就在看比值校 ...

类似,照搬套公式没问题的!

出0入0汤圆

发表于 2017-7-12 11:49:46 | 显示全部楼层
splfsp 发表于 2013-7-2 18:14
均方根我用过,很容易做到1%的精度

是吗?采集64个点,均方根法可以做到1%?为啥我就做到2%?

出0入0汤圆

发表于 2017-7-12 12:06:26 | 显示全部楼层
zhang0352505 发表于 2017-7-12 11:49
是吗?采集64个点,均方根法可以做到1%?为啥我就做到2%?

采集到AD值精度能保证吗? 我之前好像是用标准源校正过的

出0入0汤圆

发表于 2017-7-12 12:42:52 | 显示全部楼层
splfsp 发表于 2017-7-12 12:06
采集到AD值精度能保证吗? 我之前好像是用标准源校正过的

不校准,直接上的。。。校准太麻烦。。

出0入0汤圆

发表于 2017-7-12 17:15:08 | 显示全部楼层
给个24点的参数。

#define PI 3.1415926

//24点付氏算法,返回long值并放大128倍,g:连续存放24点数据缓冲区首地址
#define FOURIER_R_24L(g) ( (int32)( 66l*( (int32)g[0] + (int32)g[10] - (int32)g[12] - (int32)g[22] )\
+ (( (int32)g[1] + (int32)g[9] - (int32)g[13] - (int32)g[21] )<<7) \
+ 227l*((int32)g[3] +  (int32)g[7]  - (int32)g[15] - (int32)g[19] )\
+ 247l*((int32)g[4] +  (int32)g[6]  - (int32)g[16] - (int32)g[18] )\
+ 181l*( (int32)g[2] + (int32)g[8]  - (int32)g[14] - (int32)g[20] )\
+ ((int32)g[5]<<8) - ((int32)g[17]<<8) ) )


//24点付氏算法,返回long值并放大128倍,g:连续存放24点数据缓冲区首地址


#define FOURIER_X_24L(g)  ( (int32)( 247l*((int32) g[0] - (int32)g[10] - (int32)g[12] + (int32)g[22] ) + 227l*( (int32)g[1]\
- (int32)g[9] - (int32)g[13] + (int32)g[21] ) + 181l*( (int32)g[2] - (int32)g[8]  - (int32)g[14] + (int32)g[20] )\
+ (((int32)g[3] -  (int32)g[7]  - (int32)g[15] + (int32)g[19] )<<7)\
+ 66l*((int32)g[4] -  (int32)g[6]  - (int32)g[16] + (int32)g[18] )\
+ ((int32)g[23]<<8) - ((int32)g[11]<<8) ) )


//24点半波付氏算法 //@2007.08.27  //ZHOUTING
//返回long值并放大128倍,g:连续存放24点数据缓冲区首地址
#define FOURIER_X_24L_HALF(g)  ( (INT32)( 247l*((INT32) g[0] - (INT32)g[10])        \
                                                                         + 222l*((INT32)g[1] - (INT32)g[9])  \
                                                                         + 181l*((INT32)g[2] - (INT32)g[8]) \
                                                                + (((INT32)g[3] -  (INT32)g[7])<<7)  \
                                                                + 66l*((INT32)g[4] -  (INT32)g[6])   \
                                                                - ((INT32)g[11]<<8) ) )

#define FOURIER_R_24L_HALF(g) ( (INT32)( 66l*( (INT32)g[0] + (INT32)g[10] ) \
                                                                + (( (INT32)g[1] + (INT32)g[9] )<<7 )   \
                                                                + 181l*((INT32)g[2] + (INT32)g[8] )  \
                                                                + 222l*((INT32)g[3] +  (INT32)g[7] )  \
                                                                + 247l*((INT32)g[4] +  (INT32)g[6] )  \
                                                                + ((INT32)g[5]<<8) ) )


计算如下:  Aui[24]  放采样点
  UiR = FOURIER_R_24L(Aui)>>8; //计算实部
  UiX = FOURIER_X_24L(Aui)>>8;//计算虚部
  fUi =sqrt_16( UiR*UiR+UiX*UiX);//计算有效值
  AC_val_UIC = (int32)((fUi>>2) * ADJ_PARAM.ADJ_Aui_ratio)/10;   //乘校准系数计算实际输入电压

出0入0汤圆

发表于 2017-7-12 17:24:06 | 显示全部楼层
again 发表于 2017-7-12 08:55
类似,照搬套公式没问题的!

你这程序是哪个窗函数的比值校正?我如果移植到单片机是不是将fft这个函数实现就行?

出0入0汤圆

发表于 2017-7-12 17:40:10 | 显示全部楼层
可使用均值滤波器

出0入0汤圆

发表于 2017-7-14 12:21:05 | 显示全部楼层
again 发表于 2013-7-2 17:14
给你个三点校正算法,精度已经满高的!自己慢慢研究吧!这些算法我们都是实际应用于现场的!
clear all;clc  ...

有没有包含谐波信号的例子,能够计算到32次谐波以上的

出0入0汤圆

发表于 2017-7-14 16:57:45 | 显示全部楼层
NIC 发表于 2017-7-14 12:21
有没有包含谐波信号的例子,能够计算到32次谐波以上的

看来你不是很懂傅里叶!
我上面贴的是通过搜索最大谱线索引K来的,一但你知道基波频率后,谐波所在谱线索引自然就算出来了k=f/(fs/N),一样用校正公式

出0入0汤圆

发表于 2017-7-15 07:37:25 | 显示全部楼层
again 发表于 2017-7-14 16:57
看来你不是很懂傅里叶!
我上面贴的是通过搜索最大谱线索引K来的,一但你知道基波频率后,谐波所在谱线索 ...

谢谢解答,我确实不是很懂,另外请教一下,你采用的是窗谱峰值搜寻算法吗

出0入0汤圆

发表于 2017-7-17 11:01:05 | 显示全部楼层
Clinging 发表于 2013-7-2 16:49
有效值算法,俗称 “均方根”,就是先对这64个数分别求平方,然后平均,再然后开方,结果就是有效值

测频 ...

你肯定没看仔细

出0入0汤圆

发表于 2020-1-2 17:54:17 来自手机 | 显示全部楼层
again 发表于 2013-7-3 08:16
频谱泄漏校正算法可以看看“丁康”老师的书

能否列举一下书名

出0入0汤圆

发表于 2022-3-22 00:51:34 | 显示全部楼层
收藏,空了再看

出0入0汤圆

发表于 2022-4-7 22:58:50 来自手机 | 显示全部楼层
看看,收藏

出0入0汤圆

发表于 2022-5-12 23:12:55 | 显示全部楼层
学习了,已收藏

出0入37汤圆

发表于 2022-5-13 09:43:03 | 显示全部楼层
先做fft,求信号的基频,然后采集整倍数个周期信号,再按照均方根的公式进行计算,如果实时性要求不高的话,多测几次,做个均值滤波或者中值滤波。

前面说测量结果不够是因为采集的点数不是整周期,
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-18 15:58

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表