Part Number: TMS320F28P650DK
同样的配置,我的ADCB0的REsult0(SOC0)能读取数据,我的ADCB4的REsult1(SOC1)无法读取数据
initADC();
SetupADC(&AdcaRegs, 4 , 0);//A4 SOC0
SetupADC(&AdcbRegs, 0 , 0);//B0 SOC0
SetupADC(&AdcbRegs, 4 , 1);//B4 SOC1
SetupADC(&AdccRegs, 0 , 0);//C0 SOC0
OLED_ShowStr(65,1,"B4:",16);
OLED_ShowNum(90,1, AdcbResultRegs.ADCRESULT1 ,4,0,16);
OLED_ShowStr(65,3,"B0:",16);
OLED_ShowNum(90,3, AdcbResultRegs.ADCRESULT0 ,4,0,16);
初始化函数与启动函数如下
/*
* 0 1 2
* A A4(Vout) * *
*
* B B4(Iout) B0(BUS-ADC) *
*
*
* C C0(ADC-ADJ) * *
*
* D * * *
*/
// 初始化ADC(模数转换器)模块的配置函数
void initADC(void)
{
// 使能受保护寄存器访问(EALLOW = Enable Allow,TI C2000系列DSP专用指令)
// 后续操作ADC控制寄存器需先解锁该权限,防止误写关键配置
EALLOW;
AnalogSubsysRegs.ANAREFCTL.bit.ANAREFASEL = 1;//用外部基准
AnalogSubsysRegs.ANAREFCTL.bit.ANAREFBSEL = 1;//用外部基准
AnalogSubsysRegs.ANAREFCTL.bit.ANAREFCSEL = 1;//用外部基准
//
// 设置ADCCLK(ADC核心工作时钟)的分频系数为/4,50MHz
// 具体怎么分频配去看数据手册
AdcaRegs.ADCCTL2.bit.PRESCALE = 6;
AdcbRegs.ADCCTL2.bit.PRESCALE = 6;
AdccRegs.ADCCTL2.bit.PRESCALE = 6;
//ADCA 12BIT模式 单通道
//ADCB 12BIT模式 单通道
//ADCC 12BIT模式 单通道
AdcSetMode(ADC_ADCA, ADC_BITRESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);
AdcSetMode(ADC_ADCB, ADC_BITRESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);
AdcSetMode(ADC_ADCC, ADC_BITRESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);
//
// 设置ADC中断脉冲的产生位置为"晚期"(Late)
// INTPULSEPOS=1:中断脉冲在ADC转换完成后延迟产生(避免中断触发过早导致数据未就绪)
// 对比INTPULSEPOS=0(早期):中断脉冲与转换完成信号同步产生
//
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;
AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;
AdccRegs.ADCCTL1.bit.INTPULSEPOS = 1;
//
// 给ADC模块上电,并延迟1毫秒等待ADC稳定
// ADCPWDNZ=1:置1时ADC模块上电(Z表示该位低电平有效,PWD=Power Down,NZ=Not Zero)
// 注:ADC上电后需要一定稳定时间,否则转换数据可能异常
//
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;
AdccRegs.ADCCTL1.bit.ADCPWDNZ = 1;
// 禁用受保护寄存器访问(EDIS = Disable Allow),锁定关键配置
EDIS;
// 延时1000微秒(即1毫秒),等待ADC上电稳定
// DELAY_US:TI C2000系列DSP专用延时函数,参数为微秒数
DELAY_US(1000);
}
/*
* 0 1 2
* A A4(Vout) * *
*
* B B0(BUS-ADC) B4(Iout) *
*
*
* C C0(ADC-ADJ) * *
*
* D * * *
*/
//
// initADCSOC - Function to configure ADCA's SOC0 to be triggered by ePWM1.
// ADCA's SOC1 to be triggered by ePWM2
//
// SetupADCContinuous - 设置ADC在一个通道上连续转换
//
void SetupADC(volatile struct ADC_REGS * adcRegs, Uint16 channel , Uint16 SocNum)
{
Uint16 acqps;
// acqps = 14;
//
// 根据分辨率确定最小采集窗口(SYSCLKS)
// 选择12位
if(ADC_BITRESOLUTION_12BIT == AdcaRegs.ADCCTL2.bit.RESOLUTION)
{
acqps = 14; // 75ns
}
else // 分辨率为16位
{
acqps = 63; // 320ns
}
EALLOW;
switch (SocNum) {
case 0:
adcRegs->ADCSOC0CTL.bit.CHSEL = channel;
adcRegs->ADCSOC0CTL.bit.ACQPS = acqps;
adcRegs->ADCSOC0CTL.bit.TRIGSEL = 7; // trigger on ePWM2 SOCA
break;
case 1:
adcRegs->ADCSOC1CTL.bit.CHSEL = channel;
adcRegs->ADCSOC1CTL.bit.ACQPS = acqps;
adcRegs->ADCSOC1CTL.bit.TRIGSEL = 7; // trigger on ePWM2 SOCA
break;
case 2:
adcRegs->ADCSOC2CTL.bit.CHSEL = channel;
adcRegs->ADCSOC2CTL.bit.ACQPS = acqps;
adcRegs->ADCSOC2CTL.bit.TRIGSEL = 7; // trigger on ePWM2 SOCA
break;
case 3:
adcRegs->ADCSOC3CTL.bit.CHSEL = channel;
adcRegs->ADCSOC3CTL.bit.ACQPS = acqps;
adcRegs->ADCSOC3CTL.bit.TRIGSEL = 7; // trigger on ePWM2 SOCA
break;
case 4:
adcRegs->ADCSOC4CTL.bit.CHSEL = channel;
adcRegs->ADCSOC4CTL.bit.ACQPS = acqps;
adcRegs->ADCSOC4CTL.bit.TRIGSEL = 7; // trigger on ePWM2 SOCA
break;
case 5:
adcRegs->ADCSOC5CTL.bit.CHSEL = channel;
adcRegs->ADCSOC5CTL.bit.ACQPS = acqps;
adcRegs->ADCSOC5CTL.bit.TRIGSEL = 7; // trigger on ePWM2 SOCA
break;
case 6:
adcRegs->ADCSOC6CTL.bit.CHSEL = channel;
adcRegs->ADCSOC6CTL.bit.ACQPS = acqps;
adcRegs->ADCSOC6CTL.bit.TRIGSEL = 7; // trigger on ePWM2 SOCA
break;
case 7:
adcRegs->ADCSOC7CTL.bit.CHSEL = channel;
adcRegs->ADCSOC7CTL.bit.ACQPS = acqps;
adcRegs->ADCSOC7CTL.bit.TRIGSEL = 7; // trigger on ePWM2 SOCA
break;
case 8:
adcRegs->ADCSOC8CTL.bit.CHSEL = channel;
adcRegs->ADCSOC8CTL.bit.ACQPS = acqps;
adcRegs->ADCSOC8CTL.bit.TRIGSEL = 7; // trigger on ePWM2 SOCA
break;
case 9:
adcRegs->ADCSOC9CTL.bit.CHSEL = channel;
adcRegs->ADCSOC9CTL.bit.ACQPS = acqps;
adcRegs->ADCSOC9CTL.bit.TRIGSEL = 7; // trigger on ePWM2 SOCA
break;
case 10:
adcRegs->ADCSOC10CTL.bit.CHSEL = channel;
adcRegs->ADCSOC10CTL.bit.ACQPS = acqps;
adcRegs->ADCSOC10CTL.bit.TRIGSEL = 7; // trigger on ePWM2 SOCA
break;
case 11:
adcRegs->ADCSOC11CTL.bit.CHSEL = channel;
adcRegs->ADCSOC11CTL.bit.ACQPS = acqps;
adcRegs->ADCSOC11CTL.bit.TRIGSEL = 7; // trigger on ePWM2 SOCA
break;
case 12:
adcRegs->ADCSOC12CTL.bit.CHSEL = channel;
adcRegs->ADCSOC12CTL.bit.ACQPS = acqps;
adcRegs->ADCSOC12CTL.bit.TRIGSEL = 7; // trigger on ePWM2 SOCA
break;
case 13:
adcRegs->ADCSOC13CTL.bit.CHSEL = channel;
adcRegs->ADCSOC13CTL.bit.ACQPS = acqps;
adcRegs->ADCSOC13CTL.bit.TRIGSEL = 7; // trigger on ePWM2 SOCA
break;
case 14:
adcRegs->ADCSOC14CTL.bit.CHSEL = channel;
adcRegs->ADCSOC14CTL.bit.ACQPS = acqps;
adcRegs->ADCSOC14CTL.bit.TRIGSEL = 7; // trigger on ePWM2 SOCA
break;
case 15:
adcRegs->ADCSOC15CTL.bit.CHSEL = channel;
adcRegs->ADCSOC15CTL.bit.ACQPS = acqps;
adcRegs->ADCSOC15CTL.bit.TRIGSEL = 7; // trigger on ePWM2 SOCA
break;
default:
;
}
//每个ADC都有四个INT,用到ADCB输出INT1,选择EOC1也就是SOC1结束,ADCB INT1
AdcbRegs.ADCINTSEL1N2.bit.INT1E = 1; //1:ADCINT1 is enabled 0:disable
AdcbRegs.ADCINTSEL1N2.bit.INT1CONT = 0; // no continue mode
AdcbRegs.ADCINTSEL1N2.bit.INT1SEL = 1; // EOC1 is trigger for ADCINT1
AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared
EDIS;
}