TMS320F280039: ADC DMA 280039

Part Number: TMS320F280039

一、疑问

之前帖子https://e2echina.ti.com/support/microcontrollers/c2000/f/c2000-microcontrollers-forum/812165/tms320f280039-timer1-adc-soc-adc-eoc-dma-ram-4-eoc-dma-dma/2981482?tisearch=e2e-sitesearch&keymatch=DMA#2981482


EPwm3Regs.TBPRD = EPWMPeriod_DC;
EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm3Regs.TBCTL.bit.PHSDIR = TB_UP;
EPwm3Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE;
EPwm3Regs.TBPHS.bit.TBPHS = 0;
EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
EPwm3Regs.EPWMSYNCINSEL.bit.SEL = SYNC_IN_SRC_DISABLE_ALL;
EPwm3Regs.EPWMSYNCOUTEN.bit.ZEROEN = SYNC_OUT_SRC_ENABLE;

EPwm8Regs.TBPRD = EPWMPeriod_DC / 8;
EPwm8Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm8Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm8Regs.TBCTL.bit.PHSDIR = TB_UP;
EPwm8Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm8Regs.TBCTL.bit.PHSEN = TB_ENABLE;
EPwm8Regs.TBPHS.bit.TBPHS = 0;
EPwm8Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
EPwm8Regs.EPWMSYNCINSEL.bit.SEL = SYNC_IN_SRC_SYNCOUT_EPWM3;

EPwm3Regs.ETSEL.bit.INTEN = 1;
EPwm3Regs.ETSEL.bit.INTSEL = ET_CTR_PRD;                              //标记:周期产生PWM3中断,把DMA_Data1[ ]求平均,DMA_Data2[ ]求平均,DMA_Data3[ ]求平均,
EPwm3Regs.ETPS.bit.INTPRD = ET_1ST;

EPwm8Regs.ETSEL.bit.SOCAEN = 1;
EPwm8Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO;                     //标记:触发一次SOCA, 一个PWM3周期一共产生8次SOCA(为什么有16次采样?)
EPwm8Regs.ETPS.bit.SOCAPRD = ET_1ST;
////
ADC_setInterruptSource(myADCB_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER2); // 标记:每次采样完number2产生一次ADC中断,为什么开ADC中断?产生8次ADC中断有什么用?不是需求
////
DMA_setEmulationMode(DMA_EMULATION_STOP);
DMA_configAddresses(myDMA0_BASE, 5888, 2848);
DMA_configBurst(myDMA0_BASE, 3U, 1, 16);                  // 标记:参数3:代表3个数组BUF数设置,     参数1: 怎样计算得来?参数16: 怎样计算得来?
DMA_configTransfer(myDMA0_BASE, 16U, -2, -31);         // 标记:参数16: 怎样计算得来?  参数-2: 怎样计算得来?  参数-31: 怎样计算得来?
DMA_configWrap(myDMA0_BASE, 16U, 0, 16U, 0);
DMA_configMode(myDMA0_BASE, DMA_TRIGGER_ADCB1, DMA_CFG_ONESHOT_DISABLE | DMA_CFG_CONTINUOUS_ENABLE | DMA_CFG_SIZE_16BIT);
DMA_enableTrigger(myDMA0_BASE);
DMA_startChannel(myDMA0_BASE);

ePWM3作为主PWM,每个PWM周期内通过ePWM8触发采样,采样16次,每次采样3个信号:ADCB0,ADCB1,ADCB2。将ADCB0,ADCB1,ADCB2分别存于DMA_Data1,DMA_Data2,DMA_Data3中:
DMA_Data1 : origin = 0x001700, length = 0x000010
DMA_Data2 : origin = 0x001710, length = 0x000010
DMA_Data3 : origin = 0x001720, length = 0x000010

二、需求

现在ADCA (10通道),ADCB(8通道), ADCC(7通道), PWM 零点SOCA触发采样,采样ADCA.soc9采样完 ADCA1中断, 在ADC中断中分别读取ADCA ADCB ADCC结果值和控制

需求是ADCA有10个通道, 其中有4通道需要主开关周期采样2次,通过DMA传输,其余6通道采样一次(ADCA.result读取(不行通过采样2次)),一个开关周期只中断一次用作采样计算和控制环,pwm adc DMA需要怎样配置?谢谢。

  • 1.1 PWM3是增减计数,PWM8是增计数,所以一个PWM3周期内有16次底点触发采样;

    1.2 ADC的SOC2是ADCB2,也就是每次采样的最后一个数据,它采样完成后通过ADC中断触发DMA搬运数据;

    1.3 3是每次burst需要搬运3次数据、1是ADCB0,ADCB1,ADCB2的地址是0x0b20,0x0b21,0x0b22,地址增加1个、16是DMA_Data1,DMA_Data2,DMA_Data3的地址为0x1700,0x1710,0x1720,地址增加16个

    1.4 和burst计算方式一样,一共搬运16组数据,-2让ADCB2跳回到ADCB0,-31让DMA_Data3[x]跳回到DMA_Data1[x+1]的地址。

    2 如果只采样两次没必要通过DMA,再额外配置4个相同的ADCA通道,用不同的触发源进行触发就可以了。

  • 感谢您回复

    1.2 ADC的SOC2是ADCB2,也就是每次采样的最后一个数据,它采样完成后通过ADC中断触发DMA搬运数据;

    ADC中断触发DMA搬运数据是那个参数设置?控制中断如果是ADC中断是否就有16次中断,此时应该改成主PWM中断来做了对么?

    DMA_configMode(myDMA0_BASE, DMA_TRIGGER_ADCB1,x,x)  DMA_TRIGGER_ADCB1这个参数怎样应用理解?

    2. 其中有4通道需要主开关周期采样4次,通过DMA传输,应该怎样配置?谢谢

  • DMA_configWrap(myDMA0_BASE, 16U, 0, 16U, 0);  四个参数16,0, 16, 0怎样理解计算?谢谢

  • 控制中断用主PWM中断做;

    ADC_setInterruptSource(myADCB_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER2);配置在SOC2完成时生成ADCB1中断,DMA_configMode(myDMA0_BASE, DMA_TRIGGER_ADCB1......)配置DMA由ADCB1中断触发。

    DMA_configWrap(myDMA0_BASE, 16U, 0, 16U, 0); 表示16次transfer后源地址和目标地址(DMA_Data1[0])都会绕回到最初的地址。

    采样4次的话可以用DMA进行配置,burst配置成4,tansfer也配置成4就可以.