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.

[参考译文] TMS320F28035:ePWM、伺服电机嗡嗡声/卡顿

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1515165/tms320f28035-epwm-servo-motor-buzzing-stuttering

器件型号:TMS320F28035

工具/软件:

您好:

我使用带 ePWM 的56引脚 F28035来移动伺服电机。 随机地、伺服电机将在其遍历的某些点开始嗡嗡声/卡顿。 我发布了代码和视频来展示发生了什么。 我已经尝试使用不同的频率之间的50Hz 到333Hz ,但同样的行为出现。 作为参考、伺服电路使用333Hz。 是否应该查找任何要更改的设置或任何应该查找的寄存器行为? 通常情况下、我们使用 F28035的80引脚型号、这样不会经常出现嗡嗡声。 谢谢你。

//
// Included Files
//
#include "DSP28x_Project.h"     // Device Headerfile and Examples Include File

Uint16 isrCntr = 0;
Uint16 pos = 0;
Uint16 dir = 0;

__interrupt void pwm2Isr(void);

//
// Main
//
void main(void)
{
    //
    // Step 1. Initialize System Control:
    // PLL, WatchDog, enable Peripheral Clocks
    // This example function is found in the DSP2803x_SysCtrl.c file.
    //
    InitSysCtrl();

    InitPieCtrl();

    IER = 0x0000;
    IFR = 0x0000;

    InitPieVectTable();

    InitEPwm2Gpio();

    EALLOW;
    GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO23 = 1;
    GpioDataRegs.GPACLEAR.bit.GPIO23 = 1;
    EDIS;

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    EDIS;
    
    //
    // Setup TBCLK
    //
    EPwm2Regs.TBSTS.all = 0;
    EPwm2Regs.TBPHS.half.TBPHS = 0;
    EPwm2Regs.TBCTR = 0;
    EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;  // Count up.
    EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;     // Disable phase loading.
    EPwm2Regs.TBPHS.half.TBPHS = 0x0000;        // Phase is 0.
    EPwm2Regs.TBCTR = 0x0000;                   // Clear counter.
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = 0;          // Clock ratio to SYSCLKOUT.
    EPwm2Regs.TBCTL.bit.CLKDIV = 6;

    //
    // Setup shadow register load on ZERO
    //
    EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
    EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;

    //
    // Set actions
    //
    EPwm2Regs.AQCTLA.bit.ZRO = AQ_SET;      // Set PWM2A on Zero
    EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;    // Clear PWM2A on event A, up count

    EPwm2Regs.ETSEL.bit.INTSEL = 2;
    EPwm2Regs.ETPS.all = 1;
    EPwm2Regs.TBCTL.bit.SYNCOSEL = 3;

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    EDIS;

    EALLOW;
    PieVectTable.EPWM2_INT = &pwm2Isr;
    EDIS;

    IER |= M_INT3;

    EINT;
    ERTM;

    PieCtrlRegs.PIEIER3.bit.INTx2 = 1;

    GpioDataRegs.GPASET.bit.GPIO23 = 1;

    EPwm2Regs.ETCLR.bit.INT = 1;
    EPwm2Regs.ETSEL.bit.INTEN = 1;
    EPwm2Regs.TBPRD = 2815;
    EPwm2Regs.CMPA.half.CMPA = 1407;
    pos = 1407;

    while (1) {}
}

__interrupt void pwm2Isr(void)
{
    if (pos < 1642 && dir == 0)
    {
        EPwm2Regs.CMPA.half.CMPA = pos++;
    }
    else if (pos == 1642)
    {
        isrCntr++;

        if (isrCntr > 1000)
        {
            isrCntr = 0;
            dir = 1;
            EPwm2Regs.CMPA.half.CMPA = pos--;
        }
    }
    else if (pos > 1172 && dir == 1)
    {
        EPwm2Regs.CMPA.half.CMPA = pos--;
    }
    else if (pos == 1172)
    {
        isrCntr++;
        if (isrCntr > 1000)
        {
            dir = 0;
            isrCntr = 0;
        }
    }

    EPwm2Regs.ETCLR.bit.INT = 1;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}

