TI中文支持网
TI专业的中文技术问题搜集分享网站

关于DSP28335的DMA采样问题相关

TI大神:

 

         有一个逆变器程序,配置为AD采用连续方式采样,在PWM中断中通过DMA读取16个AD通道的值。

         现在有一个问题是有小概率情况存在读出的16个数据中有一个数据(不固定)会突变成0,如3000,0,3000。

         请问这种情况是什么原因引起的?

谢谢。

 

附AD初始化程序:

voidInitADCOfDMA(void)                         //配置成DMA模式

{

    Uint16 i, j;

 

    AdcRegs.ADCTRL3.bit.ADCBGRFDN   = 3;        // 参考电路上电

   for(i=0;i<10000;i++)    NOP;

    AdcRegs.ADCTRL3.bit.ADCPWDN     = 1;        // 模拟电路上电

   for(i=0;i<10000;i++)    NOP;

 

    AdcRegs.ADCREFSEL.bit.REF_SEL   = 0x00;     // 内部参考3V

    AdcRegs.ADCTRL3.bit.ADCCLKPS    = 3;        // 核3分频

    AdcRegs.ADCTRL3.bit.SMODE_SEL   = 1;        // 同步采样方式

    AdcRegs.ADCTRL1.bit.SEQ_CASC    = 1;        // 级联

    AdcRegs.ADCTRL1.bit.CONT_RUN    = 1;        // 连续采样模式

    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;

 

    AdcRegs.ADCMAXCONV.all          = 0x07;

    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x00;     // 设置ADCINA0&ADCINB0转换

    AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x01;     // 设置ADCINA1&ADCINB1转换

    AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x02;     // 设置ADCINA2&ADCINB2转换

    AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x03;     // 设置ADCINA3&ADCINB3转换

    AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x04;     // 设置ADCINA4&ADCINB4转换

    AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x05;     // 设置ADCINA5&ADCINB5转换

    AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x06;     // 设置ADCINA6&ADCINB6转换

    AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x07;     // 设置ADCINA7&ADCINB7转换

   for(i = 0; i < 1000; i++)

    {

       for(j = 0; j < 5000; j++)   NOP;

    }

    ADStart();

}

 

 

DMA初始化程序:

voidInitDMA(void)

{

    Uint16 i;

 

    EALLOW;

    PieVectTable.DINTCH1 = &Local_DINTCH1_ISR;

    EDIS;

    EALLOW;

    DmaRegs.DMACTRL.bit.HARDRESET = 1;  // Perform a hard reset on DMA

   asm (" nop");

    DmaRegs.DEBUGCTRL.bit.FREE = 0;// Allow DMA to run free on emulation suspend

    EDIS;

 

   for(i = 0; i < 20; i++)

    {

        DMABuf[i] = 0;

    }

    // configure DMA channel

    DMADest = &DMABuf[0];

    DMASource = &AdcMirror.ADCRESULT0;

    DMACH1AddrConfig(DMADest, DMASource);

    DMACH1BurstConfig(15, 1, 1);

    DMACH1TransferConfig(0, 0, 0);

    DMACH1WrapConfig(100, 100, 100, 100);

    DMACH1ModeConfig(DMA_SEQ1INT,   PERINT_ENABLE,      ONESHOT_DISABLE,  CONT_ENABLE, SYNC_DISABLE,  SYNC_SRC ,  OVRFLOW_DISABLE, SIXTEEN_BIT,        CHINT_END,      CHINT_DISABLE);

    StartDMACH1();

    IER |= M_INT7;                          // Enable CPU INT7

    PieCtrlRegs.PIEIER7.bit.INTx1 = 1;      // Enable PIE: GROUP 7 interrupt 1

    EINT;

    ERTM;

}

Jordan Zhou:你这问题的可能性比较多,但建议先做排除,是ADC转换的问题,还是DMA搬运的问题。个人偏向于后者。
1)ADC转换的时候有些要求,例如ADCCLK不能低于1M,第一个sample不能用,采样窗口时间短;这些都不至于产生0这个结果;
2)DMA操作的时候,很容易丢失前后一个数据,如果是,便会出现0.
16个搬运的数据中,0出现在哪个位置上?

