This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS320F28335:使用 ADC-DMA 时采样的信号不正确

Guru**** 2540720 points
Other Parts Discussed in Thread: CONTROLSUITE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/622944/ccs-tms320f28335-the-sampled-signal-is-not-correct-with-adc-dma

器件型号:TMS320F28335
Thread 中讨论的其他器件:controlSUITE

工具/软件:Code Composer Studio

我想使用 DMA 读取 ADC 结果。 我修改了 controlSUITE 中提供的示例。 当 DAM 配置为时、采样信号正确  

DMACH1ModeConfig (DMA_SEQ1INT、PERINT_ENABLE、OneShot_disable、CONT_disable、SYNC_disable、SYNC_SRC、
OVRFLOW_DISABLE、十六位、CHINT_END、CHINT_ENABLE);

但它只能运行一次、然后 DMA 停止。 要再次运行、我需要再次编译。 当我将'CONT_DISABLE'更改为'CONT_ENABLE'时、它可以运行几次以进行一次编译。 但读结果不正确、如图所示。  DMA 读取的结果中存在不连续点。 ADC 和 DMA 配置如下所示。 请帮帮我。

//配置 ADC
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;// 1级联模式
AdcRegs.ADCTRL3.bit.SMODE_SEL = 0;//设置同步采样模式
// AdcRegs.ADCMAXCONV.ALL = 0x0000;//在 SEQ1上设置2个 conv
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;//将 ADCINA0设置为第一个 SEQ1转换器
// AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x2;//将 ADCINA2设置为第2个 SEQ1转换器
AdcRegs.ADCTRL2.bit.ePWM_SOCA_SEQ1 = 1;//从 ePWM 启用 SOCA 以启动 SEQ1
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;//启用 SEQ1中断(每个 EOS)
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;
AdcRegs.ADCCHSELSEQ1.ALL = 0x0;//初始化所有 ADC 通道选择为 A0
AdcRegs.ADCCHSELSEQ2.ALL = 0x0;
AdcRegs.ADCCHSELSEQ3.ALL = 0x0;
AdcRegs.ADCCHSELSEQ4.ALL = 0x0;
AdcRegs.ADCMAXCONV.BIT.MAX_CONV1 = 0xF;//转换并存储在8个结果寄存器中

//假设 ePWM1时钟已在 InitSysCtrl()中启用;
EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用组上的 SOC
EPwm1Regs.ETSEL.bit.SOCASEL = 4;//从 CPMA 中选择 SOC、以进行递增计数
EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在发生第一个事件时生成脉冲
EPwm1Regs.CMPA.half.CMPA = 0x1;//设置比较 A 值
EPwm1Regs.TBPRD = 0x2;//为 ePWM1设置周期
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//向上计数并启动


DMAInitialize();

//清除表
(i=0;<BUF_SIZE; i++)

DMA01[i]= 0;

//配置 DMA 通道
DMADest =&DMABUF1[0];//将 DMA 目标指向数组的开头
DMASSOURCE =&AdcMirror.ADCRESULT0;//点 DMA 源到 ADC 结果寄存器基址
DMACH1AddrConfig (DMADest、DMASource);
DMACH1BurstConfig (15、1、1);//16字/每突发
DMACH1TransferConfig (15、0、16);//每次传输16次突发
DMACH1WrapConfig (0、0、0、16);
DMACH1ModeConfig (DMA_SEQ1INT、PERINT_ENABLE、OneShot_disable、CONT_ENABLE、SYNC_DISABLE、SYNC_SRC、
OVRFLOW_DISABLE、十六位、CHINT_END、CHINT_ENABLE);

StartDMACH1();
while (1)
{};

卡西

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Cathy、

    您能否解释一下 DMA 配置和不同步长背后的一些推理? 您是否需要配置源传输步骤来将地址设置回 ADCRESULT0?

    谢谢、
    惠特尼