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.

F28379D的ADCA为什么会产生额外的偏置?

Other Parts Discussed in Thread: C2000WARE

采用的是TI官方的controlCard,我自己做的底板。

程序流程如下:先采样64次获得各个通道的固定偏置(电路上约为1.5V),然后在后续读取寄存器时减去这些偏置。

理论上,去掉偏置后,后续的读数应在0附近。ADCC和ADCD这两个ADC的结果都是正确,波动仅有2个LSB。主要问题是ADCA,减去偏置后,读数分别在[-7,-6,-5,-3,-4,-4]左右波动2个LSB。ADCB的第二个通道也有这样的问题。

我的疑问是:如果是因为外部电路不正确,那这个波动为什么还会有一个直流量?例如ADCA的第一个通道,如果它是在±7LSB范围内波动,我会怀疑是外部电路噪声过大,但现在是-7±2LSB,这个-7到底是怎么来的?

ADC的配置代码如下:

    EALLOW;
    AdcaRegs.ADCCTL2.bit.PRESCALE = 6; //50MHz
    AdcSetMode(ADC_ADCA, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);  //ADC_A 12位/单端模式
    AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;   //转换结束产生中断
    AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;      //上电

    AdcbRegs.ADCCTL2.bit.PRESCALE = 6; //50MHz
    AdcSetMode(ADC_ADCB, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);  //ADC_A 12位/单端模式
    AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;   //转换结束产生中断
    AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;      //上电

    AdccRegs.ADCCTL2.bit.PRESCALE = 6; //50MHz
    AdcSetMode(ADC_ADCC, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);  //ADC_A 12位/单端模式
    AdccRegs.ADCCTL1.bit.INTPULSEPOS = 1;   //转换结束产生中断
    AdccRegs.ADCCTL1.bit.ADCPWDNZ = 1;      //上电

    AdcdRegs.ADCCTL2.bit.PRESCALE = 6; //50MHz
    AdcSetMode(ADC_ADCD, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);  //ADC_A 12位/单端模式
    AdcdRegs.ADCCTL1.bit.INTPULSEPOS = 1;   //转换结束产生中断
    AdcdRegs.ADCCTL1.bit.ADCPWDNZ = 1;      //上电

    DELAY_US(1000); //延时1ms

    AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0;  //SOC0 will convert pin ADCA0(板子上为AD1)
    AdcaRegs.ADCSOC1CTL.bit.CHSEL = 1;  //SOC1 will convert pin ADCA1(板子上为AD2)
    AdcaRegs.ADCSOC2CTL.bit.CHSEL = 2;  //SOC2 will convert pin ADCA2(板子上为AD3)
    AdcaRegs.ADCSOC3CTL.bit.CHSEL = 3;  //SOC3 will convert pin ADCA3(板子上为AD4)
    AdcaRegs.ADCSOC4CTL.bit.CHSEL = 4;  //SOC4 will convert pin ADCA4(板子上为AD5)
    AdcaRegs.ADCSOC5CTL.bit.CHSEL = 5;  //SOC5 will convert pin ADCA5(板子上为AD6)
    AdcaRegs.ADCSOC6CTL.bit.CHSEL = 5;  //SOC6 will convert pin ADCA5(板子上为AD6)
    AdcaRegs.ADCSOC7CTL.bit.CHSEL = 4;  //SOC7 will convert pin ADCA4(板子上为AD5)
    AdcaRegs.ADCSOC8CTL.bit.CHSEL = 3;  //SOC8 will convert pin ADCA3(板子上为AD4)
    AdcaRegs.ADCSOC9CTL.bit.CHSEL = 2;  //SOC9 will convert pin ADCA2(板子上为AD3)
    AdcaRegs.ADCSOC10CTL.bit.CHSEL = 1;  //SOC10 will convert pin ADCA1(板子上为AD2)
    AdcaRegs.ADCSOC11CTL.bit.CHSEL = 0;  //SOC11 will convert pin ADCA0(板子上为AD1)

    AdcaRegs.ADCSOC0CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcaRegs.ADCSOC1CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcaRegs.ADCSOC2CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcaRegs.ADCSOC3CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcaRegs.ADCSOC4CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcaRegs.ADCSOC5CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcaRegs.ADCSOC6CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcaRegs.ADCSOC7CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcaRegs.ADCSOC8CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcaRegs.ADCSOC9CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcaRegs.ADCSOC10CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcaRegs.ADCSOC11CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles

    AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcaRegs.ADCSOC2CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcaRegs.ADCSOC3CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcaRegs.ADCSOC4CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcaRegs.ADCSOC5CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcaRegs.ADCSOC6CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcaRegs.ADCSOC7CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcaRegs.ADCSOC8CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcaRegs.ADCSOC9CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcaRegs.ADCSOC10CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcaRegs.ADCSOC11CTL.bit.TRIGSEL = ADCTRIGSEL;

    AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0;  //SOC0 will convert pin ADCB0(板子上为AD7)
    AdcbRegs.ADCSOC1CTL.bit.CHSEL = 1;  //SOC1 will convert pin ADCB1(板子上为AD8)
    AdcbRegs.ADCSOC2CTL.bit.CHSEL = 2;  //SOC2 will convert pin ADCB2(板子上为AD9)
    AdcbRegs.ADCSOC3CTL.bit.CHSEL = 3;  //SOC3 will convert pin ADCB3(板子上为AD10)
    AdcbRegs.ADCSOC4CTL.bit.CHSEL = 4;  //SOC4 will convert pin ADCB4(板子上为AD11)
    AdcbRegs.ADCSOC5CTL.bit.CHSEL = 5;  //SOC5 will convert pin ADCB5(板子上为AD12)
    AdcbRegs.ADCSOC6CTL.bit.CHSEL = 5;  //SOC6 will convert pin ADCB5(板子上为AD12)
    AdcbRegs.ADCSOC7CTL.bit.CHSEL = 4;  //SOC7 will convert pin ADCB4(板子上为AD11)
    AdcbRegs.ADCSOC8CTL.bit.CHSEL = 3;  //SOC8 will convert pin ADCB3(板子上为AD10)
    AdcbRegs.ADCSOC9CTL.bit.CHSEL = 2;  //SOC9 will convert pin ADCB2(板子上为AD9)
    AdcbRegs.ADCSOC10CTL.bit.CHSEL = 1;  //SOC10 will convert pin ADCB1(板子上为AD8)
    AdcbRegs.ADCSOC11CTL.bit.CHSEL = 0;  //SOC11 will convert pin ADCB0(板子上为AD7)

    AdcbRegs.ADCSOC0CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcbRegs.ADCSOC1CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcbRegs.ADCSOC2CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcbRegs.ADCSOC3CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcbRegs.ADCSOC4CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcbRegs.ADCSOC5CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcbRegs.ADCSOC6CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcbRegs.ADCSOC7CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcbRegs.ADCSOC8CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcbRegs.ADCSOC9CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcbRegs.ADCSOC10CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcbRegs.ADCSOC11CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles

    AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcbRegs.ADCSOC1CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcbRegs.ADCSOC2CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcbRegs.ADCSOC3CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcbRegs.ADCSOC4CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcbRegs.ADCSOC5CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcbRegs.ADCSOC6CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcbRegs.ADCSOC7CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcbRegs.ADCSOC8CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcbRegs.ADCSOC9CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcbRegs.ADCSOC10CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcbRegs.ADCSOC11CTL.bit.TRIGSEL = ADCTRIGSEL;

    AdccRegs.ADCSOC0CTL.bit.CHSEL = 14;  //SOC0 will convert pin ADCIN14(板子上为AD13)
    AdccRegs.ADCSOC1CTL.bit.CHSEL = 15;  //SOC1 will convert pin ADCIN15(板子上为AD14)
    AdccRegs.ADCSOC2CTL.bit.CHSEL = 2;  //SOC2 will convert pin ADCC2(板子上为AD15)
    AdccRegs.ADCSOC3CTL.bit.CHSEL = 3;  //SOC3 will convert pin ADCC3(板子上为AD16)
    AdccRegs.ADCSOC4CTL.bit.CHSEL = 4;  //SOC4 will convert pin ADCC4(板子上为AD17)
    AdccRegs.ADCSOC5CTL.bit.CHSEL = 5;  //SOC5 will convert pin ADCC5(板子上为AD18)
    AdccRegs.ADCSOC6CTL.bit.CHSEL = 5;  //SOC6 will convert pin ADCC5(板子上为AD18)
    AdccRegs.ADCSOC7CTL.bit.CHSEL = 4;  //SOC7 will convert pin ADCC4(板子上为AD17)
    AdccRegs.ADCSOC8CTL.bit.CHSEL = 3;  //SOC8 will convert pin ADCC3(板子上为AD16)
    AdccRegs.ADCSOC9CTL.bit.CHSEL = 2;  //SOC9 will convert pin ADCC2(板子上为AD15)
    AdccRegs.ADCSOC10CTL.bit.CHSEL = 15;  //SOC10 will convert pin ADCIN15(板子上为AD14)
    AdccRegs.ADCSOC11CTL.bit.CHSEL = 14;  //SOC11 will convert pin ADCIN14(板子上为AD13)

    AdccRegs.ADCSOC0CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdccRegs.ADCSOC1CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdccRegs.ADCSOC2CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdccRegs.ADCSOC3CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdccRegs.ADCSOC4CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdccRegs.ADCSOC5CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdccRegs.ADCSOC6CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdccRegs.ADCSOC7CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdccRegs.ADCSOC8CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdccRegs.ADCSOC9CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdccRegs.ADCSOC10CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdccRegs.ADCSOC11CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles

    AdccRegs.ADCSOC0CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdccRegs.ADCSOC1CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdccRegs.ADCSOC2CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdccRegs.ADCSOC3CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdccRegs.ADCSOC4CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdccRegs.ADCSOC5CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdccRegs.ADCSOC6CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdccRegs.ADCSOC7CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdccRegs.ADCSOC8CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdccRegs.ADCSOC9CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdccRegs.ADCSOC10CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdccRegs.ADCSOC11CTL.bit.TRIGSEL = ADCTRIGSEL;

    AdcdRegs.ADCSOC0CTL.bit.CHSEL = 0;  //SOC0 will convert pin ADCD0(板子上为AD19)
    AdcdRegs.ADCSOC1CTL.bit.CHSEL = 1;  //SOC1 will convert pin ADCD1(板子上为AD20)
    AdcdRegs.ADCSOC2CTL.bit.CHSEL = 2;  //SOC2 will convert pin ADCD2(板子上为AD21)
    AdcdRegs.ADCSOC3CTL.bit.CHSEL = 3;  //SOC3 will convert pin ADCD3(板子上为AD22)
    AdcdRegs.ADCSOC4CTL.bit.CHSEL = 4;  //SOC4 will convert pin ADCD4(板子上为AD23)
    AdcdRegs.ADCSOC5CTL.bit.CHSEL = 5;  //SOC5 will convert pin ADCD5(板子上为AD24)
    AdcdRegs.ADCSOC6CTL.bit.CHSEL = 5;  //SOC6 will convert pin ADCD5(板子上为AD24)
    AdcdRegs.ADCSOC7CTL.bit.CHSEL = 4;  //SOC7 will convert pin ADCD4(板子上为AD23)
    AdcdRegs.ADCSOC8CTL.bit.CHSEL = 3;  //SOC8 will convert pin ADCD3(板子上为AD22)
    AdcdRegs.ADCSOC9CTL.bit.CHSEL = 2;  //SOC9 will convert pin ADCD2(板子上为AD21)
    AdcdRegs.ADCSOC10CTL.bit.CHSEL = 1;  //SOC10 will convert pin ADCD1(板子上为AD20)
    AdcdRegs.ADCSOC11CTL.bit.CHSEL = 0;  //SOC11 will convert pin ADCD0(板子上为AD19)

    AdcdRegs.ADCSOC0CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcdRegs.ADCSOC1CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcdRegs.ADCSOC2CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcdRegs.ADCSOC3CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcdRegs.ADCSOC4CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcdRegs.ADCSOC5CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcdRegs.ADCSOC6CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcdRegs.ADCSOC7CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcdRegs.ADCSOC8CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcdRegs.ADCSOC9CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcdRegs.ADCSOC10CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles
    AdcdRegs.ADCSOC11CTL.bit.ACQPS = ADCCQPS; //sample window is 100 SYSCLK cycles

    AdcdRegs.ADCSOC0CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcdRegs.ADCSOC1CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcdRegs.ADCSOC2CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcdRegs.ADCSOC3CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcdRegs.ADCSOC4CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcdRegs.ADCSOC5CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcdRegs.ADCSOC6CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcdRegs.ADCSOC7CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcdRegs.ADCSOC8CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcdRegs.ADCSOC9CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcdRegs.ADCSOC10CTL.bit.TRIGSEL = ADCTRIGSEL;
    AdcdRegs.ADCSOC11CTL.bit.TRIGSEL = ADCTRIGSEL;

    //ADCA/B/C/D均产生中断标志位,但只有ADCA在PIE中断向量表中使能
    AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 11; //end of SOC11 will set INT1 flag   //SOC11产生中断 //转换12次
    AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;   //enable INT1 flag
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared //每次转换结束都要清零
    AdcbRegs.ADCINTSEL1N2.bit.INT1SEL = 11; //end of SOC11 will set INT1 flag   //SOC11产生中断 //转换12次
    AdcbRegs.ADCINTSEL1N2.bit.INT1E = 1;   //enable INT1 flag
    AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared //每次转换结束都要清零
    AdccRegs.ADCINTSEL1N2.bit.INT1SEL = 11; //end of SOC11 will set INT1 flag   //SOC11产生中断 //转换12次
    AdccRegs.ADCINTSEL1N2.bit.INT1E = 1;   //enable INT1 flag
    AdccRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared //每次转换结束都要清零
    AdcdRegs.ADCINTSEL1N2.bit.INT1SEL = 11; //end of SOC11 will set INT1 flag   //SOC11产生中断 //转换12次
    AdcdRegs.ADCINTSEL1N2.bit.INT1E = 1;   //enable INT1 flag
    AdcdRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared //每次转换结束都要清零

    //EPWM1作为触发源
    EPwm1Regs.ETSEL.bit.SOCAEN = 0;    // Disable SOC on A group
    EPwm1Regs.ETSEL.bit.SOCASEL = 3;   // 周期值和0值时均产生SOCA
    EPwm1Regs.ETPS.bit.SOCAPRD = 1;       // Generate pulse on 1st event

