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.

[参考译文] LAUNCHXL-F2.8377万S:最大速率ADC-DAC

Guru**** 2535880 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/620576/launchxl-f28377s-max-rate-adc-dac

部件号:LAUNCHXL-F2.8377万S

大家好,

我修改了"ADC_SOC_ePWM_cpu01.c"示例,以验证链ADC-DAC的速度。

代码:

//###################################################################
//
//文件:adc_so_ePWM_cpu01.c
////
标题:ADC通过ePWM触发F2837xS。
////
! \addtogroup cpu01_example_list
//! <h1>ADC ePWM触发(ADC_SOC_ePWM)</h1>//
!
//! 此示例设置ePWM以定期触发ADC。
//!
//! 程序运行后,内存将包含:\n
//! -\b AdcaResults \b:
来自//的一系列模数转换样本。 针脚A0。 样本之间的时间根据周期
//! ePWM计时器。
//
//###########################################################################
//$TI发布:F2837xS支持库V210 $//
发布日期:星期二11月1日15:35:23 CDT 2016 $//
$版权:版权所有(C) 2014-2016 Texas2016 Texas Instruments Incorporated -
//             http://www.ti.com/ 保留所有权利$//#########################################################################################


//
//包含的文件
//
#include "F28x_Project.h"

////
函数原型
//
void ConfigureADC (void);
void ConfigureEPWM (void);
void configADCEpwm (UINT16通道);
interrupt void adca1_ISR(void);
void SetupureDAC_B (void);
void set_Sample_Frequency (float fs);



void main (void)
{
////
步骤1。 初始化系统控制:
// PLL,看门狗,启用外设时钟
//此示例功能可在F2837xS_sysctrl.c文件中找到。
//
InitSysCtrl();////


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

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

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


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

////
使用指向shell Interrupt
//服务例程(ISR)的指针初始化PIE矢量表。
//这将填充整个表,即使在此
示例中未使用中断//。 这对于调试非常有用。
// shell ISR例程位于F2837xS_DefaultIsr.C.中
//此函数位于F2837xS_PieVect.C.中
//
InitPieVectorTable();

////
映射ISR函数
//
EALLOW;
PieVectorTable.ADCA1_INT =&adca1_ISR;// ADCA中断1的函数
EDIS;

//
//配置ADC并将其加电
//
配置ADC();
configureDAC_B();////


配置ePWM
//
ConfigureEPWM();////


在通道0
//上为ePWM触发的转换设置ADC
SetupADCEpwm (0);

////
启用全局中断和较高优先级的实时调试事件:
//
IER || M_INT1;//启用组1中断
EINT;//启用全局中断INTM
ERTM;//启用全局实时中断DBGM


////
启用PIE中断
//
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;

////
同步ePWM
//
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;

//
//启动ePWM,永不停止
//


Set_Sample_Frequency (10万.0);//100KHz频率
EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用SOCA
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//unfreeze,并进入UP计数模式


////
在循环
//中无限期接受转换
做
{
ASM (" ESTOP0");
} While (1);
}////


配置ADC -写入ADC配置,并为二者
打开ADC电源// ADC A和ADC B
//
void配置ADC (void){

EALLOW;

//
//写入配置
//
AdcaRegs.ADCCTL2.bit.prescale =6;//将ADCCLK除法器设置为/4
AdcSetMode (ADC_ADCA,ADC_Resolution _12位,ADC_SIGNALMODE_SINGLE);

//
//将脉冲位置设置为延迟
//
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;

//
//打开ADC的电源
//
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;

//
//延迟1毫秒,以使ADC有时间开机
//
DELAY _US (1000);

EDIS;
}////


配置EPWM -配置ePWM SOC并比较值
//
void配置EPWM (void)
{
EALLOW;
//假定ePWM时钟已启用
EPwm1Regs.ETSEL.bit.SOCAEN = 0;//禁用组上的SOC
EPwm1Regs.ETSEL.bit.SOCASEL = 4;//在加电计数时选择SOC
EPwm1Regs.ETPS.bit.SOCAPRD = 1; //在第一个事件上生成脉冲
EPwm1Regs.CMPA.bit.CMPA = 0x0800; //将比较值设置为2048个计数
EPwm1Regs.TBPRD = 0x1000; //将期间设置为4096个计数
EPwm1Regs.TBCTL.bit.CTRMODE = 3; //冻结计数器
EDIS;
}////


