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.

TMS320F28335: 关于使用Epwm和DMA生成的sin波型周期与预期不符的问题

Part Number: TMS320F28335


Dear everyone:

这里预期生成一个f=100khz,T=10us的sin函数波形,一个T用25个Epwm波形来表示,经过低通滤波后产生波形,经过计算Epwm波形设置f=2.5Mhz,T=0.4us。dsp时钟不分频,向上计数,得出prd为60。设置完成后显示波形,但是示波器上生成的波形周期却不对了,多了7us。我想是不是因为我在DMA中断里操作源地址指针产生的影响。

占空比数据

volatile Uint16 DMABuf1[25]={30, 38, 45, 50, 54, 56, 57, 56, 54, 50, 45, 38, 30, 22, 15, 10, 6, 4, 3, 4, 6, 10, 15, 22,30};
volatile Uint16 *BufAdd =DMABuf1;

DMA中断

interrupt void local_DINTCH1_ISR(void)     // DMA Channel 1
{


    i++;
    if(i<24)
        BufAdd++;
    else
        {
        BufAdd = DMABuf1;
        i=-1;
        }

    DMACH1AddrConfig(CMPA,BufAdd);

    EPwm1Regs.ETCLR.bit.SOCA = 1;
//    DmaRegs.CH1.CONTROL.bit.HALT=1;
    DmaRegs.CH1.CONTROL.bit.RUN=1;
    PieCtrlRegs.PIEACK.bit.ACK7 = 1;


}

9.22补充:

在查看还未滤波的方波信号时发现一个周期有竟然有50个左右的方波信号产生,再仔细查看占空比发现要产生两个波形才会改变一次占空比。

于是尝试降低pwm波形的频率后发现一个周期就会产生25个波形了,所以现在的问题定位到dma传输的速度没有跟上pwm波形产生的速度,我觉得可能是dma中断里造成的影响,但不知道如何更改。

  • 将dma中断函数里的DMACH1AddrConfig(CMPA,BufAdd);注释掉,直接对寄存器进行操作,解决问题。原因是对函数的调用花费了一定时间,加在一起就对结果产生了很大的影响

    interrupt void local_DINTCH1_ISR(void)     // DMA Channel 1
    {
    
    
    
        i++;
        if(i<24)
            {
            BufAdd++;
    
            }
        else
            {
            BufAdd = DMABuf1;
            i=-1;
            }
    
    //    DMACH1AddrConfig(CMPA,BufAdd);
        EALLOW;
        // Set up SOURCE address:
        DmaRegs.CH1.SRC_BEG_ADDR_SHADOW = (Uint32)BufAdd;   // Point to beginning of source buffer
        DmaRegs.CH1.SRC_ADDR_SHADOW =     (Uint32)BufAdd;
    
        // Set up DESTINATION address:
        DmaRegs.CH1.DST_BEG_ADDR_SHADOW = (Uint32)CMPA;     // Point to beginning of destination buffer
        DmaRegs.CH1.DST_ADDR_SHADOW =     (Uint32)CMPA;
    
    
        EDIS;