//    EPwm1Regs.ETSEL.bit.SOCAEN = 1;    // 允许SOCA产生    //在启用EPWM后允许中断
    EDIS;

校准ADC的偏置程序如下(其中KADCA等均为1):

    Uint16 i = 0;

    for(i=0;i<6;i++)    //先清零
    {
        ADCABias[i] = 0.0;
        ADCBBias[i] = 0.0;
        ADCCBias[i] = 0.0;
        ADCDBias[i] = 0.0;
    }

    for(i=0;i<ADCCorrectCounter;i++)
    {
        AdcaRegs.ADCSOCFRC1.all = 0x0FFF; //SOC0-SOC11全部转换
        AdcbRegs.ADCSOCFRC1.all = 0x0FFF; //SOC0-SOC11全部转换
        AdccRegs.ADCSOCFRC1.all = 0x0FFF; //SOC0-SOC11全部转换
        AdcdRegs.ADCSOCFRC1.all = 0x0FFF; //SOC0-SOC11全部转换

        while(AdcaRegs.ADCINTFLG.bit.ADCINT1 == 0); //等待ADCA转换完成
        AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
        while(AdcbRegs.ADCINTFLG.bit.ADCINT1 == 0); //等待ADCB转换完成
        AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
        while(AdccRegs.ADCINTFLG.bit.ADCINT1 == 0); //等待ADCC转换完成
        AdccRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
        while(AdcdRegs.ADCINTFLG.bit.ADCINT1 == 0); //等待ADCD转换完成
        AdcdRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

        ADCABias[0] += (float32)(AdcaResultRegs.ADCRESULT0+AdcaResultRegs.ADCRESULT11);
        ADCABias[1] += (float32)(AdcaResultRegs.ADCRESULT1+AdcaResultRegs.ADCRESULT10);
        ADCABias[2] += (float32)(AdcaResultRegs.ADCRESULT2+AdcaResultRegs.ADCRESULT9);
        ADCABias[3] += (float32)(AdcaResultRegs.ADCRESULT3+AdcaResultRegs.ADCRESULT8);
        ADCABias[4] += (float32)(AdcaResultRegs.ADCRESULT4+AdcaResultRegs.ADCRESULT7);
        ADCABias[5] += (float32)(AdcaResultRegs.ADCRESULT5+AdcaResultRegs.ADCRESULT6);

        ADCBBias[0] += (float32)(AdcbResultRegs.ADCRESULT0+AdcbResultRegs.ADCRESULT11);
        ADCBBias[1] += (float32)(AdcbResultRegs.ADCRESULT1+AdcbResultRegs.ADCRESULT10);
        ADCBBias[2] += (float32)(AdcbResultRegs.ADCRESULT2+AdcbResultRegs.ADCRESULT9);
        ADCBBias[3] += (float32)(AdcbResultRegs.ADCRESULT3+AdcbResultRegs.ADCRESULT8);
        ADCBBias[4] += (float32)(AdcbResultRegs.ADCRESULT4+AdcbResultRegs.ADCRESULT7);
        ADCBBias[5] += (float32)(AdcbResultRegs.ADCRESULT5+AdcbResultRegs.ADCRESULT6);

        ADCCBias[0] += (float32)(AdccResultRegs.ADCRESULT0+AdccResultRegs.ADCRESULT11);
        ADCCBias[1] += (float32)(AdccResultRegs.ADCRESULT1+AdccResultRegs.ADCRESULT10);
        ADCCBias[2] += (float32)(AdccResultRegs.ADCRESULT2+AdccResultRegs.ADCRESULT9);
        ADCCBias[3] += (float32)(AdccResultRegs.ADCRESULT3+AdccResultRegs.ADCRESULT8);
        ADCCBias[4] += (float32)(AdccResultRegs.ADCRESULT4+AdccResultRegs.ADCRESULT7);
        ADCCBias[5] += (float32)(AdccResultRegs.ADCRESULT5+AdccResultRegs.ADCRESULT6);

        ADCDBias[0] += (float32)(AdcdResultRegs.ADCRESULT0+AdcdResultRegs.ADCRESULT11);
        ADCDBias[1] += (float32)(AdcdResultRegs.ADCRESULT1+AdcdResultRegs.ADCRESULT10);
        ADCDBias[2] += (float32)(AdcdResultRegs.ADCRESULT2+AdcdResultRegs.ADCRESULT9);
        ADCDBias[3] += (float32)(AdcdResultRegs.ADCRESULT3+AdcdResultRegs.ADCRESULT8);
        ADCDBias[4] += (float32)(AdcdResultRegs.ADCRESULT4+AdcdResultRegs.ADCRESULT7);
        ADCDBias[5] += (float32)(AdcdResultRegs.ADCRESULT5+AdcdResultRegs.ADCRESULT6);
    }

    for(i=0;i<6;i++)  
    {
        ADCABias[i] = ADCABias[i]*(0.5/ADCCorrectCounter)*KADCA[i];
        ADCBBias[i] = ADCBBias[i]*(0.5/ADCCorrectCounter)*KADCB[i];
        ADCCBias[i] = ADCCBias[i]*(0.5/ADCCorrectCounter)*KADCC[i];
        ADCDBias[i] = ADCDBias[i]*(0.5/ADCCorrectCounter)*KADCD[i];
    }