SetupADCEpwm -设置ADC ePWM采集窗口
//
void SetupADCEpwm (UINT16通道)
{
UINT16 acqps;

//
//根据分辨率确定最小采集窗口(在SYSCLKS中)
//
IF (ADC_Resolution _12位== AdcaRegs.ADCCTL2.bit.Resolution)
{
acqps =14;//75ns
}
ELSE //分辨率为16位
{
acqps =63;//320ns
}

//
//选择要转换的通道和转换结束标志
//
EALLOW;
AdcaRegs.ADCSOC0CTL.bit.CHSEL =通道;//SOC0将转换针A0
AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;//样例窗口为100 SYSCLK周期
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5;// ePWM1 SOCA/C上的触发器
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;//SOC0的结尾将设置INT1标志
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用INT1标志
AdcaRegs.ADCINTFLGCLL.bit.ADCINT1 =1;//确保INT1标志已清除
EDIS;
}////


adca1_ISR - ISR中的读取ADC缓冲器
//
中断无效adca1_ISR(void)
{
DacbRegs.DACVALS.ALL = AdcaResultRegs.ADCRESULT0;//通过ADC立即将转换值分配给DAC

//使用插入FIR或IIR过滤器进行实时处理
//我的过滤器可以复杂多少以确保流处理?
//什么是200MHz SYSCLOCK的采样率限制?
//什么是DAC速率限制?



ADcaRegs.ADCINTFLGCLL.bit.ADCINT1 = 1;//清除INT1标志
PieCtrlRegs.PIEACK.ALL = PIEACK_Group1;
}////


文件结尾
//




void configureDAC_B(void)

{

EALLOW;



CpuSysRegs.PCLKCR16.bit.DAC_B = 1;//启用DAC_B时钟



DacbRegs.DACCTL.bit.DACREFSEL = 1;//使用ADC VREFHI而不是外部信号

DacbRegs.DACCTL.bit.LOADMODE = 0;// SYSCLK上的负载未启用PWMSYNC (PWM尚未启用)

DacbRegs.DACOUTEN.Bit.DACOUTEN = 1;//启用输出

DacbRegs.DACVALS.ALL = 0;//输出= 0

DELAY _US (10);//缓冲DAC开机延迟



EDIS;

}

void set_Sample_Frequency(FLOAT FS)
{
unsigned int TBPRD =0;
unsigned int CMPA =0;
TBPRD =(unsigned int)((rnd_sp_rs (2亿.0 /(4*FS)-1)));
CMPA =(unsigned int)((rnd_sp_rs ((2.0)-1)));
EPwm1Regs.CMPA.bit.CMPA = CMPA;
EPwm1Regs.TBPRD = TBPRD;

} 



代码运行正常,输出波形可以接受,但我现在没有示例。

我有一些问题, 请将interrupt void adca1_ISR(void)函数读入张贴的代码中。

   
     要确保流处理,我的过滤器可能复杂多少?
     以下哪项是200MHz SYSCLOCK的采样率限制?    
     哪一项是DAC速率限制?

非常感谢您的帮助

此致
Paolo Marsilia。

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

    此设备上的最大PWM时钟为100 MHz。 我想检查您是否知道这一点,因为"Set_Sample_Frequency"函数在计算TBPRD的公式中似乎使用了200 MHz。 由于SYSCLK为200 MHz,因此必须将PERCLKDIVSEL.EPWMCLKDIV设置为/2 (请参阅数据表中的内部时钟频率表)。

    一旦你有了这个,对于100 kHz的采样率,你应该加载1000 十进制的TBPRD。 因此,中断之间有2000 CPU时钟周期,这是可用于支持过滤器和ISR开销的周期数。 它非常多,仅用于筛选。

    要了解处理要求,我建议查看C2000Ware中FPU DSP库中的滤波器功能。 如果您有此信息
    安装在硬盘驱动器的默认位置,说明文件位于:
    C:\ti\c2000Ware_1_00_01_00\libraries\DSP\FPU\c28\docs
    每个功能描述中都有基准测试表。

    ADC采样率是一个更复杂的问题,涉及输入稳定时间。 它不仅仅与CPU时钟速度有关。
    原则上,每个ADC在12位模式下将以高达3.5 MSPS的速率运行。

    数据表中的DAC设置时间为2 us (典型值),因此您可能不希望使用比100 kHz更快的速度。

    我希望这能有所帮助。 如果这不能回答您的所有问题,请回复邮件。

    此致,

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

    PWM的问题是一个奇怪的情况。 我已经在其他项目中使用Set_Sample_Frequency(),这很好:我计算了获得的正弦和方形信号的基频,以使用此函数设置速率,并且检测到的FFT基频是正确的。
    但是我会更好地检查我的代码。

    我只是咨询图书馆,希望尽快使用FIR滤波器模块,以便提供反馈。

    此致

    Paolo