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.

[参考译文] TMS320F2.8027万:TMS320F2.8027万

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/574874/tms320f28027-tms320f28027

部件号:TMS320F2.8027万

尊敬的各位:

我正在研究TMS320F2.8027万,我正在尝试将PWM输出与模拟比较器信号同步。 为了实现这一点,我正在创建一个事件信号(DCAEVT1),用于低级别和高级别的比较器,并进行一个tripzone中断。

当控制器接收到SWFSYNC信号时,PWM模块应将0 (零)作为相位值加载,并将加载带零的PWM计数器寄存器。 因此,PWM将重新启动。

我在这一步中有两个问题;

第一个是:不能设置SWFSYN寄存器1。 它是零。 因此,我无法获得同步信号。

第二个是;当我将PHSEN位设置为1 (位于PWM寄存器,TBCTL寄存器中)时,PWM输出始终为高。 我可以观察到高水平输出。它永远不会下降。

此致,

Fahri

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好;
    对于同一问题;
    当我使用直接访问寄存器时,PWM不会改变极性,它总是高的。
    当我更换IT软件驱动器代码时,代码管理从相位寄存器加载计数器,但我仍然没有来自PWM的稳定输出。 它仍在高水平上锁定。

    我的寄存器值;
    PHSEN:1 (发生同步脉冲时,来自相位调节器的负载计数器)
    PHSDIR:1 (同步后计数)
    SYNCOSEL :0 (EPWMxSYNC)
    SWFSYNC:1 (启用)
    CTRMODE:2 (向上-向下计数)
    TBPHS:0 (相位值)
    PWM频率:20kHz

    我需要立即帮助。

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

    Fahri

    您是否正在检查设备空闲或停机时的跳闸行为?

    您能否描述如何配置Action-Qualifier和TRIP-Zone模块?

    汤米

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

    您好,Tommy

    感谢您的关注。

    模拟比较器连接到tripzone子模块。 Analag comp的输入为sin波,反相输入连接到DAC。 当comp.为high (高),TZ interrupt occures (TZ中断八次)和in interrupt (中断)时,它正在计算比较器的低级时间。 之后,它将自己设置为比较器低级别中断以获得相同级别的中断onec。

    在检查自由运行时,我观察到PWM不会改变极性。 它总是很高。

    如果我用断点检查它,有时它会变低。

    这是我的PWM配置

    void InitEPwm1Example()
    	{
    
    	clk_enablePwmClock (myClk,PWM_Number_1);
    
    	//设置TBCLK
    	//PWM_setPeriod (myPwm1,EPWM1_TIMER_TBPRD);//设置计时器周期801 TBCLK
    	EPwm1Regs.TBPRD=2500;		//设置初始PWM频率20kHz
    	//PWM_setPhase (myPwm1,0x0000); //相位为0
    	EPwm1Regs.TBPHS.Half. TBPHS=0;				//phase reg为0
    	//PWM_setCount (myPwm1,0x0000); //清除计数器
    	EPwm1Regs.TBCTR = 0; //重置PWM计数器
    
    	//PWM_setCmpA (myPwm11250);//%50占空比olacak şekilde ayarlandı。
    	//PWM_setCmpB (myPwm11250);//%50占空比olacak şekilde ayarlandı。
    	EPwm1Regs.CMPA.Half.CMPA = 1250;
    	EPwm1Regs.CMPB=1250;
    
    	//设置计数器模式
    	PWM_setCounterMode (myPwm1,PWM_CounterMode_UpDown);//向上和向下计数
    	//PWM_DisableCounterLoad (myPwm1); //禁用相位加载
    	//启用相位加载
    	EPwm1Regs.TBCTL.bit.PHSEN=1;		//当EPWMSYNI输入出现PHSEN 1 yapınca PWM çalışmıyor时,加载TBC并进行相位调节。
    	EPwm1Regs.TBCTL.bit.PHSDIR=1;		//设置为相位寄存器负载计数器时的起始计数
    	EPwm1Regs.TBCTL.bit.SYNCOsel=TB_SYNC_IN;
    
    	PWM_setHighSpeedClkDiv (myPwm1,PWM_HspClkDiv);//与SYSCLKOUT的时钟比率
    	PWM_setClkDiv (myPwm1,PWM_ClkDiv);
    
    	//设置重影,重影允许寄存器更新与硬件同步,重影寄存器为活动寄存器提供临时保留位置
    	PWM_setShadowMode_CmpA (myPwm1,PWM_ShadowMode_Shadow);		//启用阴影模式
    	PWM_setShadowMode_CMBB (myPwm1,PWM_ShadowMode_Shadow);
    	PWM_setLoadMode_CmpA (myPwm1,PWM_LoadMode_Zero);			//在TBCTR =0时加载CMP
    	PWM_setLoadMode_CMBB (myPwm1,PWM_LoadMode_Zero);
    
    	//设置操作
    	PWM_setActionQual_CntUp_CmpA_PwmA (myPwm1,PWM_ActionQual_Set); //在事件A上设置PWM1A,运行计数
    	PWM_setActionQual_CntDown_CmpA_PwmA (myPwm1,PWM_ActionQual_clear);//清除事件A上的PWM1A,停机计数
    
    	PWM_setActionQual_CntUp_CmpA_PwmB (myPwm1,PWM_ActionQual_Clear); //清除事件B上的PWM1B,运行计数
    	PWM_setActionQual_CntDown_CmpA_PwmB (myPwm1,PWM_ActionQual_set);//在事件B上设置PWM1B,停机计数
    
    	/CmpA ve CMBB birinin tersi olması için "cleal" ve "set" flagleri yer değiştirildi (CMPB'dieki değiştirildi)
    
    	//有源高互补PWM -设置死区
    	PWM_setDeadBandOutputMode (myPwm1,PWM_DeadBandOutputMode_EPWMxA_Rising _EPWMxB_Falling);
    	PWM_setDeadBandPolarity (myPwm1,PWM_DeadBandPolarity_EPWMxB_Invered);
    	PWM_setDeadBandInputMode (myPwm1,PWM_DeadBandInputMode_EPWMxA_Rising and Falling);
    	//PWM_setDeadBandRisingEdgeDelay (myPwm1250);//red=2.5us (250)
    	//PWM_setDeadBandFallingEdgeDelay (myPwm1250);//fed=2.5us (250)
    	EPwm1Regs.DBRED=0;
    	EPwm1Regs.DBFED=0;
    
    	//启用DCAEVT1和DCBEVT1是一个触发跳闸源
    	//PWM_enableTripZoneSrc (myPwm1,PWM_TripZoneSrc_OneShot_CmpA);
    	//PWM_enableTripZoneSrc (myPwm1,PWM_TripZoneSrc_OneShot_CMBB);
    
    	//我们希望DCAEVT1和DCBEVT1事件做什么?
    	// DCAEVTx事件可以强制EPWMxA
    	// DCBEVTx事件可以强制EPWMxB
    	PWM_setTripZoneState_TZA(myPwm1, PWM_TripZoneState_DoNoth);// EPWM1A将不执行任何操作
    	PWM_setTripZoneState_TZB (myPwm1,PWM_TripZoneState_DoNothing);// EPWM1B不执行任何操作
    
    	//启用TZ中断
    	PWM_enableTripZoneInt(myPwm1, PWM_TripZoneFlag_OST);
    
    	//中断我们将更改比较值的位置
    	PWM_setIntMode (myPwm1,PWM_IntMode_CounterEqualZero);//在零事件中选择INT
    	PWM_enableInt (myPwm1); //启用INT
    	PWM_setIntPeriod (myPwm1,PWM_IntPeriod_ThirdEvent); //在第三个事件上生成INT
    
    	//此示例用于跟踪的信息
    	// CMPA/CMPB值的方向
    	//移动,最小和最大允许值和
    	//指向正确ePWM寄存器的指针
    	epwm1_info.ePWM_CMPA_direction = ePWM_CMP_UP;//通过增加CMPA &开始
    	epwm1_info.ePWM_CMPb_direction = ePWM_CMP_down;//正在降低CMPB
    	epwm1_info.epwmTimerIntCount =0; //将中断计数器归零
    	epwm1_info.myPwmHandle = myPwm1; //设置指向ePWM模块
    
    	的指针}
    

    和tripzone配置

    EALLOW;
    EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = DC_COMP2OUT;// DCAH =比较器2输出
    EPwm1Regs.DCTRIPSEL.bit.DCALCOMPSEL = DC_TZ2; // DCAL = TZ2
    EPwm1Regs.TZDCSEL.bit.DCAEVT1 = TZ_DCAH_HI;//为比较器生成用于初始化的高事件
    EPwm1Regs.DCACTL.bit.EVT1SRCSEL = DC_EVT1;//未过滤信号
    EPwm1Regs.DCACTL.bit.EVT1FRCSYNCSEL = DC_EVT_Async;
    EPwm1Regs.TZsel.bit.DCAEVT1 = 1;
    //EPwm1Regs.TZsel.bit.DCBEVT1 = 1;
    EDIS; 

    这是我在中断的情况下所做的

    中断无效epwm1_tzint_isr (void)
    	{
    
    	//gpio_toggle (myGpio,gpio_number_6);
    	/* EALLOW;
    	GpioDataRegs.GPASET.bit.GPIO28=0;//设置为高
    	EDIS;*/
    	//清除标记-我们将继续采取行动
    	//此中断,直到TZ引脚变高
    
    /* 	EALLOW;
    	CpuTimer0Regs.tcr.bit.ts = 1;//停止计时器
    	EDIS;
    */
    	//###########################################
    	//#### 调整Tripzone中断条件
    	//###########################################
    	IF (EPwm1Regs.TZDCSEL.bit.DCAEVT1=2)
    		{
    		EALLOW;
    		EPwm1Regs.TZDCSEL.bit.DCAEVT1 = 1;
    	//GpioDataRegs.GPASET.bit.GPIO6=1;//设置高
    		//t1=timer_getCount (myTimer);
    		t2=6.5535万 CpuTimer0Regs.TIM.all;
    		CpuTimer0Regs.tcr.bit.trb = 1;//计时器重新加载
    		EDIS;
    		}
    	否则,如果(EPwm1Regs.TZDCSEL.bit.DCAEVT1=1)
    		{
    		EALLOW;
    		EPwm1Regs.TZDCSEL.bit.DCAEVT1 = 2;
    	//GpioDataRegs.GPACLEAR.bit.GPIO6=1;//设置为低
    	//t2=timer_getCount (myTimer);
    	t1=6.5535万-CpuTimer0Regs.TIM.all;
    	CpuTimer0Regs.tcr.bit.trb =1;//计时器重新加载
    		EDIS;
    		}
    
    	//数字PLL için (bu kısım incelenecek)
    	tpwm=(T1+T2)>1;
    	//EPwm1Regs.TBPRD=tpwm;		//更新PWM频率
    	//EPwm1Regs.TBCTL.bit.PRDLD=1;
    	EPwm1Regs.TBCTL.bit.SWFSYNC=1;
    	ASM (" NOP");
    	ASM (" NOP");
    	ASM (" NOP");
    	ASM (" NOP");
    	ASM (" NOP");
    	ASM (" NOP");
    	ASM (" NOP");
    	ASM (" NOP");
    	ASM (" NOP");
    	ASM (" NOP");
    	ASM (" NOP");
    	ASM (" NOP");
    	//PWM_forceSync (myPwm1);
    
    		n[EPwm1TZIntCount]= EPwm1Regs.TBSTS.all;
    	EPwm1TZIntCount++;
    	IF (EPwm1TZIntCount=150)
    	{
    		EPwm1TZIntCount = 0;
    	} 

    我可以看到SWFSYNC在添加ASM ("NOP")时工作正常

    但我仍然没有PWM输出。

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

    您是否正在ISR中清除OST行程?

    是否可以检查TZCTL寄存器的内容并确保仅启用了所需的操作?

    您似乎正在修改ISR中的TZDCSEL跳闸条件。 如果您可以附加一些数字来说明您希望ePWM输出相对于比较器输入执行的操作,我们可能会为您提供一些建议,以便不必更新TZDCSEL。

    此外,最好从一个ePWM输出信号开始逐步构建您的ePWM配置,而不是死区。 如果某些配置不正确,每个功能都可能会中断ePWM输出。

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

    您好,Tommy

    非常感谢您的关注。

    我已经弄清楚了问题所在。 我的PWM计数器是上下计数器。 在第一个周期中,比较器在匹配匹配进行定位时将PWM设置为高。 要使PWM降低,它必须倒计时并再次捕获匹配,但它会在倒计时匹配之前重置计数器。

    因此,操作限定符不能将PWM输出设置为低。 因此,我看到PWM持续处于高水平。

    我已更改计数器作为向上计数器。

    再次感谢您的想法。

    此致

    Fahri