读取ADC的程序如下:

    while(AdcaRegs.ADCINTFLG.bit.ADCINT1 == 0); //等待ADCA转换完成
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
    while(AdcbRegs.ADCINTFLG.bit.ADCINT1 == 0); //等待ADCB转换完成
    AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
    while(AdccRegs.ADCINTFLG.bit.ADCINT1 == 0); //等待ADCC转换完成
    AdccRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
    while(AdcdRegs.ADCINTFLG.bit.ADCINT1 == 0); //等待ADCD转换完成
    AdcdRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

    ADCAResults[0] = (float32)(AdcaResultRegs.ADCRESULT0+AdcaResultRegs.ADCRESULT11)*0.5*KADCA[0]-ADCABias[0];
    ADCAResults[1] = (float32)(AdcaResultRegs.ADCRESULT1+AdcaResultRegs.ADCRESULT10)*0.5*KADCA[1]-ADCABias[1];
    ADCAResults[2] = (float32)(AdcaResultRegs.ADCRESULT2+AdcaResultRegs.ADCRESULT9)*0.5*KADCA[2]-ADCABias[2];
    ADCAResults[3] = (float32)(AdcaResultRegs.ADCRESULT3+AdcaResultRegs.ADCRESULT8)*0.5*KADCA[3]-ADCABias[3];
    ADCAResults[4] = (float32)(AdcaResultRegs.ADCRESULT4+AdcaResultRegs.ADCRESULT7)*0.5*KADCA[4]-ADCABias[4];
    ADCAResults[5] = (float32)(AdcaResultRegs.ADCRESULT5+AdcaResultRegs.ADCRESULT6)*0.5*KADCA[5]-ADCABias[5];

    ADCBResults[0] = (float32)(AdcbResultRegs.ADCRESULT0+AdcbResultRegs.ADCRESULT11)*0.5*KADCB[0]-ADCBBias[0];
    ADCBResults[1] = (float32)(AdcbResultRegs.ADCRESULT1+AdcbResultRegs.ADCRESULT10)*0.5*KADCB[1]-ADCBBias[1];
    ADCBResults[2] = (float32)(AdcbResultRegs.ADCRESULT2+AdcbResultRegs.ADCRESULT9)*0.5*KADCB[2]-ADCBBias[2];
    ADCBResults[3] = (float32)(AdcbResultRegs.ADCRESULT3+AdcbResultRegs.ADCRESULT8)*0.5*KADCB[3]-ADCBBias[3];
    ADCBResults[4] = (float32)(AdcbResultRegs.ADCRESULT4+AdcbResultRegs.ADCRESULT7)*0.5*KADCB[4]-ADCBBias[4];
    ADCBResults[5] = (float32)(AdcbResultRegs.ADCRESULT5+AdcbResultRegs.ADCRESULT6)*0.5*KADCB[5]-ADCBBias[5];

    ADCCResults[0] = (float32)(AdccResultRegs.ADCRESULT0+AdccResultRegs.ADCRESULT11)*0.5*KADCC[0]-ADCCBias[0];
    ADCCResults[1] = (float32)(AdccResultRegs.ADCRESULT1+AdccResultRegs.ADCRESULT10)*0.5*KADCC[1]-ADCCBias[1];
    ADCCResults[2] = (float32)(AdccResultRegs.ADCRESULT2+AdccResultRegs.ADCRESULT9)*0.5*KADCC[2]-ADCCBias[2];
    ADCCResults[3] = (float32)(AdccResultRegs.ADCRESULT3+AdccResultRegs.ADCRESULT8)*0.5*KADCC[3]-ADCCBias[3];
    ADCCResults[4] = (float32)(AdccResultRegs.ADCRESULT4+AdccResultRegs.ADCRESULT7)*0.5*KADCC[4]-ADCCBias[4];
    ADCCResults[5] = (float32)(AdccResultRegs.ADCRESULT5+AdccResultRegs.ADCRESULT6)*0.5*KADCC[5]-ADCCBias[5];

    ADCDResults[0] = (float32)(AdcdResultRegs.ADCRESULT0+AdcdResultRegs.ADCRESULT11)*0.5*KADCD[0]-ADCDBias[0];
    ADCDResults[1] = (float32)(AdcdResultRegs.ADCRESULT1+AdcdResultRegs.ADCRESULT10)*0.5*KADCD[1]-ADCDBias[1];
    ADCDResults[2] = (float32)(AdcdResultRegs.ADCRESULT2+AdcdResultRegs.ADCRESULT9)*0.5*KADCD[2]-ADCDBias[2];
    ADCDResults[3] = (float32)(AdcdResultRegs.ADCRESULT3+AdcdResultRegs.ADCRESULT8)*0.5*KADCD[3]-ADCDBias[3];
    ADCDResults[4] = (float32)(AdcdResultRegs.ADCRESULT4+AdcdResultRegs.ADCRESULT7)*0.5*KADCD[4]-ADCDBias[4];
    ADCDResults[5] = (float32)(AdcdResultRegs.ADCRESULT5+AdcdResultRegs.ADCRESULT6)*0.5*KADCD[5]-ADCDBias[5];

  • 你好,一般针对ADC模块的问题可以先用官方例程测试一下硬件是否有问题。
    你可以用以下位置的采样例程采样ADCA/ADCB通道,查看是否有同样的±7LSB的压降:
    C:\ti\c2000\C2000Ware_3_03_00_00\device_support\f2837xd\examples\cpu1\adc_soc_epwm