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万,我正在尝试将PWM输出与模拟比较器信号同步。 为了实现这一点,我正在创建一个事件信号(DCAEVT1),用于低级别和高级别的比较器,并进行一个tripzone中断。
当控制器接收到SWFSYNC信号时,PWM模块应将0 (零)作为相位值加载,并将加载带零的PWM计数器寄存器。 因此,PWM将重新启动。
我在这一步中有两个问题;
第一个是:不能设置SWFSYN寄存器1。 它是零。 因此,我无法获得同步信号。
第二个是;当我将PHSEN位设置为1 (位于PWM寄存器,TBCTL寄存器中)时,PWM输出始终为高。 我可以观察到高水平输出。它永远不会下降。
此致,
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输出。
您好,Tommy
非常感谢您的关注。
我已经弄清楚了问题所在。 我的PWM计数器是上下计数器。 在第一个周期中,比较器在匹配匹配进行定位时将PWM设置为高。 要使PWM降低,它必须倒计时并再次捕获匹配,但它会在倒计时匹配之前重置计数器。
因此,操作限定符不能将PWM输出设置为低。 因此,我看到PWM持续处于高水平。
我已更改计数器作为向上计数器。
再次感谢您的想法。
此致
Fahri