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

ADC_DMA问题

我现在想要采集ADCINA0-ADCINA7的输入电压,通过DMA传输,一直连续不断采集,我的配置代码如下

https://e2echina.ti.com/question_answer/microcontrollers/c2000/f/56/p/192910/595361#595361此帖中,Green Deng:并未解决我的问题,因为我就是按照例程配置修改的

EALLOW;
SysCtrlRegs.HISPCP.all = ADC_MODCLK; // 150 / (2*3) = 25M
EDIS;

InitAdc();

AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; // Sequential mode: Sample rate = 1/[(2+ACQ_PS)*ADC clock in ns]
// = 1/(2*40ns) =12.5MHz (for 150 MHz SYSCLKOUT)
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; // ADC module clock = HSPCLK/1 = 25.5MHz/(1) = 25.0 MHz
AdcRegs.ADCTRL1.bit.CPS = 0;
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 级联操作模式
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; // 连续模式
AdcRegs.ADCTRL3.bit.SMODE_SEL = 0; // 顺序采样
AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1; // Enable Sequencer override feature
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 7; // 8个转换通道
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0x1; // 中断启用
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 0x1;

AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 7; // 8个转换通道
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; //ADCINA0
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; //ADCINA1
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2;
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x3;
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x4;
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x5;
AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x6;
AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x7;

dmadest = dma_adcbuf;
dmasource = &AdcMirror.ADCRESULT0; //Point DMA source to ADC result register base
DMACH1AddrConfig(dmadest, dmasource);
DMACH1BurstConfig(7, 1, 10);
DMACH1TransferConfig(9, 1, 1);
DMACH1WrapConfig(1, 0, 80, 0);

DMACH1ModeConfig(DMA_SEQ1INT, PERINT_ENABLE,ONESHOT_DISABLE, CONT_DISABLE,SYNC_DISABLE, SYNC_SRC,OVRFLOW_DISABLE, SIXTEEN_BIT,CHINT_END, CHINT_ENABLE);

StartDMACH1();

AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 0x1;

并配置了相应的中断函数,但是我发现,传输完成进入到中断函数之后,貌似不会再继续采集转换了,并且发现每次采集到的值并不是那么准确,请问是我的配置有问题吗

Green Deng:

你说的

Tony Liu4传输完成进入到中断函数之后,貌似不会再继续采集转换了

是不是指运行完一次之后程序就一直在这个语句中循环?

__asm ("ESTOP0");for(;;);

这个的话例程中就是这么设计的,你的运行结果应该是跟例程一致的。

至于 采样结果不准确,你得描述一下具体怎么个不准确?或者是否跟你的输入信号有关?

Tony Liu4:

回复 Green Deng:

当然,在中断里面我肯定没有写for(;;);这种操作,中断里面我做了取平均值的操作,然后出中断之后,就进不来中断了,而且,您可以看一下我的代码吗,我使能了连续转换

Green Deng:

回复 Tony Liu4:

例程中对这两行代码有解释:

// Next two lines for debug only to halt the processor here// Remove after inserting ISR Code

这两行代码只是为了调试,你可以注释/删除这两行代码,然后添加你想要的代码。

“ESTOP0”是一个软件断点指令,它将在代码执行时停止处理器。它们仅用于调试。

Tony Liu4:

回复 Green Deng:

您是否能看一下我的回答再做回答,我在中断里面,没有写停止这两句,我都改掉了,改成我对AD值的操作,然后出了中断之后,不会再次进入中断,而不是在中断里面停止这种状态

Green Deng:

回复 Tony Liu4:

你可以试一下通过在RUNSTS位中写入“ 1”来重新启用ISR中的DMA

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

赞(0)
未经允许不得转载:TI中文支持网 » ADC_DMA问题
分享到: 更多 (0)