DSP28335如何对信号连续采样并直接通过dma转移?adc_dma
本帖最后由 lofky 于 2015-8-25 17:19 编辑小弟是想实现adc用同一或多个通道采样然后通过dma转存到指定区域,过程大概是:ad采够一个序列,中断置位,dma开始工作,移动16个result寄存器的16位结果,结束此次转换;adc继续采样,dma接着这样工作。根据已有的例程做了如下改动:
//adc初始化
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;
AdcRegs.ADCTRL1.bit.SEQ_CASC = 0; // 0 Non-Cascaded Mode
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0x1;//在转换完了一个序列就置位INT_SEQ1
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 0x1;
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; // Setup continuous run设置成连续模式
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x0;
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x0;
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x0;
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x0;
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x0;
AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x0;
AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x0;
AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 0x0;
AdcRegs.ADCCHSELSEQ3.bit.CONV09 = 0x0;
AdcRegs.ADCCHSELSEQ3.bit.CONV10 = 0x0;
AdcRegs.ADCCHSELSEQ3.bit.CONV11 = 0x0;
AdcRegs.ADCCHSELSEQ4.bit.CONV12 = 0x0;
AdcRegs.ADCCHSELSEQ4.bit.CONV13 = 0x0;
AdcRegs.ADCCHSELSEQ4.bit.CONV14 = 0x0;
AdcRegs.ADCCHSELSEQ4.bit.CONV15 = 0x0;//同一个adc引脚输入
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 15;
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0x1;//在转换完了一个序列就置位INT_SEQ1 这个是我加上去的
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; // Setup continuous run设置成连续模式 这个是我加上去的
<p>//DMA部分初始化</p><p>DMADest = &DMABuf1; //Point DMA destination to the beginning of the array
DMASource = &AdcMirror.ADCRESULT0; //Point DMA source to ADC result register base
DMACH1AddrConfig(DMADest,DMASource);
DMACH1BurstConfig(15,1,1);
DMACH1TransferConfig(9,0,1);
DMACH1WrapConfig(1,0,0,1);
DMACH1ModeConfig(DMA_SEQ1INT,PERINT_ENABLE,ONESHOT_DISABLE,CONT_DISABLE,SYNC_DISABLE,SYNC_SRC,
OVRFLOW_DISABLE,SIXTEEN_BIT,CHINT_END,CHINT_ENABLE); </p>DMASource = &AdcMirror.ADCRESULT0;不是很理解,这里是自己把AdcRegs.ADCRESULT0数据转移到了AdcMirror.ADCRESULT0去了?
DMACH1BurstConfig(15,1,10);目的地址需要+10?觉得应该改成DMACH1BurstConfig(15,1,1);
DMACH1TransferConfig(9,0,1);不理解,因为是连续不断,感觉这个没有意义,改成DMACH1TransferConfig(x,0,0);x任意正数
DMACH1ModeConfig(DMA_SEQ1INT,PERINT_ENABLE,ONESHOT_DISABLE,CONT_DISABLE,SYNC_DISABLE,SYNC_SRC,
OVRFLOW_DISABLE,SIXTEEN_BIT,CHINT_END,CHINT_ENABLE);
改成
DMACH1ModeConfig(DMA_SEQ1INT,PERINT_ENABLE,ONESHOT_DISABLE,CONT_ENABLE,SYNC_DISABLE,SYNC_SRC,
OVRFLOW_DISABLE,SIXTEEN_BIT,CHINT_END,CHINT_DISABLE);使之连续不断
程序还在调试,思路有点乱,不知道adc+dma是怎么个工作过程,例程都是只转移一次,没有连续转移的,上传个adc_dma的例程
请大虾指导小弟
建议你多多DMA那章节,弄清楚到底是怎么工作的。28335的DMA功能相当强大,触发源、每次传多少数据,传几次,传到哪里都是可以灵活设置的。 steaven2000 发表于 2015-8-25 17:20
建议你多多DMA那章节,弄清楚到底是怎么工作的。28335的DMA功能相当强大,触发源、每次传多少数据,传几次 ...
谢谢你的建议,大概懂了dma怎么配置的了,现在程序大概实现了单通道ad连续采样并连续用dma更新选中的存储区域,但是有个问题,采样的速率像很慢一样,实际上不用dma,直接改此程序成ad采样中断中赋值给数组,得到的结果用graph看,是正玄波
不知道是什么原因?可能我还没懂ad_dma工作原理和过程。。附上现在的程序,请指教,谢谢
lofky 发表于 2015-8-26 23:03
谢谢你的建议,大概懂了dma怎么配置的了,现在程序大概实现了单通道ad连续采样并连续用dma更新选中的存 ...
你单通道连续采样是自动触发的还是用外部触发的?像stm32f4里面能达到1us输出一个12位采样结果,28335有多快?还有采样精度怎么样? 本帖最后由 lofky 于 2015-10-7 11:20 编辑
tkloveyang 发表于 2015-9-27 15:26
你单通道连续采样是自动触发的还是用外部触发的?像stm32f4里面能达到1us输出一个12位采样结果,28335有 ...
28335ADC是12位,“转换时钟频率是12.5MHz,采样速率是6.25MSPS”。。应该是0.16us输出一个12位采样结果
上述程序有错,具体问题还没找出来,改了例程,4通道,一通道采样正弦波,还比较精确。。还没用熟 tkloveyang 发表于 2015-9-27 15:26
你单通道连续采样是自动触发的还是用外部触发的?像stm32f4里面能达到1us输出一个12位采样结果,28335有 ...
F407最快做到7.2M采样,F28335最快12M多点,精度大家都是12位的,DSP还是快很多的
页:
[1]