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.

[参考译文] CCS/TMS320F28335:如何使用 TMS320F28335 DSP 生成具有可变频率的三相移 PWM 信号?

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/873702/ccs-tms320f28335-how-to-generate-3-phase-shifted-pwm-signals-with-variable-frequency-using-tms320f28335-dsp

器件型号:TMS320F28335

工具/软件:Code Composer Studio

您好!

我想使用 TMS320F28335 DSP 生成三相移 PWM 信号。 但是、我希望周期性地将 PWM 信号频率从20kHz 改变为24kHz、阶跃变化为1kHz、占空比将保持恒定。 因此、PWM1的频率应在20kHz 至24kHz 之间变化、另外两个 PWM 信号 PWM2和 PWM3将跟随 PWM1以120度的相位。 作为第一种方法、我尝试改变 PWM1的频率、在这里我将 TBCTR 值与 TBPRD 进行比较、以更新 TBPRD 和 CMPA 值。 为了避免因计算而产生延迟、我已将所需的 TBPRD 值存储在数组中。 但 PWM1不像我预期的那样工作。  

是否有人可以给我建议来解决这个问题?

Mohammad Arifur Rahman

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

    从以下示例开始:

    http://dev.ti.com/tirex/explore/node?node=ANQtAx1d.2Tq4rBvalR55g__gYkahfz__LATEST

    您将需要更新、

    TBPRD、

    CMPA、CMPB、

    TBPHS (只适用于从 PWM)

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

    穆罕默德

    您应该能够更新 TBPRD 寄存器。 请注意、由于您正在实施的频移、您可能会在3相移 PWM 之间遇到一些抖动。 这只会在更新一个或两个 PWM 的 TBPRD 值时发生、而不会在 PWM 周期内更新其他值时发生。

    我还建议您考虑使用影子加载功能。 如果您定义了一个安全窗口来更新 TBPRD 值、则可能不需要它、但它可能仍然是一个有用的功能。

    更新 TBPRD 应该很简单、只需写入寄存器即可。 如果您看不到值更改、我假设您的代码中存在某种需要调试的问题。 尝试使用内存浏览器读取值。 单步执行可以帮助您排除其他可能单步执行您刚才写入的值的代码段。 最后、写入 RAM 位置可能是测试功能的好方法。

    此致、
    Cody  

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

    Cody、

    感谢您的建议。 我现在使用的是影子模式。 我还在使用中断来更新 TBPRD 和 CMPA 值、而中断在每1us 后出现一次。 我已附上以下代码。 将 TBCRT 值与 CMPA 进行比较是否是更新 TBPRD 和 CMPA 值的正确方法?

    PWM 初始化:


    void Setup_ePWM (void)

    //////////////////////////////////////////////////////////////////////////////////////////////
    EPwm1Regs.TBCTL.bit.CLKDIV = 0;
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 3;
    EPwm1Regs.TBCTL.bit.CTRMODE = 0;


    EPwm1Regs.TBPRD = freq[0];
    EPwm1Regs.CMPA.half.CMPA =持续时间[0];

    EPwm1Regs.AQCTLA.bit.ZRO=2;
    EPwm1Regs.AQCTLA.bit.CAU=1;

    EPwm1Regs.CMPCTL.bit.LOADAMODE=0;
    EPwm1Regs.CMPCTL.bit.SHDWAMODE=0;

    在 ISR 内更新 TBPRD 和 CMPA:

    中断 void cpu_timer0_isr (void){
    if (pwm1count=16){
    pwm1count=0;

    if (EPwm1Regs.TBCTR=EPwm1Regs.CMPA.half-CMPA){
    EPwm1Regs.TBPRD = freq[pwm1count];
    EPwm1Regs.CMPA.half.CMPA =持续时间[pwm1count];
    pwm1count++;

    PieCtrlRegs.PIEACK.ALL = 1;

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

    穆罕默德

    您是否验证过该 if 语句中的代码是否执行过? 在计算"IF 语句"的情况下、TBCTR 与 CMPA 完全相等的可能性非常低。 我怀疑您很少看到此代码运行。

    只需设置 TBPRD 值和 CMPA 值。 如果要定义保存窗口以更新值、请使用 一个值范围、而不是精确匹配。

    此致、
    Cody  

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

    您好、Cody、

    我使用一个范围来更新 TBPRD 值、获得了更好的结果。 我已经为三相移 PWM 实现了它。

    时间周期更新代码:

    IF (EPwm1Regs.TBCTR>=600 && EPwm1Regs.TBCTR<=618){
    EPwm1Regs.TBPRD = freq[pwm1count];
    EPwm1Regs.CMPA.half.CMPA =持续时间[pwm1count];

    EPwm2Regs.TBPHS.half.TBPHS = PHAS[pwm1count];
    EPwm2Regs.TBPRD = freq[pwm1count];
    EPwm2Regs.CMPA.half.CMPA =持续时间[pwm1count];

    EPwm3Regs.TBPHS.half.TBPHS = Phase3[pwm1count];
    EPwm3Regs.TBPRD = freq[pwm1count];
    EPwm3Regs.CMPA.half.CMPA =持续时间[pwm1count];

    现在、PWM 如下所示:

    非常感谢你的帮助。  

    Mohammad Arifur Rahman