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 ETS ADC 触发选择设置为 COUNTER = 0不会触发连接到 ADC 的 DMA ISR (EPwm3Regs.ETSEL.bit.SOCASEL = et_CTR_ZERO;)。

Guru**** 2538930 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/627099/tms320f28335-setting-epwm-ets-adc-trigger-selection-to-counter-0-does-not-trigger-the-dma-isr-that-is-connected-to-the-adc-epwm3regs-etsel-bit-socasel-et_ctr_zero

器件型号:TMS320F28335

一旦 PWM 时钟被启用(SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC= 1;)、我就想启动 ADC 及其连接的 DMA。

这不起作用:

EPwm3Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO; 

我的解决方法是使用 CMPA 寄存器并将其设置为1、因为0也不起作用:

EPwm3Regs.CMPA.half.CMPA = 1;
EPwm3Regs.ETSEL.bit.SOCASEL = ET_CTRL_CMPA; 

PWM 频率为100MHz。

是否有人遇到过类似的问题?

祝你一切顺利、

Günter μ A

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

    Günter μ A、

    您的变通办法对我来说似乎是合理的。 我想正在发生的情况:你需要启用时钟来设置 PWM、只要你这么做 TBCTR 开始计数、在你启用 SOCASEL 时、TBCTR 计数到0之后、SOCA 就会丢失、直到下一个周期。

    如果您的目标是同时启动 SOCA 和 PWM、您可以尝试将 TBPHS 加载为0、并在启动 PWM 后使用 SWFSYNC 立即对齐所有内容。

    这有帮助吗?

    此致、
    Cody  

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

    您好、Cody、

    感谢您的快速且非常有帮助的回复。

    由于我已经准备好了解决方案、我将在一个不太繁忙的星期内尝试您的建议。 不过、我想说的是、设置 PWM 通道时、需要禁用和启用时钟。 这就是我期望计数器0触发 SOC 的原因。 但我可以想象、计数器的值不是计数器的值、而是其转换会触发 SOC。

    祝你一切顺利、

    Günter μ A

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;
    EDIS;
    
    // PWM 通道1用于控制 VGN1。
    EPwm1Regs.TBPRD = PWM_VGN_PERIOD;
    //从50%占空比开始。
    // EPwm1Regs.CMPA.half.CMPA = PWM_VGN_PERIOD / 2;
    //从0%占空比开始。
    EPwm1Regs.CMPA.half.CMPA = 0;
    EPwm1Regs.TBPHS.ALL = 0;
    EPwm1Regs.TBCTR = 0;
    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
    EPwm1Regs.TBCTL.bit.FREE_SOFT = 2;
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
    EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
    EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;
    
    // PWM 通道2用于控制 VGN2。
    EPwm2Regs.TBPRD = PWM_VGN_PERIOD;
    //从50%占空比开始。
    // EPwm2Regs.CMPA.half.CMPA = PWM_VGN_PERIOD / 2;
    //从0%占空比开始。
    EPwm2Regs.CMPA.half.CMPA = 0;
    EPwm2Regs.TBPHS.ALL = 0;
    EPwm2Regs.TBCTR = 0;
    EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
    EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;
    EPwm2Regs.TBCTL.bit.FREE_SOFT = 2;
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
    EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
    EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW;
    EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;
    EPwm2Regs.AQCTLA.bit.CAD = AQ_SET;
    
    // PWM 通道3用于启用/禁用 H 桥(在 U7和 U9上将 SD 设置为高电平)
    //和设置 ADC 转换。
    EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
    EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE;
    EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
    EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
    EPwm3Regs.AQCTLA.ALL = 0;
    EPwm3Regs.ETSEL.bit.INTSEL = ET_CTR_PRD;
    EPwm3Regs.CMPA.half.CMPA = 1;
    EALLOW;
    PieVectTable.EPWM3_INT =&epwm3/ISR;
    EDIS;
    
    // PWM 通道4用于驱动 H 桥的相位0。
    EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
    EPwm4Regs.TBCTL.bit.PHSEN = TB_ENABLE;
    EPwm4Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
    EPwm4Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
    
    if (burrstConfiguration.pulseCount > 1)
    {
    // PWM 通道5用于通过更改动作限定符来完成突发。
    EPwm5Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
    EPwm5Regs.TBCTL.bit.PHSEN = TB_ENABLE;
    EPwm5Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
    EPwm5Regs.TBCTL.BIT.TBIT.T=
    COUNTER = 0;= TBIT_COUNTER = T_BON_COUNTRD = TTE。
    EPwm5Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;
    //立即禁用中断。 在 StartBurst 中启用它。
    EPwm5Regs.ETSEL.bit.INTEN = 0;
    EALLOW;
    PieVectTable.EPWM5_INT =&epwm5_ISR;
    EDIS;
    }
    // PWM 通道6用于驱动 H 桥的180相。
    EPwm6Regs.TBCTL.bit.PHSEN = TB_DISABLE;
    EPwm6Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
    EPwm6Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
    
    //启用 PWM 时钟以支持设置信号增益。
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;
    EDIS;
    

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

    Günter μ A、

    我之前的帖子只是一个理论、我不确定它是否是真的。 即使您启用和禁用时钟、也有可能在第一个周期中创建竞态条件。 如果这是真的、那么至少看起来 TBCTR 首先递增是一致的。

    我很高兴您的代码能够正常工作!  如果您有机会测试我建议的另一种权变措施、我想知道它是否起作用!

    谢谢、
    Cody