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.

DSP2802x_Adc.c 文件中Uint16 AdcConversion(void)函数中不理解的地方,文件来自CONTROL SUIT

Other Parts Discussed in Thread: CONTROLSUITE

AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; //ADCINTs trigger at end of conversion

AdcRegs.INTSEL1N2.bit.INT1SEL = 6;      //EOC6 triggers ADCINT1

设定为在SOC6转换完成产生ADCINT1中断

while (AdcRegs.ADCINTFLG.bit.ADCINT1 == 0){}
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //Must clear ADCINT1 flag since INT1CONT = 0
Sum += AdcResult.ADCRESULT0;
Sum += AdcResult.ADCRESULT1;
Sum += AdcResult.ADCRESULT2;
Sum += AdcResult.ADCRESULT3;
Sum += AdcResult.ADCRESULT4;
Sum += AdcResult.ADCRESULT5;
Sum += AdcResult.ADCRESULT6;
Sum += AdcResult.ADCRESULT7;

CPU开始累加的时候在SOC6转换完成的时候,但是这个时候SOC7转换还未完成,此时进入累加操作会不会漏算SOC7的转换结果。为什么不直接将AdcRegs.INTSEL1N2.bit.INT1SEL = 6;语句中数据改为7,保证所有转换结果都被算入累加。

  • C:\ti\controlSUITE\device_support\f2802x\v230\f2802x_examples_structs\adc_soc

    Uint16 AdcConversion(void)
    {
    Uint16 index, SampleSize, Mean, ACQPS_Value;
    Uint32 Sum;

    index = 0; //initialize index to 0
    SampleSize = 256; //set sample size to 256 (**NOTE: Sample size must be multiples of 2^x where is an integer >= 4)
    Sum = 0; //set sum to 0
    Mean = 999; //initialize mean to known value

    //Set the ADC sample window to the desired value (Sample window = ACQPS + 1)
    ACQPS_Value = 6;
    AdcRegs.ADCSOC0CTL.bit.ACQPS = ACQPS_Value;
    AdcRegs.ADCSOC1CTL.bit.ACQPS = ACQPS_Value;
    AdcRegs.ADCSOC2CTL.bit.ACQPS = ACQPS_Value;
    AdcRegs.ADCSOC3CTL.bit.ACQPS = ACQPS_Value;
    AdcRegs.ADCSOC4CTL.bit.ACQPS = ACQPS_Value;
    AdcRegs.ADCSOC5CTL.bit.ACQPS = ACQPS_Value;
    AdcRegs.ADCSOC6CTL.bit.ACQPS = ACQPS_Value;
    AdcRegs.ADCSOC7CTL.bit.ACQPS = ACQPS_Value;
    AdcRegs.ADCSOC8CTL.bit.ACQPS = ACQPS_Value;
    AdcRegs.ADCSOC9CTL.bit.ACQPS = ACQPS_Value;
    AdcRegs.ADCSOC10CTL.bit.ACQPS = ACQPS_Value;
    AdcRegs.ADCSOC11CTL.bit.ACQPS = ACQPS_Value;
    AdcRegs.ADCSOC12CTL.bit.ACQPS = ACQPS_Value;
    AdcRegs.ADCSOC13CTL.bit.ACQPS = ACQPS_Value;
    AdcRegs.ADCSOC14CTL.bit.ACQPS = ACQPS_Value;
    AdcRegs.ADCSOC15CTL.bit.ACQPS = ACQPS_Value;


    //Enable ping-pong sampling

    // Enabled ADCINT1 and ADCINT2
    AdcRegs.INTSEL1N2.bit.INT1E = 1;
    AdcRegs.INTSEL1N2.bit.INT2E = 1;

    // Disable continuous sampling for ADCINT1 and ADCINT2
    AdcRegs.INTSEL1N2.bit.INT1CONT = 0;
    AdcRegs.INTSEL1N2.bit.INT2CONT = 0;

    AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; //ADCINTs trigger at end of conversion

    // Setup ADCINT1 and ADCINT2 trigger source
    AdcRegs.INTSEL1N2.bit.INT1SEL = 6; //EOC6 triggers ADCINT1
    AdcRegs.INTSEL1N2.bit.INT2SEL = 14; //EOC14 triggers ADCINT2

    // Setup each SOC's ADCINT trigger source
    AdcRegs.ADCINTSOCSEL1.bit.SOC0 = 2; //ADCINT2 starts SOC0-7
    AdcRegs.ADCINTSOCSEL1.bit.SOC1 = 2;
    AdcRegs.ADCINTSOCSEL1.bit.SOC2 = 2;
    AdcRegs.ADCINTSOCSEL1.bit.SOC3 = 2;
    AdcRegs.ADCINTSOCSEL1.bit.SOC4 = 2;
    AdcRegs.ADCINTSOCSEL1.bit.SOC5 = 2;
    AdcRegs.ADCINTSOCSEL1.bit.SOC6 = 2;
    AdcRegs.ADCINTSOCSEL1.bit.SOC7 = 2;
    AdcRegs.ADCINTSOCSEL2.bit.SOC8 = 1; //ADCINT1 starts SOC8-15
    AdcRegs.ADCINTSOCSEL2.bit.SOC9 = 1;
    AdcRegs.ADCINTSOCSEL2.bit.SOC10 = 1;
    AdcRegs.ADCINTSOCSEL2.bit.SOC11 = 1;
    AdcRegs.ADCINTSOCSEL2.bit.SOC12 = 1;
    AdcRegs.ADCINTSOCSEL2.bit.SOC13 = 1;
    AdcRegs.ADCINTSOCSEL2.bit.SOC14 = 1;
    AdcRegs.ADCINTSOCSEL2.bit.SOC15 = 1;

    DELAY_US(ADC_usDELAY); // Delay before converting ADC channels


    //ADC Conversion

    AdcRegs.ADCSOCFRC1.all = 0x00FF; // Force Start SOC0-7 to begin ping-pong sampling

    while( index < SampleSize ){

    //Wait for ADCINT1 to trigger, then add ADCRESULT0-7 registers to sum
    while (AdcRegs.ADCINTFLG.bit.ADCINT1 == 0){}
    AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //Must clear ADCINT1 flag since INT1CONT = 0
    Sum += AdcResult.ADCRESULT0;
    Sum += AdcResult.ADCRESULT1;
    Sum += AdcResult.ADCRESULT2;
    Sum += AdcResult.ADCRESULT3;
    Sum += AdcResult.ADCRESULT4;
    Sum += AdcResult.ADCRESULT5;
    Sum += AdcResult.ADCRESULT6;
    // Wait for SOC9 conversion to start, which gives time for SOC7 conversion result
    while( AdcRegs.ADCSOCFLG1.bit.SOC9 == 1 ){}
    Sum += AdcResult.ADCRESULT7;

    //Wait for ADCINT2 to trigger, then add ADCRESULT8-15 registers to sum
    while (AdcRegs.ADCINTFLG.bit.ADCINT2 == 0){}
    AdcRegs.ADCINTFLGCLR.bit.ADCINT2 = 1; //Must clear ADCINT2 flag since INT2CONT = 0
    Sum += AdcResult.ADCRESULT8;
    Sum += AdcResult.ADCRESULT9;
    Sum += AdcResult.ADCRESULT10;
    Sum += AdcResult.ADCRESULT11;
    Sum += AdcResult.ADCRESULT12;
    Sum += AdcResult.ADCRESULT13;
    Sum += AdcResult.ADCRESULT14;
    // Wait for SOC1 conversion to start, which gives time for SOC15 conversion result
    while( AdcRegs.ADCSOCFLG1.bit.SOC1 == 1 ){}
    Sum += AdcResult.ADCRESULT15;

    index+=16;

    } // end data collection

    //Disable ADCINT1 and ADCINT2 to STOP the ping-pong sampling
    AdcRegs.INTSEL1N2.bit.INT1E = 0;
    AdcRegs.INTSEL1N2.bit.INT2E = 0;

    while(AdcRegs.ADCSOCFLG1.all != 0){} // Wait for any pending SOCs to complete

    // Clear any pending interrupts
    AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
    AdcRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;
    AdcRegs.ADCINTOVFCLR.bit.ADCINT1 = 1;
    AdcRegs.ADCINTOVFCLR.bit.ADCINT2 = 1;

    //reset RR pointer to 32, so that next SOC is SOC0
    AdcRegs.SOCPRICTL.bit.SOCPRIORITY = 1;
    while( AdcRegs.SOCPRICTL.bit.SOCPRIORITY != 1 );
    AdcRegs.SOCPRICTL.bit.SOCPRIORITY = 0;
    while( AdcRegs.SOCPRICTL.bit.SOCPRIORITY != 0 );

    Mean = Sum / SampleSize; //Calculate average ADC sample value

    return Mean; //return the average

    }//end AdcConversion

    最新的例程已经有修正了。

    ERIC

  • 为什么不直接设定为EOC7时产生的中断开始累加;另:若主程序中设定了中断服务程序,AdcRegs.ADCINTFLGCLR.bit.ADCINT2 = 1语句是不是就可以移入中断服务程序中,现在的位置不用写。

  • 如果放在中断,那在中断里就要对中断标志清除。

    AdcRegs.ADCINTFLGCLR.bit.ADCINT2 = 1; 

    Eric

  • 谢答主,大概搞清楚了