lofky 发表于 2015-8-25 16:59:06

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的例程
请大虾指导小弟

steaven2000 发表于 2015-8-25 17:20:15

建议你多多DMA那章节,弄清楚到底是怎么工作的。28335的DMA功能相当强大,触发源、每次传多少数据,传几次,传到哪里都是可以灵活设置的。

lofky 发表于 2015-8-26 23:03:55

steaven2000 发表于 2015-8-25 17:20
建议你多多DMA那章节,弄清楚到底是怎么工作的。28335的DMA功能相当强大,触发源、每次传多少数据,传几次 ...


谢谢你的建议,大概懂了dma怎么配置的了,现在程序大概实现了单通道ad连续采样并连续用dma更新选中的存储区域,但是有个问题,采样的速率像很慢一样,实际上不用dma,直接改此程序成ad采样中断中赋值给数组,得到的结果用graph看,是正玄波
不知道是什么原因?可能我还没懂ad_dma工作原理和过程。。附上现在的程序,请指教,谢谢

tkloveyang 发表于 2015-9-27 15:26:49

lofky 发表于 2015-8-26 23:03
谢谢你的建议,大概懂了dma怎么配置的了,现在程序大概实现了单通道ad连续采样并连续用dma更新选中的存 ...

你单通道连续采样是自动触发的还是用外部触发的?像stm32f4里面能达到1us输出一个12位采样结果,28335有多快?还有采样精度怎么样?

lofky 发表于 2015-10-7 11:17:42

本帖最后由 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通道,一通道采样正弦波,还比较精确。。还没用熟

zhanyanqiang 发表于 2015-10-7 19:55:21

tkloveyang 发表于 2015-9-27 15:26
你单通道连续采样是自动触发的还是用外部触发的?像stm32f4里面能达到1us输出一个12位采样结果,28335有 ...

F407最快做到7.2M采样,F28335最快12M多点,精度大家都是12位的,DSP还是快很多的
页: [1]
查看完整版本: DSP28335如何对信号连续采样并直接通过dma转移?adc_dma