请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号: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。