Other Parts Discussed in Thread: CONTROLSUITE
根据controlsuite中的adc_soc_software编写程序,ADCA配置为16位,ADCB、ADCC、ADCD配置成为12位,12位的程序result精度稳定程度还行可以接受,ADCA的16位差分输入0Vresult结果应该是65536/2=32768,可我这里数据读出来是34096,基准电平3V,P脚和N脚对地同为2.93V,请问16位ADC使用和配置和12位有什么不一样么?
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.
Other Parts Discussed in Thread: CONTROLSUITE
根据controlsuite中的adc_soc_software编写程序,ADCA配置为16位,ADCB、ADCC、ADCD配置成为12位,12位的程序result精度稳定程度还行可以接受,ADCA的16位差分输入0Vresult结果应该是65536/2=32768,可我这里数据读出来是34096,基准电平3V,P脚和N脚对地同为2.93V,请问16位ADC使用和配置和12位有什么不一样么?
EALLOW;
AdcaRegs.ADCCTL2.bit.PRESCALE = 6; //set ADCCLK divider to /4
AdcSetMode(ADC_ADCA, ADC_RESOLUTION_16BIT, ADC_SIGNALMODE_DIFFERENTIAL);//write configurations
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;//Set pulse positions to late
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;//power up the ADCs
DELAY_US(1000);
//ADCIN1P&ADCIN1N
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0; //SOC0 will convert pin A0&A1
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 63; //sample window is acqps +
//1 SYSCLK cycles
//320ns
//ADCIN2P&ADCIN2N
AdcaRegs.ADCSOC1CTL.bit.CHSEL = 2; //SOC1 will convert pin A2&A3
AdcaRegs.ADCSOC1CTL.bit.ACQPS = 63; //sample window is acqps +
//1 SYSCLK cycles
//320ns
//ADCIN3P&ADCIN3N
AdcaRegs.ADCSOC2CTL.bit.CHSEL = 4; //SOC2 will convert pin A4&A5
AdcaRegs.ADCSOC2CTL.bit.ACQPS = 63; //sample window is acqps +
//1 SYSCLK cycles
//320ns
//ADCIN4P&ADCIN4N
AdcaRegs.ADCSOC3CTL.bit.CHSEL = 14; //SOC3 will convert pin A14&A15
AdcaRegs.ADCSOC3CTL.bit.ACQPS = 63; //sample window is acqps +
//1 SYSCLK cycles
//320ns
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 3; //end of SOC1 will set INT1 flag
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1; //enable INT1 flag
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared
EDIS;
以上为配置函数,以下为main主循环函数
//start conversions immediately via software, ADCA
AdcaRegs.ADCSOCFRC1.all = 0x000F; //SOC0 ~ SOC3
//wait for ADCA to complete, then acknowledge flag
while(AdcaRegs.ADCINTFLG.bit.ADCINT1 == 0);
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
//store results
AdcaResult0 = AdcaResultRegs.ADCRESULT0;
AdcaResult1 = AdcaResultRegs.ADCRESULT1;
AdcaResult2 = AdcaResultRegs.ADCRESULT2;
AdcaResult3 = AdcaResultRegs.ADCRESULT3;
读出来的数据和以上所说的问题一样,请问这个3V / 65536 * (34096-32768) = 60mV的误差是因为我程序配置的问题吗?我在硬件管脚上量查分电压为4mV
既然有相近的转换结果,就说明ADC配置不会有太大问题,可以尝试调整采样窗口大小试试,主要原因还是外部输入的模拟信号可能存在差异。