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:具有独立调制功能的 EPWM1A 和 EPWM1B 不工作。

Guru**** 2439560 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1108651/tms320f28377s-epwm1a-and-epwm1b-with-independent-modulation-not-working

器件型号:TMS320F28377S

大家好

我对 ePWM 有疑问。 我想单独使用 EPWM1A 和 EPWM1B。 例如、可以激活 EPWM1A 并更改其占空比、同时将 EPWM1B 设置为低电平或高电平、而不更改其占空比。 另外一种工作方式是 EPWM1B、而 EPWM1A 则"等待"。
通过单独操作(禁用任一个)、它们均可按预期工作、具有良好的占空比和输出。 但是、只要我同时使用这两种方法、它们似乎 就会相互走在另一条路上。

我希望在 EPWM1A (顶部)和 EPWM1B (底部)输出上使用不同正弦波作为调制信号的最终信号:

 

仅仅是他们就像这样工作得很好:  

但我同时提出这些问题时,似乎有问题:  

我的代码是:  

void init_epwm1(void){

	EPwm1Regs.TBCTL.bit.FREE_SOFT  	= 0x02;				// free run

	// Setup TBCLK
	EPwm1Regs.TBPRD			    	= PWR_IN_CNT_PRD;  	// Set timer period 2500
	EPwm1Regs.TBPHS.all 			= 0;
	EPwm1Regs.TBPHS.bit.TBPHS 		= 0x0000;
	EPwm1Regs.TBCTR			    	= 0x0000;           // Clear counter

	// Set Compare values
	EPwm1Regs.CMPA.bit.CMPA			= 500;     			// Set compare A
	EPwm1Regs.CMPB.bit.CMPB 		= 1000;                // Set Compare B

	// Setup counter mode
	EPwm1Regs.TBCTL.bit.CTRMODE 	= TB_COUNT_UPDOWN; 	// Symmetrical mode
	EPwm1Regs.TBCTL.bit.PHSEN 		= TB_DISABLE;       // Master module enable phase loading
	EPwm1Regs.TBCTL.bit.PRDLD 		= TB_SHADOW;
	EPwm1Regs.TBCTL.bit.SYNCOSEL 	= TB_SYNC_DISABLE; 	// Sync A and B disable
	EPwm1Regs.TBCTL.bit.HSPCLKDIV 	= TB_DIV1;       	// Clock ratio to PWM_CLOCK_FREQ
	EPwm1Regs.TBCTL.bit.CLKDIV 		= TB_DIV1;

	// Setup shadowing
	EPwm1Regs.CMPCTL.bit.SHDWAMODE 	= CC_SHADOW;
	EPwm1Regs.CMPCTL.bit.SHDWBMODE 	= CC_SHADOW;
	EPwm1Regs.CMPCTL.bit.LOADAMODE 	= CC_CTR_ZERO; 		  // Load on Zero
	EPwm1Regs.CMPCTL.bit.LOADBMODE 	= CC_CTR_ZERO;

	// Setup Output A and B with count up and down
    EPwm1Regs.AQCTLA.bit.CAU        = AQ_SET;             // Set actions for EPWM1A
    EPwm1Regs.AQCTLA.bit.CAD        = AQ_CLEAR;
    EPwm1Regs.AQCTLB.bit.CBU        = AQ_SET;             // Set actions for EPWM1B
    EPwm1Regs.AQCTLB.bit.CBD        = AQ_CLEAR;


	EPwm1Regs.DBCTL.bit.OUT_MODE 	= DB_DISABLE; 	        //Disable Dead-band module
//	EPwm1Regs.DBCTL.bit.POLSEL 		= DB_ACTV_LO; 		    // Active Low
//  EPwm1Regs.DBFED.bit.DBFED       = PWM_DEAD_TIME_COUNT;  // 100 TBCLKs    = 1us
//  EPwm1Regs.DBRED.bit.DBRED       = PWM_DEAD_TIME_COUNT;  // 100 TBCLKs    = 1us

	//	Trip-Zone
//	EPwm1Regs.TZSEL.bit.OSHT1		= TZ_ENABLE;		    // enables TZ1 as a one-shot event source for ePWM1
	EPwm1Regs.TZCTL.bit.TZA			= TZ_FORCE_LO;		    // Force EPWMxA to a low state
	EPwm1Regs.TZCTL.bit.TZB			= TZ_FORCE_LO;		    // Force EPWMxB to a low state
	EPwm1Regs.TZFRC.bit.OST	 		= 0x1;				    // Software Force Trip Zone

}

因此、如果您对我在这里所犯的错误还有任何问题或解决方案、我会很高兴。 谢谢、祝你度过美好的一天

