工具/软件:Code Composer Studio
我将 TMS320F28379D 与 Code Composer Studio 结合使用。
使用了'2837x_RFFT_ADC'项目。
我想在'RFFTmagBuff'中取数据的平方根。 所以、我在'main.c'中构建了'RFFTsqrtBuff'、我想我有一些错误、但我找不到 它。
请帮助我 怎么做!
这是我的 main.c 代码
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#include "fpu_rfft.h"//主 include 文件
#include "math.h"
#include "examples_setup.h"
#include "F2837xD_DEVICE.h"
#define RFFT_STOPENAINTS11 //9
#define RFFT_SIZE (1 << RFFT_STOPENAINSages)
#define F_PER_SAMPLE (ADC_SAMPLING_FREQ/(float) RFFT_SIZE)
#pragma DATA_SECTION (RFFTin1Buff、"RFFTdata1")
uint16_t RFFTin1Buff[2*RFFT_SIZE];
#pragma DATA_SECTION (RFFTmagBuff、"RFFTdata2")
float RFFTmagBuff[RFFT_SIZE];///2+1
#pragma DATA_SECTION (RFFToutBuff、"RFFTdata3")
float RFFToutBuff[RFFT_SIZE];
#pragma DATA_SECTION (RFFTF32Coef、"RFFTdata4")
float RFFTF32Coef[RFFT_SIZE];
RFFT_ADC_F32_struct rfft_ADC;
RFFT_ADC_F32_struct_Handle HND_rfft_ADC =&rfft_ADC;//& bit 运算符
RFFT_F32_struct rfft;
RFFT_F32_struct_Handle HND_rfft =&rfft;
volatile uint16_t flagInputReady = 0;
volatile uint16_t sampleIndex = 0;
uint16_t pass = 0;
uint16_t 故障= 0;
_interrupt void adcaIsr();
int16_t main (空)
{//局部变量
uint16_t i、j;
float freq = 0.0;
float freq1 = 0.0;
float RFFTsqrtBuff[RFFT_SIZE];
ifdef 闪存
EALLOW;
Flash0EccRegs.ecc_enable.bit.enable = 0;
memcpy (((uint32_t *)&RamfuncsRunStart、(uint32_t *)&RamfuncsLoadStart、(uint32_t)&RamfuncsLoadSize);
FPU_initFlash();
#endif //闪存
FPU_initSystemClocks();
FPU_initEPIE ();//设置 ADC-A
FPU_initADCA();
FPU_initEPWM ();//将 EPWM1A 设置为采样时钟,将 EPWM2A 设置为要采样的信号
EALLOW;//映射 ISR 函数
PieVectTable.ADCA1_INT =&adcaIsr;// ADCA 中断1的函数
EDIS;//启用全局中断和更高优先级的实时调试事件:
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//启用 ADC1INT
IER |= M_INT1;//启用组1中断
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
FPU_startEPWM ();//启动 ePWM
hnd_rfft_adc->Tail =&(hnd_rfft->OutBuf);
hnd_rfft->FFTize = RFFT_SIZE;// FFT 大小
hnd_rfft->FFTStage = RFFT_STA期;// FFT 级
hnd_rfft_adc->InBuf =&RFFTin1Buff[0];//输入缓冲器(16位 ADC)输入
hnd_rfft->OutBuf =&RFFToutBuff[0];//输出缓冲区
hnd_rfft->CosSinBuf =&RFFTF32Coef[0];// Twiddle 因子
hnd_rfft->MagBuf =&RFFTmagBuff[0];//幅度输出缓冲器
RFFT_F32_SINCOSTable (HND_rfft);//计算旋转因子
对于(i=0;i < RFFT_SIZE;i++){
RFFToutBuff[i]= 0;//清理输出缓冲器
}
对于(i=0;i < RFFT_SIZE;i++){///2
RFFTmagBuff[i]= 0;//清理幅度缓冲器
}
对于(i=0;i < RFFT_SIZE;i++){///2
RFFTsqrtBuff[i]= 0;//清理平方根缓冲器
}
while (1){
while (flagInputReady = 0){};//等待 ADC ISR 设置标志、然后再继续
RFFT_ADC_F32 (HND_rfft_ADC);//使用16位 ADC 输入计算实数 FFT
FlagInputReady = 0;//重置标志
RFFT_F32_MAG (HND_RFFT);//计算幅度
J = 1;
FREQ = RFFTmagBuff[1];
freq1 = RFFTsqrtBuff[1];
for (i=2;<RFFT_SIZE;i++){ // /2+1)
if (RFFTmagBuff[i]> freq){
J = I;
FREQ = RFFTmagBuff[i];
}
for (i=2;<RFFT_SIZE;i++){)
if (RFFTsqrtBuff[i]< freq1){
J = I;
freq1 = sqrtf (RFFTmagBuff[i]);
}
}
}
FREQ = F_PER_SAMPLE *(float) j;
freq1 = f_per_sample *(float) j;
}
Done ();
返回1;
}
_interrupt void adcaIsr ()
{
RFFTin1Buff[sampleIndex++]= AdcaResultRegs.ADCRESULT0;
if (sampleIndex ==(2*RFFT_SIZE -1))){
sampleIndex = 0;
flagInputReady = 1;
}
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;
}
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------