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.

[参考译文] TMDSCNCD28388D:在一些未知的特殊情况下生成对称双脉冲 PWM 会遇到错误

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1228894/tmdscncd28388d-generating-symmetrical-double-pulse-pwm-encounters-errors-in-some-unknown-special-cases

器件型号:TMDSCNCD28388D

大家好、如下图所示、在我的其中一个三相电机控制应用中、我需要在保持占空比的同时、在一个 PWM 周期内将一相 PWM 从脉冲一次更改为两次 (其优点是可以在高调制比下降低电机定子电流的谐波)。

因此、我将需要两次脉冲的 PWM 定义为 mode4、仅脉冲 一次的 PWM 定义为 mode3、并使用函数 my_pwmB ()在下一个控制周期中更新三相 PWM 的 TBPRD、CMPA、CMPB 和 AQCTLA。

下面是 my_pwmB()函数的细节以及 mode3和 mode4这两种发射状态的示意图。

/*********************************   my PWM for DSP 28388 ***************************************/
// Explanations to array d for ePWM
// d=[TPRD,duty[6],Mode(3)]           
// TPRD: PWM period in second (s)
// dABC: [dA,dA0,dB,dB0,dC,dC0], dA indicates EPwm1Regs.CMPB.bit.CMPB, dA0 indicates EPwm1Regs.CMPA.bit.CMPA (0~1)
// Mode: 3: pulse once, 4: pulse twice
/*********************************   my PWM for DSP 28388 ***************************************/
void my_pwmB(real32_T *d)
{
    uint16_T mode, i, *ePWM1Addr;
    uint16_T TPRD, dA, dA0;   
    
    TPRD = (uint16_T) *(d+0); 
    EPwm1Regs.TBPRD = TPRD;
    EPwm2Regs.TBPRD = TPRD;
    EPwm3Regs.TBPRD = TPRD;
    ePWM1Addr=(uint16_T *) (0x406B);  // Initial address for EPwm1Regs.CMPA.half.CMPA
    
    for (i=0;i<3;i++)  // correspond to Phase a, b, c
    {
        mode=(uint16_T) (*(d+7+i));
        dA=(uint16_T) (*(d+2*i+1) * TPRD);  // for CMPB
        dA0=(uint16_T) (*(d+2*i+2) * TPRD);  // for CMPA

        *(ePWM1Addr+i*0x100+2) =  dA;   // write EPwmiRegs.CMPB.bit.CMPB
        *(ePWM1Addr+i*0x100) = dA0;    // write EPwmiRegs.CMPA.bit.CMPA
        
        if (dA==TPRD) // 0% 
                *(ePWM1Addr+i*0x100-0x2B)  = 0x1; //  CBD (00) CBU (00) CAD (00) CAU (00) PRD (00) ZERO clear (01)  [CBD CBU CAD CAU PRD ZRO]
        else if (dA==0) // 100% 
                *(ePWM1Addr+i*0x100-0x2B)  = 0x2; //  CBD (00) CBU (00) CAD (00) CAU (00) PRD (00) ZERO set (10)  [CBD CBU CAD CAU PRD ZRO]
        else
        {
            if (mode==3) // mode=3,  (0--->1--->0)
                *(ePWM1Addr+i*0x100-0x2B)  = 0x601; //  CBD clear (01) CBU set (10) CAD (00) CAU (00) PRD (00) ZERO clear (01)  [CBD CBU CAD CAU PRD ZRO]
            else if  (dA==dA0) // mode=4 && CMPA==CMPB  (0%, When CMPB=CMPA, CMPA is invalid)
               *(ePWM1Addr+i*0x100-0x2B)  = 0x1; //  CBD (00) CBU (00) CAD (00) CAU (00) PRD (00) ZERO clear (01)  [CBD CBU CAD CAU PRD ZRO]
            else // mode=4 && CMPA!=CMPB  (0--->1--->0--->1--->0)
                *(ePWM1Addr+i*0x100-0x2B)  = 0x691; //  CBD clear (01) CBU set (10) CAD set (10) CAU clear (01)  ZERO clear (01)  [CBD CBU CAD CAU PRD ZRO]

        }
    }
}

但在实际的闭环电机运行中、我发现 PWM 中存在一些单独周期、它们的作用与我给定的不符。 在示波器的屏幕截图中、 CH1_1、CH1_2、CH2_1分别对应于 PWM1A、PWM2A、PWM3A;CH2_2表示 PWM1A 的模式、低电平表示模式3、高电平表示模式4;  CH4_1表示 EPwm1Regs.CMPB.bit.CMPB 的值、0V 表示 CMPB 为0、4.5V 表示 CMPB 的值等于 PRD (PRD=10000、PWM 时钟频率为100MHz)、类似地、CH4_2表示 EPwm1Regs.CMPA.bit.CMPA 的值;CH3_1表示电机定子电流。

我将 DA 输出放在 ADC 中断的开头、因此示波器屏幕截图中的 PWM 和 DA 输出之间没有一步式延迟。

您可以看到红色框中的 PWM 波形1和3属于 Mode4、但它们不会两次产生脉冲。

我还将样本触发器的时序从 CTR=ZRO 更改为 CTR=PRD、但下面示波器屏幕截图红色框中的 PWM 也属于 Mode4、但仅产生一次脉冲。 请注意、与 PWM 波形相比、屏幕截图中的 DA 输出波形将具有半周期延迟、因为此处修改了 ADC 采样时间。

我正在尝试了解发生这种情况的原因、 您会不会介意给我一些建议以供参考。

此致,

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

    您好、Zhu、

    Mode4中是否有原因? Ch4_1表示 EPwm1Regs.CMPB.bit.CMPB 的值、0V、在波形中、我看到您需要一些值而不是零。 这是故意的吗?

    或其他东西时、就必须考虑放大器带宽。  

    其擅长检查开环控制并生成 PWM 以查看是否实现所需的波形。  

    此致!  

    Uttam

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

    检查开环控制并生成 PWM 以查看是否能实现所需波形的好方法。  [/报价]

    我的确对感应电机进行了开环测试、示波器通道和变量之间的相应关系与之前描述的一样。 波形如下图所示、在开环测试中、我认为没有问题、电机可以正常运行。

    当您提到 DA 时,地址为 DAC 或其他内容。  [/报价]

    是的、我要讨论的 DA 是 DAC。 由于我的 JTAG(XDS100V2)的性能较差、所以我通过 DAC 输出放置一些内部量、然后使用示波器进行观察。

    我看到你需要一些值而不是零[/报价]

    好主意、我会尝试一下。  我有一台主机可以捕获一些具体的内部变量值、 但在采样率的限制下、主机无法观察 PWM 波形、我想这些误差波形大部分都发生在 mode3和 mode4开关的位置、因此应该可以推断出对应于误差波形的 CMPB 和 CMPA 的准确值

    此致、

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

    你好,我发现了这个问题,由于 my_pwmB()函数我需要经常修改 AQCTLA 的值,但我不匹配 AQCTLA 影子寄存器的配置,寄存器 AQCTL.SHHDWAQAMODE 默认为零。 也就是说、它会立即更新、而不是在计数器为零时更新。 因此,生成的 PWM 不正确。

    此致、