Daniel

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

    Daniel、您好!

    您能解释一下您的代码的其余部分是如何工作的? 您如何更改输出的占空比? 如何禁用一个而不禁用另一个? 在您所附的波形中、指明什么是通道 A 以及什么是通道 B 也很有帮助。  

    此致、

    Marlyn

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

    Daniel、您好!

    我看到您已禁用死区并通过 CMPA 和 CMPB、您的代码会禁用相位加载。 当 CMPA 处于活动状态时、CMPB 是否与 CMPA 相移180°?

    此外、如果您的目的是直流逆变器零开关 H 桥或其他一些拓扑、则最好对 MOSFET 开关启用某种死区控制。 如果 x77支持对 CMPB 死区的直接控制、则最好为互补驱动信号配置 ePWM A/B。 否则、可能会启用死区、使 CMPA 的 CMPB 反相。

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

    是的 、很抱歉我没有提到这一点。

    对于这两种情况、顶部的信号是 EPWM1A、底部的信号是信号 EPWM1B。

    对于占空比代码:现在,我在初始化中为 CMPA 和 CMPB 使用固定值,因为它不像我想要的那样工作。 如果我想在不重新加载所有内容的情况下进行测试、我有一个可更改 CMPA 和 CMPB 的变量

    但是,如果我只使用 EPWM1A,而我的代码就像这样更改占空比,那么占空比就很好了:  

        control.uf.output_gen1_positive_only = func_gen.generator_1.out*2.0;        //func_gen.generator_1.out = sin 50Hz amplitude 1 pp, *2 for the signal to be at +1 and -1.
        control.uf.output_gen2_positive_only = (-func_gen.generator_1.out*2.0);     //func_gen.generator_1.out = Inverted sin 50Hz amplitude 1 pp, *2 for the signal to be at +1 and -1.
        if(control.uf.output_gen1_positive_only<0)
        {
            control.uf.output_gen1_positive_only = 0;
        }
        if(control.uf.output_gen2_positive_only<0)
        {
            control.uf.output_gen2_positive_only = 0;
        }
        
        
        epwm.modulator_1.in_modul = control.uf.output_gen1_positive_only*control.uf.input_duty;
        epwm.modulator_2.in_modul = control.uf.output_gen2_positive_only*control.uf.input_duty;

    process_modulator(&epwm.modulator_1);
    
    void process_modulator (struct modulator_t *const modulator)
    {
    
    	Uint16	temp;
    
    	// 1 PU Limitation on input
    	LIMIT(modulator->in_modul,0.0,1.0);
    
    	// float -> pwm adaptation
    	temp = (Uint16) (modulator->in_modul*PWR_IN_CNT_PRD); //PWR_IN_CNT_PRD max value of EPWM counter, 2500
    
    	// Pulse Limiter min value
    	if (temp <= modulator->pwm_min) temp = 0;
    
    	// Pulse Limiter max value
    	if (temp >= modulator->pwm_max) temp = (PWR_IN_CNT_PRD);
    
    	// loading in compare register
    	modulator->reg_handle->CMPA.bit.CMPA  = temp;
    
    }

    就像我说过的、如果我只使用 A 或 B、这个部件就可以正常工作

    希望这对您有所帮助、如果您有其他问题、我将在这里。

    谢谢你

    Daniel

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

    是的。 我禁用了死区、因为我不希望它们相互交互、我想使用 CMPA 设置一些值、而使用 CMPB 设置另一个值。 它们应该完全独立。 (可能有一些我不理解的东西、对于死区、您可以这么做)。

    我尝试在 TBPHS 中使用一个值0来启用相位加载、但是我得到了同样的结果。

    我要做的是:

    在这里、它甚至说独立调制。 所以它应该很容易,但我可能缺少一些东西:(

    EPWMA 由 CMPA 调制、EPWMB 由 CMPB 调制。 而不会相互阻断。 这就是我想要的。

    谢谢你

    Daniel

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

    好的,对大家来说有点更新了 我在我办公室的一些人周围问这个问题、没有人知道。 但今天、项目之外的人对一些事情做了一些小的评论、与我一起寻找问题的人记得他们在一段时间前在 ePWM 的输出上安装了一个保护。 因此、基本上、如果您激活 EPWM1B、EPWM1A 将自动关闭。 这正是发生的情况。 我们纠正了这个问题、现在它工作正常。 感谢你的帮助。 我觉得愚蠢、猜有时会发生

    Daniel

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

    我找到了这个问题,但非常感谢你的发言和时间。 我将解决方案置于帖子下方。 祝你度过美好的一天

    Daniel

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

    我找到了这个问题,但非常感谢你的发言和时间。 我将 解决方案 置于帖子下方。 祝你度过美好的一天

    Daniel

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

    Daniel、您好!

    不用担心、就会发生这种情况。 感谢您解释错误和解决方案。 我很高兴您能够在您的应用程序中解决此问题。 希望您也能度过美好的一天。  

    此致、

    Marlyn

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

    Daniel、您好!

    很抱歉我们迟到了2天的暴风雨,没有网络,很多树都掉下来了。 我是指一些 TI ePWM 模块在两个 PWMA/B 输出上都不支持独立的死区、而是在 A 上添加延迟以生成 B、从而在过程中丢失发生器 B。 检查 x377 MCU 的 TRM、以查看必须如何设置这些位、从而允许两个 A/B 输出独立的死区发生器、而不仅仅是通过模式1。

    如果我正确调用、X49c MCU 死区与 ePWM 模块类型4的死区是唯一不同的。  

    此致、