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.

[参考译文] BOOSTXL-DRV8305EVM:3PWM 模式

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

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1522871/boostxl-drv8305evm-3pwm-mode

器件型号:BOOSTXL-DRV8305EVM

工具/软件:

您好团队:  
我们将 LAUNCHXL-F28379D 和 BOOSTXL-DRV8305EVM 连接。
我们使用命令(0x3896)写入0x7、以便将 DRV 配置为3PWM 模式。
为了确认此配置、我们读回此地址并在 SPI 上获得0x0096。

现在...
在3PWM 模式下、DRV8305EVM 在内部生成互补的低侧信号。
但是、当我们在 LAUNCHXL-F28379D 的 GPIO0 (EPWM1A) 上提供 EPWM 信号时、我们在 GPIO1 (EPWM1A)上没有获得任何互补的 EPWM 信号。  





怀疑:-是写入0x7的值是否已真正配置。

请说明我们是否缺少任何其他步骤来使 DRV 正常工作。

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

    您好团队、

    我的测试用例是将 ePWM1配置为通道 EPWM1A (GPIO0)、与 DRV8305EVM 连接并观察 EPWM1B (GPIO1)上生成的互补 PWM 信号。

    我面临的问题是、我在 EPWM1B (GPIO1)上未观察到任何互补波形

    这是我的代码  

    //
    // Included Files
    //
    #include "F28x_Project.h"
    #include "driverlib.h"
    #include "device.h"
    
    #define PWM_PERIOD 1250    // Define the period for PWM
    #define ADC_MAX 4095.0     // Assuming 12-bit ADC (0 to 4095)
    
    uint16_t txData = 0x3896;
    volatile uint16_t rxData;
    volatile uint16_t rxData1;
    volatile uint16_t rxData2;
    
    void InitEPwm1(void);
    void InitEPwm1gpio(void);
    
    void Init_DRV8305_EN_GATE_WAKE(void);    // Wake and enable driver
    void InitSPIAGPIO(void);                 // SPIA GPIO + unlock + CPU1 select
    void InitSPIA(void);                     // SPIA peripheral
    
    void dummy(void); // Used in debugging (to confirm that We are not getting corrupt data) 
    
    
    
    
    // =======================
    // MAIN FUNCTION
    // =======================
    void main(void)
    {
        // Step 1: Initialize System
        InitSysCtrl();
    
        //Step2: GPIO configuration
        
    
        InitEPwm1();
        InitEPwm1gpio();
        Init_DRV8305_EN_GATE_WAKE();    // Wake and enable driver
        InitSPIAGPIO();                 // SPIA GPIO + unlock + CPU1 select
        InitSPIA();                     // SPIA peripheral
        DELAY_US(2000);                 // Wait for DRV8305 ready
        
        while (1)
        {
             // Send data
            SPI_writeDataBlockingNonFIFO(SPIA_BASE, txData);
            // Read received data
            rxData = SPI_readDataBlockingNonFIFO(SPIA_BASE);
    
    
             // Send data
            SPI_writeDataBlockingNonFIFO(SPIA_BASE, 0xB800);
            // Read received data
            rxData1 = SPI_readDataBlockingNonFIFO(SPIA_BASE); 
    
             if(rxData1 != 0x0096)
            {
                dummy();
            }
    
        }
    }
    
    // =======================
    // Initialize ePWM1
    // =======================
    
    void InitEPwm1(void)
    {
        EALLOW;
        CpuSysRegs.PCLKCR2.bit.EPWM1 = 1;
        EDIS;
    
        EPwm1Regs.TBCTL.bit.CTRMODE = 2;  // Up-Down count mode for center-aligned PWM
        EPwm1Regs.TBPRD = PWM_PERIOD;     // Set period
        EPwm1Regs.TBCTL.bit.PHSEN = 0;    // Disable phase loading
        EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; // Divider value for ePWM clock divides by .. /1
        EPwm1Regs.TBCTL.bit.CLKDIV = 0; // Divider value for ePWM clock divides by .. /1
    
        EPwm1Regs.CMPA.bit.CMPA = PWM_PERIOD / 4; // Initial duty cycle 50%
        
        //EPWM1A
        EPwm1Regs.AQCTLA.bit.CAU = 2;  // Set PWM1A on counter up
        EPwm1Regs.AQCTLA.bit.CAD = 1;  // Clear PWM1A on counter down
    
        // EPWM1B:(complement of A)
        // EPwm1Regs.AQCTLB.bit.CAU = 1;  // Clear
        // EPwm1Regs.AQCTLB.bit.CAD = 2;  // Set
    }
    
    // =======================
    // Initialize ePWM1
    // =======================
    
    void InitEPwm1gpio(void)
    {
        EALLOW;
        //  GPIO0 configuration for  Output ePWM1A
        GpioCtrlRegs.GPALOCK.bit.GPIO0 = 0; //Unlock GPIO configuration registers for PORT C
        GpioCtrlRegs.GPAGMUX1.bit.GPIO0 = 0 ; // GPIOC MUX for making pin 0 to function as EPWM1A (O)
        GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1 ; // GPIOC MUX for making pin 0 to function as EPWM1A (O)
        GpioCtrlRegs.GPACSEL1.bit.GPIO0 = 0 ;// Select CPU1 as MASTER CORE
        GpioCtrlRegs.GPADIR.bit.GPIO0 = 1 ; // Set GPIO 0 Direction AS OUTPUT
    
        //  GPIO1 configuration for  Output ePWM1B
        GpioCtrlRegs.GPALOCK.bit.GPIO1 = 0; //Unlock GPIO configuration registers for PORT C
        GpioCtrlRegs.GPAGMUX1.bit.GPIO1 = 0 ; // GPIOC MUX for making pin 0 to function as EPWM1A (O)
        GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1 ; // GPIOC MUX for making pin 0 to function as EPWM1A (O)
        GpioCtrlRegs.GPACSEL1.bit.GPIO1 = 0 ;// Select CPU1 as MASTER CORE
        GpioCtrlRegs.GPADIR.bit.GPIO1 = 1 ; // Set GPIO 0 Direction AS OUTPUT
    
         EDIS;
    }
    
    
    // =======================
    // ENABLE DRV8305 VIA GPIO
    // =======================
    
    void Init_DRV8305_EN_GATE_WAKE()
    {
        EALLOW;
    
        // GPIO124 (EN_GATE)
        GpioCtrlRegs.GPDLOCK.bit.GPIO124 = 0; // Unlock config
        GpioCtrlRegs.GPDCSEL4.bit.GPIO124 = 0; // CPU1 owns pin
    
        GpioCtrlRegs.GPDGMUX2.bit.GPIO124 = 0;
        GpioCtrlRegs.GPDMUX2.bit.GPIO124 = 0;
        GpioCtrlRegs.GPDDIR.bit.GPIO124  = 1;
        GpioDataRegs.GPDSET.bit.GPIO124  = 1;
    
        //  GPIO125 (WAKE)
        GpioCtrlRegs.GPDLOCK.bit.GPIO125 = 0; // Unlock config
        GpioCtrlRegs.GPDCSEL4.bit.GPIO125 = 0; // CPU1 owns pin
    
        GpioCtrlRegs.GPDGMUX2.bit.GPIO125 = 0;
        GpioCtrlRegs.GPDMUX2.bit.GPIO125 = 0;
        GpioCtrlRegs.GPDDIR.bit.GPIO125  = 1;
        GpioDataRegs.GPDSET.bit.GPIO125  = 1;
    
        EDIS;
    
        DEVICE_DELAY_US(30000); // SPI input data hold time delay
    }
    
    // =======================
    // SPIA GPIO CONFIGURATION
    // =======================
    void InitSPIAGPIO()
    {
        EALLOW;
    
        // Unlock and assign ownership to CPU1 for GPIO58–61
        GpioCtrlRegs.GPBLOCK.bit.GPIO58 = 0;
        GpioCtrlRegs.GPBCSEL4.bit.GPIO58 = 0; //CPU1 MASTER CORE
    
        GpioCtrlRegs.GPBLOCK.bit.GPIO59 = 0;
        GpioCtrlRegs.GPBCSEL4.bit.GPIO59 = 0; //CPU1 MASTER CORE
     
        GpioCtrlRegs.GPBLOCK.bit.GPIO60 = 0;
        GpioCtrlRegs.GPBCSEL4.bit.GPIO60 = 0; //CPU1 MASTER CORE
    
        GpioCtrlRegs.GPBLOCK.bit.GPIO61 = 0;
        GpioCtrlRegs.GPBCSEL4.bit.GPIO61 = 0; //CPU1 MASTER CORE
    
        // Configure MUX and GMUX for SPIA
        GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3; // SPISIMO-A
        GpioCtrlRegs.GPBMUX2.bit.GPIO58  = 3;
    
        GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3; // SPISOMI-A
        GpioCtrlRegs.GPBMUX2.bit.GPIO59  = 3;
    
        GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3; // SPICLK-A
        GpioCtrlRegs.GPBMUX2.bit.GPIO60  = 3;
    
        GpioCtrlRegs.GPBGMUX2.bit.GPIO61 = 3; // SPISTE-A
        GpioCtrlRegs.GPBMUX2.bit.GPIO61  = 3;
    
        // Async qualification
       // GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3;
        GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3;
       // GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3;
       // GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3;
    
        // Direction
        GpioCtrlRegs.GPBDIR.bit.GPIO58 = 1; // output
        GpioCtrlRegs.GPBDIR.bit.GPIO59 = 0; // input
        GpioCtrlRegs.GPBDIR.bit.GPIO60 = 1; // output
        GpioCtrlRegs.GPBDIR.bit.GPIO61 = 1; // output
    
        GpioDataRegs.GPBSET.bit.GPIO61 = 1; // output
    
        EDIS;
    }
    
    // =======================
    // SPIA MODULE SETUP
    // =======================
    void InitSPIA()
    {
        EALLOW;
        CpuSysRegs.PCLKCR8.bit.SPI_A = 1;
        SpiaRegs.SPICCR.bit.SPISWRESET = 0;
    
        SpiaRegs.SPICCR.all = 0x000F;              // 16-bit char
        SpiaRegs.SPICTL.all = 0x0007;              // Master mode, clock phase = 1
        SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;   //clock polarity = 0
        SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 49;     // 1 MHz SPI
    
        SpiaRegs.SPICCR.bit.SPISWRESET = 1;
        SpiaRegs.SPIPRI.bit.FREE = 1;
        EDIS;
    }
    
    // Used in debugging (to confirm that We are not getting corrupt data) 
    void dummy (void)
    {
        
    }
    
    //
    // End of File
    //


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

    嗨、团队
    当我们在 MOSFET 端子(MOSFET - Q4、引脚4)上探测时、我们得到了互补的 EPWM 信号。
    但我们可以观察到 EPWM1A 和 EPWM1B 之间的波形中的击穿(当 EPWM1变为高电平时)。



    等待团队的回应……

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

    尊敬的 Vibhav:

    我不确定您的问题是由什么引起的、MCU 的 PWM 输出是所需的输出吗? 您认为击穿对驱动器的输出意味着什么?

    此致、

    Yara

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

    TI LAUNCHXL-F28379D 参考手册中明确提到、互补的低侧信号是在内部生成的、并且可以通过 SPI 寄存器中的内部设置(DEAD_TIME)来调整死区时间。

    这证实了击穿是从驱动器侧引入的

    因此、当我们写入0x3896时、我们配置此地址处的剩余两个字段为默认值。
    1) PWM_MODE = b'01 (对于具有3个独立输入的 PWM)位于 地址0x7。
    2) COMM_OPTIONS = b'0 (用于二极管续流)
    此地址的其余字段为默认字段。 (DEAD_TIME = 52ns、这是默认设置)


    在这种配置下、  EPWM1A 和 EPWM1B 之间会出现击穿(当 EPWM1变为高电平时)、具体如下所示的波形所示。





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

    请判断我是否缺少 其他控制寄存器中的任何配置。

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

    尊敬的 Vibhav:

    当你说的时候,我不是完全理解的  

    在这种配置下、  在下面显示的波形中可以在 EPWM1A 和 EPWM1B 之间看到击穿(当 EPWM1变为高电平时)。

    您能告诉我 EPWM1A、B 和1是什么吗? 这些信号是否来自 MCU 正确? 您是否有器件输出的波形? 这将告诉我们是否存在击穿事件。

    这些问题似乎是由 MCU 引起的、而不是由 驱动器本身引起的。 您是否有机会查看此 E2E 中链接的固件:

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1102004/drv8305-spi-interface

    此致、

    Yara