TI大神:

 

         有一个逆变器程序,配置为AD采用连续方式采样,在PWM中断中通过DMA读取16个AD通道的值。

         现在有一个问题是有小概率情况存在读出的16个数据中有一个数据(不固定)会突变成0,如3000,0,3000。

         请问这种情况是什么原因引起的?

谢谢。

 

附AD初始化程序:

voidInitADCOfDMA(void)                         //配置成DMA模式

{

    Uint16 i, j;

 

    AdcRegs.ADCTRL3.bit.ADCBGRFDN   = 3;        // 参考电路上电

   for(i=0;i<10000;i++)    NOP;

    AdcRegs.ADCTRL3.bit.ADCPWDN     = 1;        // 模拟电路上电

   for(i=0;i<10000;i++)    NOP;

 

    AdcRegs.ADCREFSEL.bit.REF_SEL   = 0x00;     // 内部参考3V

    AdcRegs.ADCTRL3.bit.ADCCLKPS    = 3;        // 核3分频

    AdcRegs.ADCTRL3.bit.SMODE_SEL   = 1;        // 同步采样方式

    AdcRegs.ADCTRL1.bit.SEQ_CASC    = 1;        // 级联

    AdcRegs.ADCTRL1.bit.CONT_RUN    = 1;        // 连续采样模式

    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;

 

    AdcRegs.ADCMAXCONV.all          = 0x07;

    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x00;     // 设置ADCINA0&ADCINB0转换

    AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x01;     // 设置ADCINA1&ADCINB1转换

    AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x02;     // 设置ADCINA2&ADCINB2转换

    AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x03;     // 设置ADCINA3&ADCINB3转换

    AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x04;     // 设置ADCINA4&ADCINB4转换

    AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x05;     // 设置ADCINA5&ADCINB5转换

    AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x06;     // 设置ADCINA6&ADCINB6转换

    AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x07;     // 设置ADCINA7&ADCINB7转换

   for(i = 0; i < 1000; i++)

    {

       for(j = 0; j < 5000; j++)   NOP;

    }

    ADStart();

}

 

 

DMA初始化程序:

voidInitDMA(void)

{

    Uint16 i;

 

    EALLOW;

    PieVectTable.DINTCH1 = &Local_DINTCH1_ISR;

    EDIS;

    EALLOW;

    DmaRegs.DMACTRL.bit.HARDRESET = 1;  // Perform a hard reset on DMA

   asm (" nop");

    DmaRegs.DEBUGCTRL.bit.FREE = 0;// Allow DMA to run free on emulation suspend

    EDIS;

 

   for(i = 0; i < 20; i++)

    {

        DMABuf[i] = 0;

    }

    // configure DMA channel

    DMADest = &DMABuf[0];

    DMASource = &AdcMirror.ADCRESULT0;

    DMACH1AddrConfig(DMADest, DMASource);

    DMACH1BurstConfig(15, 1, 1);

    DMACH1TransferConfig(0, 0, 0);

    DMACH1WrapConfig(100, 100, 100, 100);

    DMACH1ModeConfig(DMA_SEQ1INT,   PERINT_ENABLE,      ONESHOT_DISABLE,  CONT_ENABLE, SYNC_DISABLE,  SYNC_SRC ,  OVRFLOW_DISABLE, SIXTEEN_BIT,        CHINT_END,      CHINT_DISABLE);

    StartDMACH1();

    IER |= M_INT7;                          // Enable CPU INT7

    PieCtrlRegs.PIEIER7.bit.INTx1 = 1;      // Enable PIE: GROUP 7 interrupt 1

    EINT;

    ERTM;

}

kefeng tang:

回复 Jordan Zhou:

后续分了两种情况测试,分别为SOC触发采样,并在中断中读取,另一种是通过DMA搬运,这两种方式都存在突然跳变0的情况,故可以排除是DMA搬运导致的。

现在就是不明白为什么ADC采样会出现这种异常,是配置问题吗?求大神提供思路。

赞(0)
未经允许不得转载:TI中文支持网 » 关于DSP28335的DMA采样问题相关
分享到: 更多 (0)