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

2019-12-27 18:38发布

采集的交流信号经过了FFT,出来了64点的幅度,相位,虚部和实部。如何计算交流电流有效值,频率?
现在用了很多计算方法,结果不太好!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
34条回答
zhang0352505
1楼-- · 2019-12-30 21:52
 精彩回答 2  元偷偷看……
splfsp
2楼-- · 2019-12-31 00:44
zhang0352505 发表于 2017-7-12 11:49
是吗?采集64个点,均方根法可以做到1%?为啥我就做到2%?

采集到AD值精度能保证吗? 我之前好像是用标准源校正过的
zhang0352505
3楼-- · 2019-12-31 05:00
splfsp 发表于 2017-7-12 12:06
采集到AD值精度能保证吗? 我之前好像是用标准源校正过的

不校准,直接上的。。。校准太麻烦。。
yuguoliang
4楼-- · 2019-12-31 06:37
给个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;   //乘校准系数计算实际输入电压
NIC
5楼-- · 2019-12-31 11:43
again 发表于 2017-7-12 08:55
类似,照搬套公式没问题的!

你这程序是哪个窗函数的比值校正?我如果移植到单片机是不是将fft这个函数实现就行?
Jacky.Qiu
6楼-- · 2019-12-31 11:52
 精彩回答 2  元偷偷看……

一周热门 更多>