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.

[参考译文] TMS570LS1224:PWM 占空比输出控制的问题

Guru**** 2558170 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/890098/tms570ls1224-the-problem-about-pwm-duty-output-control

器件型号:TMS570LS1224

您好!

我在 PWM 输出控制方面有问题。 我们需要控制应用中的所有 PWM 占空比输出(0 ~ 100%)。
但它看起来失败了。 因此、我想知道它是完全控制、还是有其他方法来实现目标?

设置信息如下:  

模式:向上/向下计数
中断时序:零和 PRD (波槽和波峰)使用设置下一个执行情况
影子加载计时:零和 PRD
情况 Z => P => H => Z => P => H => Z => P => P => Z => Z => Z => H => Z => H => P => Z
(P = PRD、Z =零、H =半)
外壳输出由 CMPA 和 AQCTLA 寄存器控制。

PWM1A 和 PWM2A 输出至示波器
PWM1A:输出占空比
PWM2A:表示咯吱和谷(输出高电平表示增加间隔,低电平表示减少间隔)

预期波形:

设置的情况将在下一个间隔执行。 例如:设置为增加时间间隔,在减少时间间隔执行。(首次执行情况)

实验结果波:

我们可以看到发生了两种情况失败。 其他人是正确的。 (红色波形为预期波形)

(1)从增加到减少间隔(执行 P 到 H)

(2)从减少到增加间隔(执行 Z 到 H)

