定时中断 ad采样问题

2019-03-26 14:36发布

写了一个定时中断函数,将AD采样写在定时中断中,结果不能得到正确的AD值,定时时间为0.1ms, 采用dsp2806,系统时钟为50MHz,外部引脚ADCIN已经连接到1.6V直流电压,为什么我的AD值却总是零呢? 请高手帮帮忙!! void ADC_Init(void) 
{
    AdcRegs.ADCTRL1.bit.RESET = 1;    //Reset ADC module
    asm(" RPT #20||NOP");
    AdcRegs.ADCTRL3.all = 0x00E2;     // Power up bandgap/reference/ADC circuits  
    AdcRegs.ADCTRL1.bit.RESET = 0;
    AdcRegs.ADCTRL1.bit.SUSMOD = 1;   // 模式3
    AdcRegs.ADCTRL1.bit.ACQ_PS = 0x4; // SOC脉宽
    AdcRegs.ADCTRL1.bit.CPS = 1;      // ADCCLK=FCLK/2
    AdcRegs.ADCTRL1.bit.CONT_RUN =0;  // ???
    AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0;
    AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // cascade mode
        AdcRegs.ADCMAXCONV.all = 0x07;
    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // Setup ADCINA0 as 1st SEQ1 conv
    AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x0; // Setup ADCINB0 as 2nd SEQ1 conv
    AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x8;
    AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x8;   
    AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x1;
    AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x1;   
    AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x9; // Setup ADCINA1 as 3st SEQ1 conv
    AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x9; // Setup ADCINB1 as 4st SEQ1 conv  
         
    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0;  // disable SEQ1 interrupt (every EOS)
    AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 0;// disable SOCA from ePWM to start SEQ1
     
    AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;
    asm(" RPT #4||NOP");
    AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;  
} interrupt void  TINT0_ISR(void)      // CPU-Timer 0     P=0.1ms
{
     i= AdcRegs.ADCRESULT0;
     result[0]=i>>4;
     i= AdcRegs.ADCRESULT1;
     result[1]=i>>4;
     i= AdcRegs.ADCRESULT2;
     result[2]=i>>4;
     i= AdcRegs.ADCRESULT3;
     result[3]=i>>4;      i= AdcRegs.ADCRESULT4;
     result[4]=i>>4;
     i= AdcRegs.ADCRESULT5;
     result[5]=i>>4;
     i= AdcRegs.ADCRESULT6;
     result[6]=i>>4;
     i= AdcRegs.ADCRESULT7;
     result[7]=i>>4;       
  i=result[0]+result[1]+result[2]+result[3];
     i=i>>2;
     g_uSample[g_uNum]=i;   i=result[4]+result[5]+result[6]+result[7];
  i=i>>2;
  g_uSample1[g_uNum]=i;
  g_uNum++;
  if(g_uNum>255) g_uNum=0;
  AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;    //Restart the ADC
  asm(" RPT #4||NOP");
  CpuTimer0Regs.TCR.bit.TIF=1;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; 
        AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;
       EINT;  
}
void main(void) {
    InitSysCtrl(); 
    Config_Gpio();
    ADC_Init();
    GPIO_Init();
    DINT;
    IER = 0x0000;
    IFR = 0x0000;
    InitPieCtrl();
    InitPieVectTable();
    InitCpuTimers();   //Initialize the Cpu Timers
    PieCtrlRegs.PIEIER1.bit.INTx7 = 1;   //Timer0
    IER |= M_INT1;    //Timer0  1.7
    EINT;   // Enable Global interrupt INTM
    ERTM;   // Enable Global realtime interrupt DBGM
    ConfigCpuTimer(&CpuTimer0, 50, 100000);
    StartCpuTimer0();
 for(;;)
 {  }
}
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。