工具/软件:Code Composer Studio
您好!
我正在使用 PWM 进行 ADC 转换。 我已按如下方式配置 PWM 和 ADC。 我正在尝试读取超过50 KHz 的信号、但我的 ADC 转换在10 KHz 后会产生干扰。 根据我的配置、我假设在该频率读取信号。 即使我降低 TBPRD=400、我也无法再进一步低于、如果我再低于信号、则会更糟糕。 我的 SYSCLOCKOUT=200MHz。 我的代码和 ADC 转换图如下所示。 谢谢你。
空配置 ADC (空)
{
EALLOW;
//
//write configurations //………………………………… 好的
//
AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
AdcSetMode (ADC_ADCA、ADC_Resolution 12位、ADC_SIGNALMODE_SINGLE);//…… 好的
AdcbRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
AdcSetMode (ADC_ADCB、ADC_Resolution 12位、ADC_SIGNALMODE_SINGLE);//…… 好的
AdcbRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
AdcSetMode (ADC_ADCB、ADC_Resolution 12位、ADC_SIGNALMODE_SINGLE);//…… 好的
//
//将脉冲位置设置为延迟.................................. 好的
//
AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1;//.......................... 好的
AdcbRegs.ADCCTL1.bit.INTPULSEPOS=1;//.......................... 好的
AdccRegs.ADCCTL1.bit.INTPULSEPOS=1;//.......................... 好的
//
//为 ADC 加电................................................... 好的
//
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1; //.......................... 好的
AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1; //.......................... 好的
AdccRegs.ADCCTL1.bit.ADCPWDNZ = 1; //.......................... 好的
//
//延迟1ms 以允许 ADC 加电时间
//
DELAY_US (1000);
EDIS;
}
空配置 EPWM (空)
{
EALLOW;
//假设 ePWM 时钟已启用
ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=1;
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.CMPA.bit.CMPA =200; //将比较值设置为2048个计数
EPwm1Regs.TBPRD = 400; //将周期设置为4096个计数
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;
EPwm1Regs.TBCTL.bit.CTRMODE = 3; //冻结计数器
EDIS;
}
void SetupADCepwm()
{
//
//根据分辨率确定最小采集窗口(在 SYSCLKS 中)
//
//
//选择要转换的通道和转换结束标志
//
EALLOW;
// Ph 电流-------------------------------------------------------
// Ph A 电流
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 14;// ADCIN14
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 14;//采样窗口为 xx SYSCLK 周期14ns
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5;// ePWM1 SOCA/C 上的触发
//中断
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// SOC0结束将设置 INT1标志
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1; //启用 INT1标志
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除
EDIS;
}
中断 void adca1_ISR (void)
{
IA= AdcaResultRegs.ADCRESULT0; //------ 好的
//AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT0;
AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT0;
if (results_buffer_size <= resultsIndex)
{
resultsIndex = 0;
bufferFull = 1;
}
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;
}e2e.ti.com/.../ADC-Fault.docx