e2e.ti.com/.../servoMov2.mov

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

    尊敬的 JZ:

    很遗憾、视频未显示。 您能否探测 PWM 输出并验证是否正在生成预期波形?

    在80引脚型号和当前型号中、PWM 的所有时钟设置是否都相同?

    是否应用了所有相同的 ePWM 寄存器? 您可以使用通过 JTAG 连接的 CCS 以及当前引脚型号和80引脚之间的 DIFF 来导出寄存器内容。

    此致、

    Ryan Ma

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

    您好、Ryan、

    80引脚和56引脚之间的时钟设置相同。 使用937500Hz 的 TBCLK。

    两者之间的唯一区别是、通常在80引脚型号上、我们使用 ePWM1A 作为进入伺服的信号。 在56引脚上、我必须使用 ePWM2A。  除了不同的 ePWM 模块外、寄存器设置是相同的。

    这是一个捕捉图像、显示了 PWM 引脚上的噪声。 除了噪声、脉冲宽度和周期在我看来很好。

    我可以通过什么方式将视频发送给您吗? 感谢 Ryan 的帮助。

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

    尊敬的 JZ:

    看起来 PWM 正在运行、因为它应该基于您的输出。 您是否看到 PWM 输出有任何奇怪的问题?

    在测试时、您使用的是定制板还是我们 TI 的 EVM? 可能与电路板布局有所不同?

    此致、

    Ryan Ma

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

    当代码到达 isrCntr 部分时、我看到1或2个周期略短于其他周期。 我将看看能否捕获到它。

    我同时使用定制板和 F28035控制卡(带对接)进行测试。

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

    尊敬的 JZ:

    何时更新 PWM 值? 对于新的比较值、您的 ISR 频率是否短于 PWM 的下一个加载事件?

    此致、

    Ryan Ma

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

    您好、Ryan、

    我在 ISR 中更新 cmpa、tbprd 保持相同的值。

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

    尊敬的 JZ:

    您能否将 ISR 的频率与 PWM 更新联系起来? 听起来在下一次加载事件发生之前、CMPA 值可能无法及时反映。

    您是否能够捕获到 PWM 占空比小于预期的点?

    此致、

    Ryan Ma

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

    您好、Ryan、

    这两个示波器图片显示了在 ISR 中设置和清除 GPIO 的情况。 当 tbctr = tbprd 且第一个事件 intcnt = 1时、会发生此 ISR。

    放大:

    接下来的两个示波器图片,我觉得第12个脉宽(红色)有一些差异。

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

    尊敬的 jz:

    无法查看第12个脉冲宽度是否与其他脉冲宽度不同。

    您能否通过测量占空比与其他脉冲宽度来放大和比较第12个脉冲宽度?

    此致、

    Ryan Ma

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

    我的错。 我使用了您的想法、发现另一个看起来有方差的脉冲宽度。 使用频率和高脉冲宽度测量、频率和脉冲宽度相同。

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

    尊敬的 JZ:

    如果它们相同、则 PWM 似乎正常运行。 抱歉、我不能补充您为什么会遇到嗡嗡声或卡顿。

    Ryan Ma

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

    感谢 Ryan 的帮助。 如果我可能会问,我可以从这次捕获中了解什么? 红色信号是提供给为伺服馈电的电路板的电源。 绿色是控制电机的 PWM。 谢谢。

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

    对延迟响应表示歉意。 看起来就在15ms 标记之前、系统行为意外发生变化。 是否存在会导致击穿电流尖峰的 PWM 死区问题? 这将解释为什么会出现关断周期功耗尖峰。

    此致、
    Jason Osborn

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

    您好 Jason、

    别担心。 当前未启用死区功能。 谢谢。

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

     应 启用 Ah-死区(或软件中的类似功能)、以避免上下 FET 同时处于活动状态的情况。 为了避免这种没有死区的情况、您采取了什么措施?

    此致、
    Jason Osborn

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

    我在代码中没有避免这种情况的功能。 我将介绍死区 PWM 示例。 谢谢 Jason。