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.

TMS320F28379S: 全局装载(global load)漏装某些寄存器的值

Part Number: TMS320F28379S

本设计使用了四个EPWM模块(EPWM1\EPWM2\EPWM4\EPWM6),其中EPWM1不使用其输出的PWM波形,只是作为EPWM2\4\6的时基信号,其中EPWM2\4\6配置使用了global load,并利用EPWMXLINK将EPWM4\6都链接到了EPWM2的global load装载上。但实际应用中发现会在几个周期内出现某一次漏装载现象。

从下图可看到漏装载的是周期值(但我代码里周期值和计数器值都是计算完一起全局装载的),它会在数个50Hz周期内偶然出现一次漏装载现象(计数器装载了,但周期值却没装进去),全局装载并没有很完美的工作

以下两图是其它周期的正常装载现象

  • 它会在数个50Hz周期内偶然出现一次漏装载现象

    这个50Hz是指什么呀?

  • Li工您好,50Hz是我从0-2pi所有控制周期完成的值,其中控制周期为10微秒(而所有global load使能的寄存器也是10微秒全部装载一次)

  • 这个问题的复现几率如何?

  • 大概是每5-8个50Hz周期,其中一个周期内的某一个10微秒控制周期会出现一次漏装载现象,经检查无规律,所以认为不是代码问题,百思不得其解,很困扰

  • 因为我电感非常小(几μH级),所以一个10微秒的漏装载导致的误发波会出现非常大的电流尖峰

  • 我想确定一下的是,在几个片子上遇到了这个问题。如果是成批量出现的,我会去问一下相关的工程师。另外你的器件是在哪里买的?

  • 呃两个片子都出现了同样的情况,因为我是高校研究人员不是企业,所以没有批量化测试的条件。器件是在TI官网上买的,两年前买的芯片了

  • 能否再进一步说明一下,你的PWM的周期大概是多少?配置的是在什么时刻进行全局装载?

    其中EPWM1不使用其输出的PWM波形,只是作为EPWM2\4\6的时基信号

    这个能否再解释一下?你的意思是不是EPWM2\4\6是以EPWM1为基准进行同步移相的?

  • PWM周期最低也是100kHz以上,控制的话是配置的10微秒的中断控制,在中断服务函数的最后(所有寄存器值已经全部重新更新了):

    配置代码:

    EALLOW;
    EPwm2Regs.GLDCTL2.bit.OSHTLD=1;
    EDIS;

    这就意味着EPWM2\4\6全部都一次性装载完了

  • EPWM2、4、6仅仅与EPWM1的时间基准保持同步,

    EPWM1时间基准代码: EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;

    EPWM2\4\6时间基准代码:

        EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;

        EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;

        EPwm6Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;

    没有使用移相模块

  • 方便把相关的代码发上来吗?

  • Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    void InitEPwm1Example()
    {
    EPwm1Regs.TBPRD = 1000; // Set timer period
    EPwm1Regs.TBPHS.bit.TBPHS = 0x0000; // Phase is 0
    EPwm1Regs.TBCTR = 0x0000; // Clear counter
    //
    // Setup TBCLK
    //
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // Count up
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading
    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
    EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // Load registers every ZERO
    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_PRD;
    EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; // Load registers every ZERO
    EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_PRD;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  • 这是EPWM配置的代码

  • Fullscreen
    1
    2
    3
    4
    5
    EALLOW;
    EPwm2Regs.GLDCTL2.bit.OSHTLD=1;
    // EPwm4Regs.GLDCTL2.bit.OSHTLD=1;
    // EPwm6Regs.GLDCTL2.bit.OSHTLD=1;
    EDIS;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    这是global load全局装载的代码,在所有受影响的EPWM寄存器赋值完的最后执行

  • 1. EPWM1的时间基准功能其实有些多次一举。正如我之前所说,在初始化EPWM之前关闭EPWM外设时钟,初始化之后再使能,就能实现你想要的效果。

    2. 就算EPWM2\4\6要按你设计的方式以EPWM1为基准,也应该使能移相:

    Fullscreen
    1
    EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    spruhx5g_TMS320F2837xS Microcontrollers Technical Reference Manual (Rev. G) P1747

  • 好的谢谢您,我试试,看看实验效果

  • 不客气。之前的图片应该是上传失败了,我又重新上传了一下。