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.
您好!
我将 PWM1A 定义为主器件:
EALLOW;
/*假定 ePWM1时钟已在 InitSysCtrl()中启用;*/
EPwm1Regs.ETSEL.bit.SOCBEN = 1; //在 B 组上启用 SOC *
EPwm1Regs.ETSEL.bit.SOCBSEL = 6; //从 CPMB 中选择 SOC,启用计数*/
EPwm1Regs.ETPS.bit.SOCBPRD = 1; //在第一个事件发生时生成脉冲
/*设置周期/占空比/计数模式*/
EPwm1Regs.TBPHS.half.TBPHS = 0; //将相位寄存器设置为零*
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; //禁用相位加载
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; /*时钟与 SYSCLKOUT 的比率*
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; //将 PWM1A 设置为零*
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; //在递增计数时按匹配清除 PWM1A *
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET; //将 PWM1B 设置为零*
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR; //在计数 B 递增时按匹配清除 PWM1B *
EPwm1Regs.CMPB = DutyCycle _PWMB; //设置比较 B 值*/
EPwm1Regs.CMPA.Half.CMPA = DutyCycle _PWMA; //设置比较值*
EPwm1Regs.TBPRD =周期; //为 ePWM1设置周期*
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; /*先递增后启动*
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_PRD;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;//同步"下流"
EDIS;
我想在 PWM3上生成 PWM 补充信号:
/*假定 ePWM3时钟已在 InitSysCtrl()中启用;*/
EALLOW;
/*PWM3:设置周期/占空比/计数模式*/
EPwm3Regs.TBPHS.half.TBPHS = 0; //将相位寄存器设置为零*
EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE; //禁用相位加载
EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; /*时钟与 SYSCLKOUT 的比率*
EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm3Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm3Regs.AQCTLA.bit.ZRO = AQ_SET; //将 PWM3A 设置为零
EPwm3Regs.AQCTLA.bit.CAU = AQ_CLEAR; //在递增计数时按匹配清除 PWM3A *
EPwm3Regs.AQCTLB.bit.ZRO = AQ_SET; /*将 PWM3B 设置为零*/
EPwm3Regs.AQCTLB.bit.CBU = AQ_CLEAR; //在计数 B 递增时按匹配清除 PWM3B *
//EPwm3Regs.CMPB = DutyCycle _PWMB; //设置比较 B 值*/
EPwm3Regs.CMPA.Half.CMPA =DutyCycle _PWMA; //设置比较值*
EPwm3Regs.TBPRD =周期; //为 ePWM3设置周期*
EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; /*先递增后启动*
EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_PRD;
EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; //同步"下流"从器件
EDIS;
/*基于比较器3输出配置跳闸区域并配置消隐*/
EALLOW;
EPwm3Regs.TZSEL.bit.DCAEVT2 = 0; //数字比较、输出 A、逐周期*/
EPwm3Regs.TZCTL.bit.TZA = TZ_FORCE_LO; /* EPWM3A 将变为低电平*
EPwm3Regs.TZCTL.bit.TSB = TZ_FORCE_HI; /* EPWM3B 变为 HI *
EPwm3Regs.DCTRIPSEL.bit.DCAHCOMPSEL = DC_COMP1OUT; // DCAH =比较器1输出
EPwm3Regs.TZDCSEL.bit.DCAEVT2 = TZ_DCAH_HI; /* DCAEVT2 = DCAL 高电平(当比较器输出变为高电平时将变为有效)*/
/* DCAEVT2 = DCAH 高电平(将成为 EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = DC_COMP2OUT;DCAH =比较器2输出*/
EPwm3Regs.DCACTL.bit.EVT2SRCSEL = DC_EVT2; // DCAEVT2 = DCAEVT2 (未过滤)*/
EPwm3Regs.DCACTL.bit.EVT2FRCSYNCSEL = DC_EVT_异 步; //获取异步路径*/
EPwm3Regs.DCFCTL.bit.PULSESEL = 0; //时基计数器等于周期(TBCTR =TBPRD)*/
EPwm3Regs.DCFCTL.bit.BLANKINV = 0; //反转消隐窗口
EPwm3Regs.DCFCTL.bit.Blanke = 1; //启用消隐窗口
EPwm3Regs.DCFCTL.bit.SRCSEL = 0; //源是 DCAEVT1信号*
EPwm3Regs.DCFWINDOW=0;//34; /*长度消隐窗口:对应于:34*11.1ns=377.4ns*/
EPwm3Regs.DCFOFFSET = 5; // 5*11.1=55.5ns 消隐窗口偏移,然后消隐窗口开始*/
EDIS;
//高电平有效互补 PWM -设置死区
EPwm3Regs.DBCTL.bit.IN_MODE = DBA_ALL;
EPwm3Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;
EPwm3Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm3Regs.DBRED = 0;//15;
EPwm3Regs.DBFED = 0;//15;
但是、在我运行代码后、我只能在示波器上看到通道3B、而不能看到通道 B。我确保 PWM3 GPIO 配置正确。
有人能告诉我为什么会发生这种情况吗?
我尝试分别使用比较器1、2和3来控制 PWM3、4、5。 但是、我看到只有 PWM4的工作方式是应该的。 由于比较器1和3变为高电平、PWM3A 和 PWM5A 在第一次跳闸时会立即保持低电平。 我注意到、当有一个 TRIP TZFLG 寄存器被置位时、它永远不会在下一个周期内被清零(当比较器输出变为低电平时)。
请参阅我随附的硬件配置文件:
您是否正在使用 OST 模式? 您需要确保 ePWM 跳闸区域配置为逐周期模式。 ASLO 确保清除相应 ePWM 逐周期中断的标志。
// // epwm2TZISR - ePWM2 TZ ISR // __interrupt void epwm2TZISR (void) { epwm2TZIntCount++; // //切换 GPIO 以在输入 TZ 时发出通知 // GPIO_togglePin (11); // //清除标志-我们将继续获取该中断,直到 TZ //引脚变为高电平。 // ePWM_clearTripZoneFlag (EPWM2_base、(ePWM_TZ_INTERRUPT | ePWM_TZ_FLAG_CBC)); // //确认此中断以接收来自组2的更多中断 // interrupt_clearACKGroup (interrupt_ack_group2); }