calc_fft
Posted firstparke
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了calc_fft相关的知识,希望对你有一定的参考价值。
/******************************************************0x005E******************************************************/ /* * sw 三相电流不平衡度 */ void CurrentUnbanceShell(slot_enum _no) TSlotState SlotInfo = .Io1Set = 1, .Io4Set = 0, .Io4Out = 1, .VddVol = 1, .AD0En = 1, .AD1En = 1; unsigned char ADId[3][2] = 15, 13, 16, 4, 11, 3 ; uint16_t Input_u16[256]; float Input_f32[256], Kp = 19.96008;//1000/50.1; FFTRunData _fft; SUnbalance _sun; float Am[256]; float Phase[256]; float AmHarm[10]; float PhaseHarm[10]; float FreqHarm[10]; float abc[3][2], unbalanceBasic[3], unbalZero, unbalNega; SensorSlotCreate(_no, &SlotInfo); osDelay(500); /* FFT算出基波和相位 */ GPIO4[_no]->BSRR = 1<< (GPIOPos4[_no] + 16);//ADC_AII0 - ADC_AII2 osDelay(500); GeneralGetADSamples(ADId[_no][0], 500, Input_u16, 256); for(int i = 0; i < 256; i++) Input_f32[i] = (float)(Kp*(AD_CLAC(Input_u16[i]) - 1650.0)); for(int i=0;i<256;i++)//生成信号序列 Input_f32[i]=230*arm_sin_f32(2*PI*i*49.5/2000+5*PI/3); //生成实部 FFT_NEW(&_fft, 2000, Input_f32, Am, Phase, AmHarm, PhaseHarm, FreqHarm); FFT_RUN(_fft); abc[0][0] = AmHarm[0]*0.70710678;//基波有效值 abc[0][1] = PhaseHarm[0];//基波相位 MSG_LOG("Ia_rms is %f, Ia_phase is %f\r\n", abc[0][0], abc[0][1]); GeneralGetADSamples(ADId[_no][1], 500, Input_u16, 256); for(int i = 0; i < 256; i++) Input_f32[i] = (float)(Kp*(AD_CLAC(Input_u16[i]) - 1650.0)); for(int i=0;i<256;i++)//生成信号序列 Input_f32[i]=228*arm_sin_f32(2*PI*i*49.5/2000+PI/3); //生成实部 FFT_NEW(&_fft, 2000, Input_f32, Am, Phase, AmHarm, PhaseHarm, FreqHarm); FFT_RUN(_fft); abc[2][0] = AmHarm[0]*0.70710678; abc[2][1] = PhaseHarm[0]; MSG_LOG("Ic_rms is %f, Ic_phase is %f\r\n", abc[2][0], abc[2][1]); GPIO4[_no]->BSRR = 1<< GPIOPos4[_no];//ADC_AII1 - ADC_AII3 osDelay(500); GeneralGetADSamples(ADId[_no][0], 500, Input_u16, 256); for(int i = 0; i < 256; i++) Input_f32[i] = (float)(Kp*(AD_CLAC(Input_u16[i]) - 1650.0)); for(int i=0;i<256;i++)//生成信号序列 Input_f32[i]=230*arm_sin_f32(2*PI*i*49.5/2000+PI); //生成实部 FFT_NEW(&_fft, 2000, Input_f32, Am, Phase, AmHarm, PhaseHarm, FreqHarm); FFT_RUN(_fft); abc[1][0] = AmHarm[0]*0.70710678; abc[1][1] = PhaseHarm[0]; MSG_LOG("Ib_rms is %f, Ib_phase is %f\r\n", abc[1][0], abc[1][1]); /* 对称分量法算出正序负序和零序分量 */ _sun.a.real = abc[0][0]*cos(abc[0][1]*0.0174533);//PI/180 _sun.a.image = abc[0][0]*sin(abc[0][1]*0.0174533); _sun.b.real = abc[1][0]*cos(abc[1][1]*0.0174533); _sun.b.image = abc[1][0]*sin(abc[1][1]*0.0174533); _sun.c.real = abc[2][0]*cos(abc[2][1]*0.0174533); _sun.c.image = abc[2][0]*sin(abc[2][1]*0.0174533); SymmetryWeight(&_sun); /* 按国标算出零序不平衡和负序不平衡 */ unbalanceBasic[1] = sqrt(_sun.z1.real*_sun.z1.real + _sun.z1.image*_sun.z1.image); unbalanceBasic[2] = sqrt(_sun.z2.real*_sun.z2.real + _sun.z2.image*_sun.z2.image); unbalanceBasic[0] = sqrt(_sun.z0.real*_sun.z0.real + _sun.z0.image*_sun.z0.image); unbalNega = unbalanceBasic[2]/unbalanceBasic[1]; unbalZero = unbalanceBasic[0]/unbalanceBasic[1]; MSG_LOG("unbalance Zero is %f, unbalance Nega is %f\r\n", unbalZero, unbalNega); TSlotState SlotInfo = .Io1Set = 1, .Io4Set = 0, .Io4Out = 1, .VddVol = 1, .AD0En = 1, .AD1En = 1; unsigned char ADId[3][2] = 15, 13, 16, 4, 11, 3 ; uint16_t Input_u16[256*2], Input_u16_A[256], Input_u16_C[256],fs = 2000;; float Input_f32[256], Kp = 0.1996008;//1000/50.1; FFTRunData _fft; SUnbalance _sun; float Am[256]; float Phase[256]; float AmHarm[10]; float PhaseHarm[10]; float FreqHarm[10]; float abc[3][3], unbalanceBasic[3], unbalZero, unbalNega; SensorSlotCreate(_no, &SlotInfo); osDelay(500); /* FFT算出基波和相位 */ GPIO4[_no]->BSRR = 1<< (GPIOPos4[_no] + 16);//ADC_AII0 - ADC_AII2 osDelay(500); GeneralGetADSamples(&ADId[_no][0], 2, 500, Input_u16, 256); #if 1 for(int i= 0; i<256; i++) Input_u16_A[i] = Input_u16[2*i]; Input_u16_C[i] = Input_u16[2*i+1]; #endif for(int i = 0; i < 256; i++) Input_f32[i] = (float)(Kp*(AD_CLAC(Input_u16_A[i]) - 1650.0)); FFT_NEW(&_fft, fs, Input_f32, Am, Phase, AmHarm, PhaseHarm, FreqHarm); FFT_RUN(_fft); abc[0][0] = AmHarm[0]*0.70710678;//基波有效值 abc[0][1] = PhaseHarm[0];//基波相位 abc[0][2] = FreqHarm[0];//基波频率 MSG_LOG("Ia_rms is %f, Ia_phase is %f, Ia_freq is %f\r\n", abc[0][0], abc[0][1], abc[0][2]); for(int i = 0; i < 256; i++) Input_f32[i] = (float)(Kp*(AD_CLAC(Input_u16_C[i]) - 1650.0)); FFT_NEW(&_fft, fs, Input_f32, Am, Phase, AmHarm, PhaseHarm, FreqHarm); FFT_RUN(_fft); abc[2][0] = AmHarm[0]*0.70710678; abc[2][1] = PhaseHarm[0]; abc[2][2] = FreqHarm[0];//基波频率 MSG_LOG("Ic_rms is %f, Ic_phase is %f, Ic_freq is %f\r\n", abc[2][0], abc[2][1], abc[2][2]);
以上是关于calc_fft的主要内容,如果未能解决你的问题,请参考以下文章