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.

[参考译文] TMS320F280034:PWM 引脚在启动期间的行为

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1283765/tms320f280034-behaviour-of-pwm-pins-during-start-up

器件型号:TMS320F280034
主题中讨论的其他器件:SysConfig

尊敬的 E2E 论坛:

我们正在开发一个在280034上使用 ePWM1的应用、以驱动半桥功率级。 ePWM1H 用于驱动高侧器件、ePWM1L 驱动低侧器件。 该工程使用 SysConfig 配置 PWM 外设。

我要确保在器件上电时 PWM 输出的行为。 我认为 PWM 输出在配置为 ePWM 之前应该是高阻抗、并且我们使用了外部下拉电阻器来确保高侧和低侧 PWM 都是低电平、直到引脚作为 PWM 输出正常运行。 作为完整性检查、我们在上电期间测量了 ePWM1L 和 ePWM1H 信号、并观察到 ePWM1L 信号在正常 PWM 运行开始之前保持高电平50us。 是否有办法确保在280034上电期间 ePWM 输出始终为低电平?

下面是对启动期间行为的测量。 蓝色走线(CH3)表示为定制板供电的+5V 电压轨的上升沿。 它通过+5V 至+3V3直流/直流转换器为280034供电。 ePWM1L 是黄色迹线(CH1)、ePWM1H 是红色迹线(CH2)。 半桥的开关节点为绿色(CH4)。 PWM 在上电后几十毫秒开始。

如果我们放大前几个开关周期、我们可以看到:-

在这里、我们可以看到 ePWM1L (黄色迹线、CH1)在 PWM 开始之前保持高电平大约50us。 这在这个电路板上不是问题、因为栅极驱动器使用自举电路来生成实际的栅极驱动波形、但是我仍然认为 ePWM1L 在 PWM 运行开始前应该为低电平。

有什么想法吗?

谢谢、Iain

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

    尊敬的 Iain:

    您是否通过 GPxPUD 寄存器禁用 GPIO 上的内部上拉电阻? 如果是、您能否逐步进行 PWM 初始化、以确定在哪一行代码后 PWM 输出变为高电平? 我怀疑您可能有一个在 TBCTR=0时用于设置输出的动作限定符事件、但我假设在启用 TBCLKSYNC 之前动作限定符不会变为活动状态。 如果您能够识别哪个代码行设置输出、请告诉我。

    谢谢!

    卢克

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

    Luke、ePWM 直接在 SysConfig 中设置、因此不确定上拉值。 看看 SysConfig 生成的代码、它首先执行的是运行 PinMux 例程、该例程将设置应用引脚。 在本例中、此代码如下所示。

    	//
    	// EPWM1 -> PowerStageEPWM Pinmux
    	//
    	GPIO_setPinConfig(PowerStageEPWM_EPWMA_PIN_CONFIG);
    	GPIO_setPadConfig(PowerStageEPWM_EPWMA_GPIO, GPIO_PIN_TYPE_STD);
    	GPIO_setQualificationMode(PowerStageEPWM_EPWMA_GPIO, GPIO_QUAL_SYNC);
    
    	GPIO_setPinConfig(PowerStageEPWM_EPWMB_PIN_CONFIG);
    	GPIO_setPadConfig(PowerStageEPWM_EPWMB_GPIO, GPIO_PIN_TYPE_STD);
    	GPIO_setQualificationMode(PowerStageEPWM_EPWMB_GPIO, GPIO_QUAL_SYNC);

    我尝试了你的想法,单步执行代码,特别是执行每一个步骤在 board_init()文件中进行设置:-

    //*****************************************************************************
    //
    // Board Configurations
    // Initializes the rest of the modules. 
    // Call this function in your application if you wish to do all module 
    // initialization.
    // If you wish to not use some of the initializations, instead of the 
    // Board_init use the individual Module_inits
    //
    //*****************************************************************************
    void Board_init()
    {
    	EALLOW;
    
    	PinMux_init();
    	SYSCTL_init();
    	SYNC_init();
    	ASYSCTL_init();
    	ADC_init();
    	CMPSS_init();
    	CPUTIMER_init();
    	EPWM_init();
    	EPWMXBAR_init();
    	GPIO_init();
    	SCI_init();
    	INTERRUPT_init();
    
    	EDIS;
    }
    

    如果我通过 board_init()逐行步执行,PWM 的启动行为就很好。 这让我想到、可能我们需要在初始化后将到 PWM 外设的时钟延迟一段时间、以便为外设正确配置留出时间。 初始化之后、在启用外设时钟和行为变得好得多之前、我在 main.c 中插入了1ms 的固定延迟。 这是我添加的代码、额外一行是 DEVICE_DELAY_US (1000);它放置在 SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_TBCLKSYNC)之前

    //
        Device_init();
    
        //
        // Disable pin locks and enable internal pull-ups.
        //
        Device_initGPIO();
    
        //
        // Initialize PIE and clear PIE registers. Disables CPU interrupts.
        //
        Interrupt_initModule();
    
        //
        // Initialize the PIE vector table with pointers to the shell Interrupt
        // Service Routines (ISR).
        //
        Interrupt_initVectorTable();
    
        //
        // Configure ePWM1, ePWM2, and TZ GPIOs/Modules
        //
        Board_init();
    
        //
        // C2000Ware Library initialization
        //
        C2000Ware_libraries_init();
    
        //
        // Enable Global Interrupt (INTM) and real time interrupt (DBGM)
        //
        EINT;
        ERTM;
    
        // Enter code here
    
        //
        // Delay to allow system to initialise
        //
        DEVICE_DELAY_US(1000);
        //
        // Enable sync and clock to PWM
        //
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);

    现在的启动行为要好得多、请参阅下面的示波器图。 这里、黄色迹线表示开关节点电压、红色迹线表示电感负载电流。 现在、PWM 执行将在 ePWM1L 输出首先保持高电平50us 的情况下开始。

    在启用外设时钟之前、是否有更好的方法来确定在外设配置之后我应该等待多长时间?

    非常感谢、Iain

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

    您好、

    很高兴您能够找到此问题的解决方法。 这是我第一次看到此行为、但建议在 HRPWM 初始化后延迟:

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1264545/tms320f280025c-why-is-delay-required-in-hrcap-initialization-sequence/4799638?tisearch=e2e-sitesearch&keymatch=epwm%252520delay%252520after%252520initialization#4799638

    我会咨询其他 ePWM 专家、看看他们是否熟悉这种行为。

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

    尊敬的 Iain:

    您是否可以在调用 board_init 之前尝试禁用 TBCLKSYNC? 在这之后,是否仍有必要延迟?

    谢谢!

    卢克