This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS320F2.8335万:TMS320F2.8335万

Guru**** 2560390 points
Other Parts Discussed in Thread: CONTROLSUITE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/635357/ccs-tms320f28335-tms320f28335

部件号:TMS320F2.8335万
主题中讨论的其他部件:controlSUITE

工具/软件:Code Composer Studio

我正在使用以下代码(来自控制套件的定点库)。 该代码不能用于执行实时FFT。请帮助我获取ADC A0上提供的信号的FFT组件。  

//===========================================================================================================================
//此软件已获得许可,可以与德州仪器(TI) C28x一起使用
//家庭DSC。 此许可证是在安装之前提供给您的
//软件。 您可以通过查阅的副本来查看此许可证
//此库的doc目录中的协议。
//------------------
//版权所有(C) 2010-2011 Texas2011 Texas Instruments,Incorporated。
//保留所有权利。
//===========================================================================================================================
//
//文件:main.c --具有12位ADC输入测试示例的实时RFFT
//
//标题:DSP2833x器件实时FFT测试程序。
//
//=============================================================================================================
//描述:
//
//此程序显示如何计算具有12位实时ADC的真实FFT
//输入和相关频谱幅值,相位。 输入数据为
//由中断服务例程函数ADC_ISR()收集。 信号
//输入(可以是来自信号发生器或传感器的任何信号)被摘录
//输入ADC A0。 信号由ePWM模块和采样进行采样
//频率在Lab.h中定义 这是48kHz。 的动态范围
//输入信号应小于0~3V。 进行实时实际FFT
//逐帧。 只要ADC_ISR收集一帧数据,
//将设置FFTStartFlag。 只要主程序检测到
// FFTStartFlag设置,FFT计算开始。 FFTStartFlag被清除
//计算完成后。
//
//如果使用,输入缓冲区必须与FFT大小的倍数对齐
// RFFT_ADC_F32。 如果您不希望对齐输入缓冲区,请使用
// RFFT_ADC_f32u函数。 在这种情况下,节对齐#pragma可以
//评论。 但是,使用此功能会降低循环性能
算法的//。
//
//
//功能:
//
//作废RFFT_ADC_F32 (RFFT_ADC_F32_structt *)
//作废RFFT_F32_MAG (RFFT_F32_structt *)
//作废RFFT_F32_phase (RFFT_F32_structt *)
//
//其中RFFT_ADC_F32_structure是定义为:
//
// typedef结构{
// UINT16 * InBuf;
// void *尾;
//} RFFT_ADC_F32_struct;
//
//其中RFFT_F32_struct是定义为以下内容的结构:
//
// typedef结构{
// float32 *InBuf;
// float32 *OutBuf;
// float32 *CosSinBuf;
// float32 * MagBuf;
// float32 * PhaseBuf;
// UINT16 FFTSize;
// UINT16 FFTStages;
//} RFFT_F32_struct;
//
//假设:
//
//* RFFT_F32_struct的OutBuf必须传递给Tail of
// RFFT_ADC_F32_struct
//*输入信号存储在Signal.asm中
//* FFTSize必须是2的幂(32,6.4128万等)
//* FFTSize必须大于或等于32
//* FFTStages必须为log2 (FFTSize)
//* InBuf,OutBuf,CosSinBuf的长度是FFTSize
//* MagBuf和PhaseBuf的长度为FFTSize/2+1
//*此函数不使用MagBuf和PhaseBuf。
//它们仅用于磁位和相位计算函数。
//
//监视变量:
//
// InBuf (RFFT_ADC_F32_structt)输入缓冲区
// InBuf (RFFT_F32_struct)未使用
// Tail存储OutBuf的地址
// OutBuf输出缓冲区
// CosSinBuf Twiddle因子缓冲区
// MagBuf幅度缓冲器
// PhaseBuf相位缓冲区
// j标准化数字频率组件的索引
//原始信号的频率真实模拟频率
//
//###################################################################
//$TI发行版:C28x浮点库1.30 单元$
//$发布日期:2012年1月4日$
//###################################################################

#include "DSP28x_Project.h"//设备头文件和示例包括文件
包含"math.h"
#include "float.h"
#include "FPU.h"

#define RFFT_Stages 9.
#define RFFT_size (1 << RFFT_STEEN级)

#define ADC_BUF_LEN RFFT_SIZE // ADC buffer length
#define ADC_SAMPLE_Period 3124 // 3124 =(3125-1)= 48 KHz采样,带150 MHz SYSCLKOUT

#define F_per样本4.8万.0L/(FLOC)RFFT_SIZE //内部采样率为48kHz

RFFT_ADC_F32_structt rfft_ADC;
RFFT_F32_structt rfft;

Float32 RFFToutBuff[RFFT_size];//计算的FFT结果
Float32 RFFTF32Coef[RFFT_size];//系数表缓冲区
Float32 RFFTmagBuff[RFFT_size/2+1];//Magnitude of frequency spectrum

//---全局变量
UINT16 AdcBuf[ADC_BUF_LEN];// ADC缓冲区分配

Volatile UINT16 FFTStartFlag =0;//一个帧数据就绪标志

UINT16 DEBUG_TOGGLE = 1;//用于实时模式调查

//本文件中找到的函数的prototype语句。
中断无效ADC_ISR(void);

