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采样会出现这种异常,是配置问题吗?求大神提供思路。