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.

28069 AD连续转换问题



28069  AD连续转换问题,想设置成不需要触发,一上电然后自己转换,并通过DMA传送,现在就卡在AD的连续自动转换上了,就是不对,不能进中断,郁闷了,想设置成中断部分只是读取一下值,不软件启动,因为到时候这个中断是关闭的,不开

//初始化部分

  PieVectTable.ADCINT2 = &adc_isr;   

  IER |= M_INT1;    

 PieCtrlRegs.PIEIER1.bit.INTx2 = 1; 

//中断函数部分

__interrupt void  adc_isr(void)
{
 EALLOW;
    //使用ADCSOCFRC1启动
    AdcRegs.ADCSOCFRC1.bit.SOC0 = 1;
    AdcRegs.ADCSOCFRC1.bit.SOC8 = 1;
    EDIS;

 BeepFlag_1S=1;

    Voltage1[0] = AdcResult.ADCRESULT0;   //ADCINA0
    Voltage2[0] = AdcResult.ADCRESULT1;   //ADCINB0  正常
    Voltage1[1] = 0;   //ADCINA0
    Voltage2[1] = 0;   //ADCINB0  正常
    Voltage1[2] = 0;   //ADCINA0
    Voltage2[2] = 0;   //ADCINB0  正常
    Voltage1[3] = 0;   //ADCINA0
    Voltage2[3] = 0;   //ADCINB0  正常

  AdcRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;  //Clear ADCINT1 flag reinitialize for next SOC
  PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;   // Acknowledge interrupt to PIE

  return;
}

 

//AD配置部分

 EALLOW;

 AdcRegs.ADCCTL1.bit.ADCREFSEL = 1;      // Page485 选择外部VREF
    AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 0; // Enable non-overlap mode 0允许重叠/1不允许

 AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; //ADCINT1 trips after AdcResults latch
 AdcRegs.INTSEL1N2.bit.INT2E     = 1; //Enabled ADCINT2
 AdcRegs.INTSEL1N2.bit.INT2CONT  = 0; //Disable ADCINT2 Continuous mode
 AdcRegs.INTSEL1N2.bit.INT2SEL = 1; //setup EOC1 to trigger ADCINT2 to fire
 AdcRegs.ADCSAMPLEMODE.bit.SIMULEN0 = 1; // 同时采样
 AdcRegs.ADCSOC0CTL.bit.CHSEL  = 0; //set SOC0 channel select to ADCINA0
 AdcRegs.ADCSOC1CTL.bit.CHSEL  = 8; //set SOC1 channel select to ADCINB0
 AdcRegs.ADCSOC0CTL.bit.TRIGSEL  = 0; //set SOC0 start trigger on software
 AdcRegs.ADCSOC1CTL.bit.TRIGSEL  = 0; //set SOC1 start trigger on software
  AdcRegs.ADCSOC0CTL.bit.ACQPS  = 6; //set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
 AdcRegs.ADCSOC1CTL.bit.ACQPS  = 6; //set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
 AdcRegs.ADCINTSOCSEL1.bit.SOC0  = 2; //ADCINT2 will trigger SOC0. TRIGSEL field is ignored.
 AdcRegs.ADCINTSOCSEL2.bit.SOC8  = 2; //ADCINT2 will trigger SOC0. TRIGSEL field is ignored.

    //使用ADCSOCFRC1启动
    AdcRegs.ADCSOCFRC1.bit.SOC0 = 1;
    AdcRegs.ADCSOCFRC1.bit.SOC8 = 1;

 EDIS;

  • yanqiang,

     

    你的软件触发出现问题:

     //使用ADCSOCFRC1启动   

      AdcRegs.ADCSOCFRC1.bit.SOC0 = 1;    

    AdcRegs.ADCSOCFRC1.bit.SOC8 = 1;

    你配置的是SOC1,才第8通道,并不是SOC8!!

    然后中断又配置EOC1才能够进入。

    Eric

     

  • 中断配置EOC0能够进入了,这个算OK了,还有个问题,我的AD端口是ADCINA0和ADCINB0,不是配成SOC8吗??感觉没问题啊,ADC值现在转换达到目的了,难道是凑到的??

  • 贡献一下调好的代码吧,能用了

     EALLOW;

     AdcRegs.ADCCTL1.bit.ADCREFSEL = 1;      // Page485 选择外部VREF
        AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 0; // Enable non-overlap mode 0允许重叠/1不允许

     AdcRegs.INTSEL1N2.bit.INT1E     = 1; //Enabled ADCINT1
     AdcRegs.INTSEL1N2.bit.INT1CONT  = 1; //Disable ADCINT1 Continuous mode
     AdcRegs.INTSEL1N2.bit.INT1SEL = 0; //setup EOC0 to trigger ADCINT1 to fire

     AdcRegs.ADCSAMPLEMODE.bit.SIMULEN0 = 1; // 同时采样
     AdcRegs.ADCSOC0CTL.bit.CHSEL  = 0; //set SOC0 channel select to ADCINA0
     AdcRegs.ADCSOC1CTL.bit.CHSEL  = 8; //set SOC1 channel select to ADCINB0  page510

     AdcRegs.ADCSOC0CTL.bit.TRIGSEL  = 0; //set SOC0 start trigger on software
     AdcRegs.ADCSOC1CTL.bit.TRIGSEL  = 0; //set SOC1 start trigger on software

      AdcRegs.ADCSOC0CTL.bit.ACQPS  = 6; //set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
     AdcRegs.ADCSOC1CTL.bit.ACQPS  = 6; //set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)

     AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; //ADCINT1 trips after AdcResults latch

     AdcRegs.ADCINTSOCSEL1.bit.SOC0  = 1; //软件触发源ADCINT1
     AdcRegs.ADCINTSOCSEL1.bit.SOC1  = 1; //ADCINT2 will trigger SOC0. TRIGSEL field is ignored.

        //使用ADCSOCFRC1启动
        //AdcRegs.ADCSOCFRC1.all = 0X0101;   //0000 0001 0000 0001
        AdcRegs.ADCSOCFRC1.bit.SOC0 = 1;
        AdcRegs.ADCSOCFRC1.bit.SOC8 = 1;

     EDIS;

  • yanqiang,

    并不是凑到的,你只是改了你的代码,编程EOC0产生中断信号而已。应该改成EOC1产生中断才对,这样子B0通道采样完才触发中断。

    你用EOC0触发中断,这一次的B0还没开始采样。

    至于到底是SOC几,并不是看通道,是看你配置的是哪个SOC。你程序中是把B0通道配置为SOC1的输入。

    Eric