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.

[参考译文] 编译器/TMS320F28388D:基于 DMA 通道自动调整 ePWM 模块的占空比

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/869019/compiler-tms320f28388d-automatically-adjust-duty-cycle-of-epwm-module-based-on-dma-channel

器件型号:TMS320F28388D

工具/软件:TI C/C++编译器

大家好、

由于项目要求、需要改变每5us ePWM 输出的占空比。 考虑到 CPU 负载为5us 中断、我希望使用 DMA 通道周期性地将预设数据传输到比较寄存器。

假设我将预设数据作为数组、如下所示:

const uint16_t RsvExc_DutyCycle _ PreCfg_Table[];

如何配置 DMA 模块以实现上述自动化?

谢谢!

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

    您好!

    您可以配置 CPU 定时器0 / 1 / 2 (或) PWM 事件(SOC A / SOCB 事件)以每5us 触发一次 DMA 事件、并实现您尝试使用如下所示的 DMA 配置执行的操作。

    SRC_BGE_ADDR_SHADDAD_SHADOW = RsvExc_DutyCycle 的地址 PreCfg_Table[]

    SRC_ADDR_SHADOW           =需要更改占空比的 PWM CMPA/CMPB 寄存器的地址

    dst_beg_ADDR_shadow = RsvExc_DutyCycle 的地址 PreCfg_Table[]

    DST_ADDR_SHADOW            =需要更改占空比的 PWM CMPA/CMPB 寄存器的地址

    突发配置详细信息:

    BURST_SIZE                             = 1

    SRC_BURST_STEP                = 1

    dst_burst_step                 = 0

    换行配置详细信息:

    src_wrap_size                    = RsvExc_DutyCycle 的缓冲区大小 PreCfg_Table[]

    src_wrap_step                  =您需要减去以获得 RsvExc_DutyCycle 的起始地址 PreCfg_Table[](       RsvExc_DutyCycle 的缓冲区大小负值 PreCfg_Table [])

    dst_wrap_size                     = RsvExc_DutyCycle 的缓冲区大小 PreCfg_Table[]

    dst_burst_step                 = 0

    传输配置详细信息:

    transfer_size                     =应大于 SRC_wrap_size  

    SRC_TRANSFER_STEP        = 1.

    dst_transfer_step         = 0

    此致、

    曼诺伊

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

    您好、Manoj、

    我执行了如下 DMA 通道配置:

    #pragma DATA_SECTION (RsvExc_DutyCycle _ PreCfg_Table、"ramgs2");
    uint16_t RsvExc_DutyCycle _ PreCfg_Table[RESEXC_SAMPLE_DEPTY]={
    0x0050、
    0x0064、
    0x0078、
    0x008C、
    0x00A0、
    0x00B4、
    0x00C8、
    0x00DC、
    0x00F0、
    0x0104、
    0x0118、
    0x012C、
    0x0140、
    0x0154、
    0x0168、
    0x017C、
    0x0190、
    0x01A4、
    0x01B8、
    0x01CC
    、};
    
    const DMA_ChannelConfigType DmaChn_RsvExcelDutyCycle _t={
    DMA_CH1_BASE、 //DMA_Base;
    (const void*)(EPWM11_BASE + EPWM_O_CMPB+1)、 //dma_destAddr;
    &RsvExc_DutyCycle _ PreCfg_Table[0]、 //dma_SrcAddr;
    1、 //DMA_BurstSize;
    1、 //DMA_BurstSrcStep;
    0、 //DMA_BurstDestStep;
    RESEXC_SAMPLE_DEPTH、 //DMA_TransferSize;
    1、 //DMA_TransferSrcStep;
    0、 //DMA_TransferDestStep;
    RESEXC_SAMPLE_DEPTH、 //DMA_SrcWrapSize;
    0、 //DMA_WrapSrcStep;
    RESEXC_SAMPLE_DEPTH、 //DMA_DestWrapSize;
    0、 //DMA_WrapDestStep; 
    DMA_TRIGGER_EPWM11SOCA、 //dma_TrigSrc;
    DMA_CFG_OneShot_disable |
    DMA_CFG_Continuous_enable |
    DMA_CFG_Size_16BIT、 //dma_Mode;
    };
    
    void dma_Init (dma_ChannelConfigType dmaChn)
    {
    dma_initController();
    
    dma_configAddresses (dmaChn.dma_Base、dmaChn.dma_DestAddr、dmaChn.dma_SrcAddr);
    dma_configBurst (dmaChn.dma_Base、dmaChn.dma_BurstSize、dmaChn.dma_BurstSrcStep、dmaChn.dma_BurstDestStep);
    DMA_configTransfer (dmaChn.DMA_Base、dmaChn.DMA_TransferSize、dmaChn.DMA_TransferSrcStep、dmaChn.DMA_TransferDestStep);
    DMA_configWrap (dmaChn.DMA_Base、dmaChn.DMA_SrcWrapSize、dmaChn.DMA_WrapSrcStep、dmaChn.DMA_DestWrapSize、dmaChn.DMA_DestWrapStep); 
    DMA_configMode (dmaChn.DMA_Base、dmaChn.DMA_TrigSrc、dmaChn.DMA_Mode);
    DMA_enableTrigger (dmaChn.DMA_Base);
    dma_startChannel (dmaChn.dma_Base);
    
    }
    
    根据上述代码,我发现了 DMA 模块的几种异常行为。 

    首先、值得一提的是、我从占空比表(即 RsvExc_DutyCycle _PreCfg_Table)获得了看似正确的传输结果、以比较 EPWM11的寄存器 B
    (即(EPWM11_BASE + EPWM_O_CMPB+1))。 但换行配置与您的建议不同。 此外、我还得到了
    在我注释如下代码语句时、结果似乎相同:
    //dma_configWrap (dmaChn.dma_Base、dmaChn.dma_SrcWrapSize、dmaChn.dma_SrcStep、dmaChn.dma_DestSize、dmaChn.dma_DestWrapStep); 

     包装特征剂量似乎根本不起作用。 但是、DMA 传输可以在表到达其末尾时继续进行、并 从表的开头重新启动、正如换行功能所做的那样。 那么、我有什么问题吗? 我很困惑。

      其次、按照您的建议进行编码、我使用       RsvExc_DutyCycle _PreCfg_Table[]的 BufferSize 负值的回绕源步骤配置了 DMA 通道:

     const DMA_ChannelConfigType DmaChn_RsvDutyCycle _t={

    DMA_CH1_BASE、 //DMA_Base;
    (const void*)(EPWM11_BASE + EPWM_O_CMPB+1)、 //dma_destAddr;
    &RsvExc_DutyCycle _ PreCfg_Table[0]、 //dma_SrcAddr;
    1、 //DMA_BurstSize;
    1、 //DMA_BurstSrcStep;
    0、 //DMA_BurstDestStep;
    RESEXC_SAMPLE_DEPTH、 //DMA_TransferSize;
    1、 //DMA_TransferSrcStep;
    0、 //DMA_TransferDestStep;
    RESEXC_SAMPLE_DEPTH、 //DMA_SrcWrapSize;
    -RESEXC_SAMPLE_DEPTH、 //DMA_WrapSrcStep; 
    RESEXC_SAMPLE_DEPTH、 //DMA_DestWrapSize;
    0、 //DMA_WrapDestStep;
    DMA_TRIGGER_EPWM11SOCA、 //dma_TrigSrc;
    DMA_CFG_OneShot_disable |
    DMA_CFG_Continuous_enable |
    DMA_CFG_Size_16BIT、 //dma_Mode;
    }; 

      但是、当前地址指针剂量不会绕回表的开头;相反、它会到达&RsvExc_DutyCycle _PreCfg_Table[0]减去 RESEXC_SAMPLE_DEPTH 的地址。 因此、我认为我不能正确理解换行。

      第三、我使用 另一个也由 DMA_TRIGGER_EPWM11SOCA 触发的 DMA 通道来读取另一个 ePWM 模块的 TBCTR 的时间戳。

      但时间间隔会奇怪地扩大。 当我使用与前一个触发源不同的另一个触发源、例如 DMA_TRIGGER_EPWM13SOCA 时、结果(时间间隔)是正确的。 是否不允许配置具有相同触发源的两个 DMA 通道?


    如有任何不明确的问题、请告诉我。 谢谢。

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

    您好!

    仅  当 TRANSFER_SIZE > WOP_SIZE 时、才会激活换行功能。 我在上述建议中也提到了这一点。 在代码中、您有 transfer_size = wrap_size。 这不奏效。

    因此、请按如下方式更改配置、并查看它是否可以解决问题。

    DMA_TransferSize   = RESEXC_SAMPLE_DEPTH + 1 //或任何大于 RESEXC_SAMPLE_DEPTH 的值

    //DMA_SrcWrapSize = RESEXC_SAMPLE_DEPTH

    当您有2个 DMA 通道由同一 EPWM11SOCA 信号触发时。 DMA 通道优先级(循环/通道1高优先级)将决定 DMA 何时为哪个通道提供服务。 如果 DMA.CH1和 DMA.CH2由 EPWM11SOCA 触发、则 DMA 将首先为 DMA.CH1提供服务、然后进入 DMA.CH2。 有关更多详细信息、请参阅 DMA 一章中的通道优先级部分。

    此致、

    曼诺伊