感谢你的帮助。

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

    您好、Elvis、

    ePWM 模块可以实现它。 如何知道它是"Z"、"H"和"P"?

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

    您需要根据"Z"、"P"和"H"的条件在 AQCTLA 寄存器中动态更改 CAU、CAD、CBU、CBD、PRD 和 ZRO 的设置。

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

    您好、Q J Wang、

    它  已经在动态更改 AQCTLA 寄存器。

    我 根据 计数条件和 CMPA 值  来更改 AQCTLA 控制字段。(计数条件意味 着 它是单调的向上计数或向下计数)

      更改 AQCTLA 后、比较值将填充 CMPA 寄存器。  然后、它将 在下一个间隔生效。

    但失败了。 您可以在 图2中看到另一个相同的情况" P => H "、输出 与预期的相同。(第五个 情况到第六个情况)

    感谢您的回复。

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

    您好、Elvis、

    您能否发布用于更新占空比的代码?

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

    您好 QJ、

    还可以! AQCTLA 寄存器的更新代码 为 flif允许。 在 递增计数间隔中进行设置 将在递减间隔时执行。  因此、向上计数应设置 CAD 和 PRD。

    我们首先检查了比较值并更改了 AQCTLA 寄存器。 之后、填充 CMPA 寄存器中的比较值。

    (比较值 表示代码中的 Dutycmp)

    //AQCTLA 移位
    #define AQCTLx_BCD_SHIFT                       10U
    #define AQCTLx_CBU_SHIFT                       8U
    #define AQCTLx_CAD_SHIFT                       6U
    #define AQCTLx_CAU_SHIFT                       4U
    #define AQCTLx_PRD_SHIFT                       2U
    #define AQCTLx_ZRO_SHIFT                       0U

    #define CBDHIGH        (((uint16) 0x2U << AQCTLx_BCD_SHIFT)
    #define CBUHIGH        (((uint16) 0x2U << AQCTLx_CBU_SHIFT)
    #define CADHIGH        (((uint16) 0x2U << AQCTLx_CAD_SHIFT)
    #define CAUHIGH        (((uint16) 0x2U << AQCTLx_CAU_SHIFT)
    #define PRDHIGH        (((uint16) 0x2U << AQCTLx_PRD_SHIFT)
    #define ZROHIGH        (((uint16) 0x2U << AQCTLx_ZRO_SHIFT)

    #define CBDLOW         ((uint16) 0x1U <<AQCTLx_BCD_SHIFT)
    #define CBULOW         ((uint16) 0x1U <<AQCTLx_CBU_SHIFT)
    #define CADLOW         ((uint16) 0x1U <<AQCTLx_CAD_SHIFT)
    #define CAULOW         ((uint16) 0x1U <<AQCTLx_CAU_SHIFT)
    #define PRDLOW         ((uint16) 0x1U <<AQCTLx_PRD_SHIFT)
    #define ZROLOW          ((uint16) 0x1U <<AQCTLx_ZRO_SHIFT)

    #define CADNOTHING (((uint16) 0x0U << AQCTLx_CAD_SHIFT)
    #define CAOUNTING (((uint16) 0x0U << AQCTLx_CAU_SHIFT)
    #define PRDNOTHING (((uint16) 0x0U << AQCTLx_PRD_SHIFT)
    #define ZRONOTHING (((uint16) 0x0U << AQCTLx_ZRO_SHIFT)


    空 DutyOutPrcs (PWMGEN * Dutycmp)

       uint16 zRegU                                                    = 0;
       zRegU                                                               = etpwmREG5->AQCTLA;

       if ((((etpwmREG5->TBSTS)&0x0001)=1)         //up-count
       {
           if (Dutycmp->PWM1out == C_PWM_PRD)
                   etpwmREG5->AQCTLA                      = CADNOTHING | PRDHIGH |(zRegU&0xFF33);
           否则 if (Dutycmp->PWM1out =0)
                   etpwmREG5->AQCTLA                       = CADNOTHING | PRDLOW  |(zRegU&0xFF33);
           其他
                   etpwmREG5->AQCTLA                       = CADHIGH        | PRDLOW  |(zRegU&0xFF33);

       }else                                                                 //down-count
       {
           if (Dutycmp->PWM1out == C_PWM_PRD)
                   etpwmREG5->AQCTLA                       = CAOUNTHING | ZROHIGH |(zRegU&0xFFCC);
           否则 if (Dutycmp->PWM1out =0)
                   etpwmREG5->AQCTLA                       = CAOUNTHING | ZROLOW  |(zRegU&0xFFCC);
           其他
                   etpwmREG5->AQCTLA                       = CAULOW         | ZROHIGH |(zRegU&0xFFCC);
       }

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

    您好、Elvis、

    根据您的代码、我不会看到所有条件。

    例如、当计数器向上计数时、有两个 P (高电平亮起为黄色)。 如果之前的 PWM 输出为 Z、下一个 PWM 输出应为 H (第一个);如果之前的 PWM 输出为 H、下一个 PWM 输出应为0 (第二个)

    对于第一个、AQ 控制设置应为

            etpwmREG5->AQCTLA = CADHIGH | PRDLOW | ZEROLOW |(zRegU&0xFF33);

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

    您好 QJ、

    我不知道   在我们的应用中、下一个输出是 H、P 或 Z。

    因此 、我的代码中的规则 是、我们应将 CAD 和 PRD 设置为向上计数、并将 CAU 和零设置为向下计数。

    (在向上计数中设置将 在向下计数间隔执行。 因此、向上计数 控制 PRD (间隔的头)和 CAD。)

    根据 这一点、我不知道下一个输出是什么。

    我发现 我的实验未能满足 H=>H 、P=>P、Z=>Z (*2 从 向上计数或向下计数条件开始)的六种情况

    我再次进行了两次实验。( 每个实验总共19个案例)

    (1)图1:原始代码

    (2) 图片2: 根据您 的建议 ,但我 只是更改了。   => etpwmREG5->AQCTLA = CADHIGH | PRDLOW | ZEROLOW |(zRegU&0xFF33);

    但问题仍然存在(图片中的左红色圆圈)。 请看图片1 和2。 我得到了相同的波形。

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

    您好、Elvis、

    我在家里没有用于测试的空间。 请检查 zRegU 的值。 您的指令中的或 zRegU 的用途是什么?

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

    您好 QJ、

    zRegU 用于锁存原始 AQCTLA 寄存器设置以进行逻辑计算。

    zRegU                                                    = etpwmREG5->AQCTLA;

    etpwmREG5->AQCTLA                       = CADNOTHING | PRDHIGH |(zRegU&0xFF33);

    我在技术参考手册第735页找到了一些信息。 不建议为 CMPA 使用 PRD 或零值。 那么、这 是 TMS570的限制吗?

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

    您好、Elvis、

    这些是限制条件:

    0时的负载:CMPA/B 必须>= 1

    2.在 PRD 上加载:CMPA/B 必须<= PRD-1

    否则、新值将延迟一个周期。

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

    [引用用户="QJ Wang "]

    您好、Elvis、

    这些是限制条件:

    0时的负载:CMPA/B 必须>= 1

    2.在 PRD 上加载:CMPA/B 必须<= PRD-1

    否则、新值将延迟一个周期。

    [/报价]您好 QJ、

    感谢您的帮助!!