TI中文支持网
TI专业的中文技术问题搜集分享网站

28377D上12位AD采样时间问题

在自己的工程下测试AD采样问题的时候发现当触发AD转换的时间过短的时候,16位AD采样转换的结果寄存器还在更新的,而12位采样转换的的结果寄存器却不再更新,均显示为零值;

为了有个比较,基于28377D的TI提供的单核例程《adc_soc_software_cpu01》进行测试;测试环境的设置为系统主频200MHz,ADC外设时钟设置为50MHz;ACQPS不论差分采样还是单端采样均设置为了63;AD采样的触发源为软件触发;分别将A口设置为16bit输入以及将B口设置为12bit输入;并分别设置两路信号:即A0/A1;A2/A3;B0;B1;

//PART1

void ConfigureADC(void)
{
EALLOW;

//write configurations
AdcaRegs.ADCCTL2.bit.PRESCALE = 6; //set ADCCLK divider to /4
AdcbRegs.ADCCTL2.bit.PRESCALE = 6; //set ADCCLK divider to /4
AdcSetMode(ADC_ADCA, ADC_RESOLUTION_16BIT, ADC_SIGNALMODE_DIFFERENTIAL);
AdcSetMode(ADC_ADCB, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);

//Set pulse positions to late
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;
AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;

//power up the ADCs
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;

DELAY_US(1000);

EDIS;
}

PART2:

void SetupADCSoftware(void)
{
Uint16 acqps;

acqps = 63;

EALLOW;
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0;         //SOC0 will convert pin A0/A1
AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps; //sample window is acqps + 1 SYSCLK cycles
AdcaRegs.ADCSOC1CTL.bit.CHSEL = 2;         //SOC1 will convert pin A2/A3
AdcaRegs.ADCSOC1CTL.bit.ACQPS = acqps; //sample window is acqps + 1 SYSCLK cycles

AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0;         //SOC0 will convert pin B0
AdcbRegs.ADCSOC0CTL.bit.ACQPS = acqps; //sample window is acqps + 1 SYSCLK cycles
AdcbRegs.ADCSOC1CTL.bit.CHSEL = 1;         //SOC1 will convert pin B1
AdcbRegs.ADCSOC1CTL.bit.ACQPS = acqps; //sample window is acqps + 1 SYSCLK cycles

EDIS;
}

//PART3:

do{
 AdcaRegs.ADCSOCFRC1.all = 0x0003; //SOC0 and SOC1
AdcbRegs.ADCSOCFRC1.all = 0x000F; //SOC0 and SOC1
for(i = 0; i < delaycount; i++){asm(" RPT#100 || NOP");}
}while(1);

如上所示,当delaycount=5的时候,表示2.5us的采样间隔,A口结果寄存器和B口结果寄存器都能显示数据并刷新数据;

当设置delaycount=3时,表示1.5us的采样间隔,此时作为16bit的A口数据还在更新而作为12bit的B口却不再更新数据,B口结果寄存器的数值均为零值;

想请教高手的是按理说正常采样保持和转换的时间总共应该是16bit的模式占用的时间会更多一些,当采样间隔缩短后首先受到影响发生异常的应该是16bit的采样模式啊,这里看上去似乎是12bit的采样模式更占用时间,不知道怎么理解了?????

kafei zhang:

补充下:上面的do..while即为主循环,且上述中关于B口采样的发起语句赋值为0x0003而不是0x000F,此处以作说明。

在自己的工程下测试AD采样问题的时候发现当触发AD转换的时间过短的时候,16位AD采样转换的结果寄存器还在更新的,而12位采样转换的的结果寄存器却不再更新,均显示为零值;

为了有个比较,基于28377D的TI提供的单核例程《adc_soc_software_cpu01》进行测试;测试环境的设置为系统主频200MHz,ADC外设时钟设置为50MHz;ACQPS不论差分采样还是单端采样均设置为了63;AD采样的触发源为软件触发;分别将A口设置为16bit输入以及将B口设置为12bit输入;并分别设置两路信号:即A0/A1;A2/A3;B0;B1;

//PART1

void ConfigureADC(void)
{
EALLOW;

//write configurations
AdcaRegs.ADCCTL2.bit.PRESCALE = 6; //set ADCCLK divider to /4
AdcbRegs.ADCCTL2.bit.PRESCALE = 6; //set ADCCLK divider to /4
AdcSetMode(ADC_ADCA, ADC_RESOLUTION_16BIT, ADC_SIGNALMODE_DIFFERENTIAL);
AdcSetMode(ADC_ADCB, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);

//Set pulse positions to late
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;
AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;

//power up the ADCs
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;

DELAY_US(1000);

EDIS;
}

PART2:

void SetupADCSoftware(void)
{
Uint16 acqps;

acqps = 63;

EALLOW;
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0;         //SOC0 will convert pin A0/A1
AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps; //sample window is acqps + 1 SYSCLK cycles
AdcaRegs.ADCSOC1CTL.bit.CHSEL = 2;         //SOC1 will convert pin A2/A3
AdcaRegs.ADCSOC1CTL.bit.ACQPS = acqps; //sample window is acqps + 1 SYSCLK cycles

AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0;         //SOC0 will convert pin B0
AdcbRegs.ADCSOC0CTL.bit.ACQPS = acqps; //sample window is acqps + 1 SYSCLK cycles
AdcbRegs.ADCSOC1CTL.bit.CHSEL = 1;         //SOC1 will convert pin B1
AdcbRegs.ADCSOC1CTL.bit.ACQPS = acqps; //sample window is acqps + 1 SYSCLK cycles

EDIS;
}

//PART3:

do{
 AdcaRegs.ADCSOCFRC1.all = 0x0003; //SOC0 and SOC1
AdcbRegs.ADCSOCFRC1.all = 0x000F; //SOC0 and SOC1
for(i = 0; i < delaycount; i++){asm(" RPT#100 || NOP");}
}while(1);

如上所示,当delaycount=5的时候,表示2.5us的采样间隔,A口结果寄存器和B口结果寄存器都能显示数据并刷新数据;

当设置delaycount=3时,表示1.5us的采样间隔,此时作为16bit的A口数据还在更新而作为12bit的B口却不再更新数据,B口结果寄存器的数值均为零值;

想请教高手的是按理说正常采样保持和转换的时间总共应该是16bit的模式占用的时间会更多一些,当采样间隔缩短后首先受到影响发生异常的应该是16bit的采样模式啊,这里看上去似乎是12bit的采样模式更占用时间,不知道怎么理解了?????

kafei zhang:

回复 kafei zhang:

另:参考28377的数据手册,12位AD转换的时间(从采样保持时间结束点到AD转换完毕)为10.5ADCCLK;16位AD转换时间为29.5ADCCLK;所以两路12位AD总的转换时间应该大约是2*((63+1)*SYSCLK + 10.5 * ADCCLK )=2* (64*5 + 10.5*20)ns=1260ns;而两路16位AD总的转换时间应该大约是2*((63+1)*SYSCLK + 29.5 * ADCCLK)=2*(64*5+29.5*20)ns=1820ns;也就是说如果要发生AD采样异常,也应该是16位差分采样的两个通道而非12位采样的两个数据;请大家指点。

赞(0)
未经允许不得转载:TI中文支持网 » 28377D上12位AD采样时间问题
分享到: 更多 (0)