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)
{};
卡西