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.

[参考译文] TMS320F28377S:连接外部同步信号为什么会导致 ePWM 输出错误?

Guru**** 2398695 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1238766/tms320f28377s-why-does-connecting-external-synchronization-signal-cause-epwm-output-error

器件型号:TMS320F28377S

void ConfigEpwm(void)
{
#ifdef CODE_MASTER
    EALLOW;
    SyncSocRegs.SYNCSELECT.bit.SYNCOUT = 0x2; //select epwm7 sync signal to syncout
    //config gpio24 for output xbar1
    GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 1;//mux: output xbar1
    GpioCtrlRegs.GPAPUD.bit.GPIO24 = 1; //disable pull-up
    GpioCtrlRegs.GPADIR.bit.GPIO24 = 1;//output

    //config gpio25 for output xbar2
    GpioCtrlRegs.GPAPUD.bit.GPIO25 = 1; //disable pull-up
    GpioCtrlRegs.GPADIR.bit.GPIO25 = 1;//output
    GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 1;//mux: output xbar2


    //config output xbar1 for external sync out
    OutputXbarRegs.OUTPUT1MUX0TO15CFG.bit.MUX14 = 0x3; //select external sync out
    OutputXbarRegs.OUTPUT1MUXENABLE.bit.MUX14 = 0x1; //enable xbar mux
    //config output xbar2 for external sync out
    OutputXbarRegs.OUTPUT2MUX0TO15CFG.bit.MUX14 = 0x3; //select external sync out
    OutputXbarRegs.OUTPUT2MUXENABLE.bit.MUX14 = 0x1; //enable xbar mux
    EDIS;
#endif
#ifdef CODE_SLAVE
    EALLOW;
    //Config Gpio23 for syncin
    GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO23 = 0; // gpio input
    GpioCtrlRegs.GPAPUD.bit.GPIO23 = 1; //disable pull-up
    GpioCtrlRegs.GPAQSEL2.bit.GPIO23 = 0; //sync input mode
    //config input xbar5 to link gpio23 and EXTSYNCIN1
    InputXbarRegs.INPUT5SELECT = 23;//select gpio 23
    //select external sync for epwm7
    SyncSocRegs.SYNCSELECT.bit.EPWM7SYNCIN = 0x5; //select EXTSYNCIN1
    EDIS;
#endif
    InitEPwm7Gpio();
    InitEPwm8Gpio();

    //pro3
    EALLOW;
    //Config Gpio42 PRO3 for ~TZ1
    GpioCtrlRegs.GPBMUX1.bit.GPIO42 = 0;
    GpioCtrlRegs.GPBDIR.bit.GPIO42 = 0; // gpio input
    GpioCtrlRegs.GPBPUD.bit.GPIO42 = 1; //disable pull-up
    GpioCtrlRegs.GPBQSEL1.bit.GPIO42 = 3; //async input mode
    //input xbar
    InputXbarRegs.INPUT1SELECT = 42;//select gpio 42
    EDIS;

    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;//turn off epwm clk,turn on after config

    // Setup TBCLK
   

    EPwm7Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count upDOWM
    EPwm7Regs.TBPRD = TIMER_TBPRD;                 // Set timer period
#ifdef CODE_MASTER
    EPwm7Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable phase loading
#endif
#ifdef CODE_SLAVE
    EPwm7Regs.TBCTL.bit.PHSEN = TB_ENABLE;        // Enable phase loading
    EPwm7Regs.TBCTL.bit.PHSDIR = 1;               //count up after sync
#endif
    EPwm7Regs.TBPHS.bit.TBPHS = 0x0000;            // Phase is 0
    EPwm7Regs.TBCTR = 0x0000;                      // Clear counter
    EPwm7Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // Clock ratio to SYSCLKOUT
    EPwm7Regs.TBCTL.bit.CLKDIV = TB_DIV2;
    EPwm7Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;

    EPwm8Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count upDOWM
    EPwm8Regs.TBPRD = TIMER_TBPRD;                 // Set timer period
    EPwm8Regs.TBCTL.bit.PHSEN = TB_ENABLE;        // Enable phase loading
    EPwm8Regs.TBPHS.bit.TBPHS = 1180;            // Phase is 170 , under initial condition
    EPwm8Regs.TBCTL.bit.PHSDIR = 0;               //count down after sync
    EPwm8Regs.TBCTR = 0x0000;                      // Clear counter
    EPwm8Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // Clock ratio to SYSCLKOUT
    EPwm8Regs.TBCTL.bit.CLKDIV = TB_DIV2;
//  EPwm8Regs.TBCTL.bit.SYNCOSEL=TB_CTR_ZERO;

    // Setup shadow register load on ZERO

    EPwm7Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
    EPwm7Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    EPwm7Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    EPwm7Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

    EPwm8Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
    EPwm8Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    EPwm8Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    EPwm8Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

    // Set Compare values

    EPwm7Regs.CMPA.bit.CMPA = CMPANUM;      // Set compare A value
    EPwm7Regs.CMPB.bit.CMPB = CMPBNUM;      // Set Compare B value

    EPwm8Regs.CMPA.bit.CMPA = CMPANUM;      // Set compare A value
    EPwm8Regs.CMPB.bit.CMPB = CMPBNUM;      // Set Compare B value

    // Set actions

    EPwm7Regs.AQCTLA.bit.CAU = AQ_CLEAR;            // Clear PWM2A on Period
    EPwm7Regs.AQCTLA.bit.CAD = AQ_SET;              // Set PWM2A on event A,
                                                    // up count
    EPwm7Regs.AQCTLB.bit.CAU = AQ_CLEAR;            // Clear PWM2B on Period
    EPwm7Regs.AQCTLB.bit.CAD = AQ_SET;              // Set PWM2B on event B                                            // up count

    EPwm8Regs.AQCTLA.bit.CAU = AQ_CLEAR;            // Clear PWM2A on Period
    EPwm8Regs.AQCTLA.bit.CAD = AQ_SET;              // Set PWM2A on event A,
                                                    // up count
    EPwm8Regs.AQCTLB.bit.CAU = AQ_CLEAR;            // Clear PWM2B on Period
    EPwm8Regs.AQCTLB.bit.CAD = AQ_SET;              // Set PWM2B on event B,                                                  // up count

    // Active Low complementary PWMs - setup the deadband
    EPwm7Regs.DBCTL.bit.IN_MODE = DBA_ALL;   //A:UP EDGE;B:FALL EDGE DBA_RED_DBB_FED
    EPwm7Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;  //11:TOTAL ENABLE;00:DISABLE
    EPwm7Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;      //10:only B invert
    EPwm7Regs.DBRED.bit.DBRED = DB_DURATION;     //UP DELAY
    EPwm7Regs.DBFED.bit.DBFED = DB_DURATION;     //FALL DELAY

    EPwm8Regs.DBCTL.bit.IN_MODE = DBA_ALL;
    EPwm8Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
    EPwm8Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
    EPwm8Regs.DBRED.bit.DBRED = DB_DURATION;
    EPwm8Regs.DBFED.bit.DBFED = DB_DURATION;
    EPwm8Regs.DBCTL.bit.OUTSWAP = 3;

    //ADC trig setting
    EPwm7Regs.ETSEL.bit.SOCASEL = ET_CTR_PRDZERO;      //SOC event choose
    EPwm7Regs.ETSEL.bit.SOCAEN = 1;                  //enable SOCA
    EPwm7Regs.ETPS.bit.SOCAPRD = 1;                  //1-3times trig ADC

    //TZ SETTING

    EPwm7Regs.TZSEL.bit.CBC1 = 1;//select TZ1 cbc
    EPwm7Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
    EPwm7Regs.TZCTL.bit.TZB = TZ_FORCE_LO;
    EPwm7Regs.TZCLR.bit.CBCPULSE = 0; //cbc clear when CTR = 0
    //EPwm7Regs.TZCLR.bit.OST = 1;
    EPwm7Regs.TZFRC.bit.OST = 1;

    EPwm8Regs.TZSEL.bit.CBC1 = 1;//select TZ1 cbc
    EPwm8Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
    EPwm8Regs.TZCTL.bit.TZB = TZ_FORCE_LO;
    EPwm8Regs.TZCLR.bit.CBCPULSE = 0; //cbc clear when CTR = 0
    //EPwm8Regs.TZCLR.bit.OST = 1;
    EPwm8Regs.TZFRC.bit.OST = 1;
    EDIS;

    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    EDIS;
}

您好!

我想使用两个独立的 DSP 作为从设备、并使用另一个 DSP 作为主机、以便在主机和两个从设备之间实现外部信号同步。 但是当连接了外部同步信号时、从机的 ePWM 信号输出是互补的、不连接同步信号是正常的、下面 是我的测试波形和代码。

是否有人可以告诉我如何操作?

非常感谢。