/****************************************************************
*函数:main()
*
*说明:C2833x实时RFFT的主要功能
*************** /
Void主(void)

UINT16 I,j;
float32 freq;//单频率分量信号的频率

//--- CPU初始化
InitSysCtrl();//初始化CPU (文件:sysctrl.c)
InitGpio();//初始化共享GPIO引脚(文件:gPIO.c)
InitPieCtrl();//初始化并启用PIECTRL.c (文件:PIECTRL.c)

//---外围设备初始化
InitAdc();//初始化ADC (文件:adc.c)

//本示例中使用的中断被重新映射到
//此文件中找到ISR函数。
EALLOW;//这是写入EALLOW保护寄存器所必需的
PieVectorTable.ADCINT =&ADC_ISR;
EDIS;//这是禁用写入EALLOW保护寄存器所必需的

rfft_adc.Tail =&rfft.OutBuf;//将RFFT_ADC_F32_structt链接到
//RFFT_F32_struct. 的尾指针
//RFFT_ADC_F32_structt被传递到
// RFFT_F32_struct的OutBuf指针
rfft.FFTSize = RFFT_SIZE;//实际FFT大小
rfft.FFTStages = RFFT_Stages;//Real FFT Stages
Rfft_ADC.InBuf =&AdcBuf[0];//输入缓冲区
rfft.OutBuf =&RFFToutBuff[0];//输出缓冲区
Rfft.CosSinBuf =&RFFTF32Coef[0];//twiddle因子
rfft.MagBuf =&RFFTmagBuff[0];//Magnitude输出缓冲区

RFFT_F32_Sincostable (&rfft);//计算宽度因子

//清除输出缓冲区
对于(i=0;i < RFFT_SIZE;i++)

RFFToutBuff[i]= 0;
}

//清除量级缓冲区
对于(i=0;i < RFFT_size=2;i++)

RFFTmagBuff[i]= 0;
}

//---启用全局中断
ASM (" CLRC INTM,DBGM");//启用全局中断和实时调试

//---主环路
while (1)//无限循环-等待中断

IF (FFTStartFlag)//如果一个帧数据就绪,则执行FFT

RFFT_ADC_f32u (&rfft_ADC);//此版本的FFT不需要缓冲区对齐
RFFT_F32_MAG (&rfft);//计算频谱振幅

J = 1;
Freq = RFFTmagBuff[1];
对于(i=2;i<RFFT_size=2+1;i++)

//查找频谱幅度的最大值
IF (RFFTmagBuff[i]> freq)

J = I;
Freq = RFFTmagBuff[i];
}
}

Freq = F_Per抽样*(float) j;//将标准化数字频率转换为模拟频率

FFTStartFlag =0;//开始收集下一帧数据
}
ASM (" NOP");
}
}//main()的结尾

中断无效ADC_ISR(void)

静态UINT16 *AdcBufPtr = AdcBuf;//指向ADC数据缓冲器的指针
静态易失性UINT16 GPIO34_COUNT = 0;//引脚切换计数器

PIECtrlRegs.PIEACK/ALL = PIEACK_Group1;//必须确认PIE组

//---管理ADC寄存器
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;//将SEQ1重置为CONV00状态
AdcRegs.ADCST.Bit.INT_SEQ1_CLR = 1;//清除ADC SEQ1中断标志

//--读取ADC结果
*AdcBufPter++= AdcMirror.ADCRESULT0;//读取结果

//--强力使用循环缓冲区
IF( AdcBufPtr ==(AdcBuf + ADC_BUF_LEN))

AdcBufPtr = AdcBuf;//将指针反转至开头
FFTStartFlag =1;//一个帧数据就绪
}

//--示例:切换GPIO18以便我们可以使用ADC读取它
IF (DEBUG_Toggle == 1)

GpioDataRegs.GPATOGLE.bit.GPIO18 = 1;//切换引脚
}

//--示例:以0.5 秒速率切换GPIO34 (连接到controlCARD上的LED)。
//(1/4.8万 sec/sample)*(1 samples/int)*(x中断/切换)=(0.5 sec/切换)
//=> x = 2.4万
IF (GPIO34_COUNT++> 2.4万)//缓慢切换以查看LED闪烁

GpioDataRegs.GPBTOGLE.bit.GPIO34 = 1;//切换引脚
GPIO34_COUNT = 0;//重置计数器
}

返回;
}//main()的结尾

//===========================================================================================================================================
//文件结束
//===========================================================================================================================================

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Nikhil,

    您能否提供有关该问题的更多信息? 如果您可以提供一些实验结果和错误描述,这将非常有用。 谢谢你。

    此致,
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Chen:

    感谢您的回复。

    我从controlSUITE导入了上述代码,并在实验套件TMS320F2.8335万上运行。 调试后,发现ADC输入的变化不会改变任何ADCRIRROR。 我没有观察到任何登记结果的变化。

    还观察到ePWM和ADC设置不在触发ADC采样的代码中。

    敬请推荐。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Nikhil,

    您回答正确。 初始化ADC和配置中断触发器的代码未被忽略。 这里有一个相关的帖子: e2e.ti.com/.../176.849万

    在最新的DSP lib发行版(v1_50_00_00)中,示例已被F2837x取代,其中确实包含了正确的初始化代码。 很遗憾,我没有计划返回并修复之前的示例,但是您应该能够根据另一篇文章中的讨论自行修改F2.8335万代码。

    此致,

    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    更正:“The code to initialize the ADC and configure the interrupt trigger was省略了。”