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.

28377D的ADC16位采样问题

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配置不会有太大问题,可以尝试调整采样窗口大小试试,主要原因还是外部输入的模拟信号可能存在差异。