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万:为什么不能使用代码示例'ADC-SOC'更改采样频率?

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/616499/ccs-tms320f28335-why-the-sampling-frequency-can-not-be-changed-with-the-code-example-adc-soc

部件号:TMS320F2.8335万

工具/软件:Code Composer Studio

我想使用TMS320F2.8335万开发套件来处理我的信号。 首先,我需要用ADC对模拟信号进行采样。  

我尝试使用controlSUIT提供的ADC示例(ADC-SOC)。 代码工作正常,但采样频率非常慢。 我使用CCS中的图形工具查看采样信号。 当信号频率大于5Hz时,采样信号会失真。 即使我更改ePWM的PRD (EPwm1Regs.TBPRD = 0x012c;),采样频率仍没有更改。 为什么采样频率这么慢? 为什么我不能更改采样频率。 请任何人帮助我。 非常感谢。

代码如下所示:

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

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

//此示例中使用的全局变量:
UINT16环计数;
UINT16转换计数;
UINT16第1[100]卷;
//UINT16第2[100]卷;

主要()

//步骤1. 初始化系统控制:
// PLL,看门狗,启用外设时钟
//此示例函数位于DSP2833x_sysctrl.c文件中。
InitSysCtrl();

EALLOW;
#IF (CPU_FRQ_150MHz)//默认值- 150 MHz SYSCLKOUT
#define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3)= 25.0 MHz
#endif
#IF (CPU_FRQ_100MHz)
#define ADC_MODCLK 0x2 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2)= 25.0 MHz
#endif
EDIS;

//定义ADCCLK时钟频率(小于或等于25 MHz)
//假定InitSysCtrl()已将SYSCLKOUT设置为150 MHz
EALLOW;
SysCtrlRegs.HISPPCP.ALL = ADC_MODCLK;
EDIS;

//步骤2. 初始化GPIO:
//此示例函数可在DSP2833x_GPIO.c文件和中找到
//说明了如何将GPIO设置为其默认状态。
// InitGpio();//跳过此示例

//步骤3. 清除所有中断并初始化PIE矢量表:
//禁用CPU中断
色调;

//将PIE控件寄存器初始化为其默认状态。
//默认状态是禁用所有PIE中断和标志
//被清除。
//此函数位于DSP2833x_PIECTRL.c文件中。
InitPieCtrl();

//禁用CPU中断并清除所有CPU中断标志:
IER = 0x0000;
IFR = 0x0000;

//使用指向外壳中断的指针初始化PIE矢量表
//服务例程(ISR)。
//这将填充整个表,即使中断也是如此
//在本例中不使用。 这对于调试非常有用。
// shell ISR例程可在DSP2833x_DefaultIsr.C.中找到
//此函数位于DSP2833x_PieVect.C.中
InitPieVectorTable();

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

//步骤4. 初始化所有设备外围设备:
//此函数位于DSP2833x_InitPeripherals.c中
// InitPeripherals();//本示例不需要
InitAdc();//在此示例中,初始化ADC

//步骤5. 用户特定代码,启用中断:

//在PIE中启用ADCINT
PieCtrlRegs.PIEIER1.bit.INTx6=1;
IER || M_INT1;//启用CPU中断1
EINT;//启用全局中断INTM
ERTM;//启用全局实时中断DBGM

LoopCount = 0;
ConversionCount = 0;
// AdcRegs.ADCTRL1.bit.con_run = 0;

//配置ADC
AdcRegs.ADCMAXCONV.ALL = 0x0000;//在SEQ1上设置2个conv
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x3;//将ADCINA3设置为第一个SEQ1转换
// AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x2;//将ADCINA2设置为2nd SEQ1 Conv.
AdcRegs.ADCTRL2.bit.ePWM_SOCA_SEQ1 = 1;//从ePWM启用SOCA以启动SEQ1
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;//启用SEQ1中断(每个EOS)


//假定ePWM1时钟已在InitSysCtrl()中启用;
EPwm1Regs.ETSEL.bit.SOCAEN = 1;//在组上启用SOC
EPwm1Regs.ETSEL.bit.SOCASEL = 4;//在计数增加时从CPMA中选择SOC
EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在第一个事件上生成脉冲
EPwm1Regs.CMPA.Half.CMPA = 0x0080;// set比较值
EPwm1Regs.TBPRD = 0xFFFF;//为ePWM1设置期间
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//开始计数

//等待ADC中断
对于(;;)

LoopCount++;
}
}

__interrupt void ADC_ISR(void)

Voltage1[ConversionCount]= AdcRegs.ADCRESULT0 >>4;
// Voltage2[ConversionCount]= AdcRegs.ADCRESULT1 >>4;

//如果记录了40个转换,请重新开始
IF (ConversionCount == 99)

ConversionCount = 0;


}
否则

ConversionCount++;
}
//为下一个ADC序列重新初始化
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;//重置SEQ1
AdcRegs.ADCST.Bit.INT_SEQ1_CLR = 1;//清除INT SEQ1位
PIECtrlRegs.PIEACK/ALL = PIEACK_Group1;//确认中断到PIE

返回;
}

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

    Cathy,

    您是否可以附加所见内容的屏幕截图?

    汤米

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

    Tommy,

    感谢您的及时回复。  

    我发现了问题。 我删除了中断并更改了断点的位置。 采样频率大大提高到4MHz左右。 但这种情况再也不能改善了。 我读了一些CPU无法处理如此高速进程的解决方案。 采样频率受以下句子限制:

    Voltage1[ConversionCount]= AdcRegs.ADCRESULT0 >>4;

    对吗?  

    此致,

    Cathy

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

    Cathy,

    结果的读数不应是限制因素。  如果要避免位移,只需从AdcMirror寄存器中读取结果即可。

    该数据表宣称最大ADC转换速率为12.5MSPS,因此没有理由不能以高于4MSPS的速度采样。  您可以在数据表中看到波形表,如下所示:

    此外,您还可以在一个序列中启动多个转换,以填充ADC管道。  ADC参考指南中对此进行了说明

    汤米