工具/软件:Code Composer Studio
尊敬的所有人:
我正在尝试配置 TMS320F28379D PWM 发生器、但无法获得所需的行为。 让我来描述一下如何配置 PWM 通道:
PWM 通道配置为在向上向下计数模式下以20kHz (50us)频率运行。
2. PWM 通道需要在互补模式下工作,即 B 输出反相 A 输出。 A 和 B 是 PWM 通道的输出。
3、死区时间需要插入两个 PWM 通道的上升沿、而不应插入到下降沿。 我不确定我是否正确执行了该操作。 根据图14-33。 死区子模块的配置选项、第171717/2668页 、在技术参考手册- SPRUHM8G 中、这似乎可以通过四种方式实现:
(3-1) outa = PWMxA、OUTB = PWMxA***、其中 PWMxA***被延迟(下降沿和上升沿都是)且 PWMxA 信号反相
(3-2) OUTA = PWMxB***、OUTB = PWMxB、其中 PWMxB***被延迟(下降沿和上升沿)、且 PWMxB 信号反相
(3-3) OUTA = PWMxA*、OUTB = PWMxA**、其中 PWMxA*延迟(上升沿) PWMxA、PWMxA**延迟(下降沿)且 PWMxA 信号反相
(3-4) OUTA = PWMxB**、OUTB = PWMxB*、其中 PWMxB*延迟(上升沿) PWMxB、PWMxB**延迟(下降沿)且 PWMxB 信号反相
由于 OUTSWAP 位、其他类似的可能性很少、但问题仍然相同。 问题是什么? 问题是在所有死区模式中、只有一个信号 PWMxA 或 PWMxB 用作生成两个输出的源。 您将在项目符号4中看到为什么这是一个问题。
4.我希望能够手动断开 PWM 通道与输出的连接、但 PWM 通道仍应运行、因为我使用 PWM 作为 ADC 触发源和其他一些东西。 现在有一个带有 CSFB 和 CSFA 位的 AQCSFRC 寄存器来强制 PWMxA 和 PWMxB 进入特定状态、而无需停止 PWM 模块时钟。 但是、该寄存器位于死区子模块之前、这意味着它影响死区子模块输入上的 PWMxA 和 PWMxB。 例如、如果您考虑 OUTA = PWMxA 且 OUTB = PWMxA***、很明显 CSFB 不会影响 OUTB、这意味着如果我使用 CSFA 在 OUTA = PWMxA 上强制设置高电平或低电平状态、OUTB 将处于 OUTA 的相反状态。
问题是:我应该如何处理这个问题? 是否有任何其他方法来配置死区发生器以获得死区时间插入、并能够在需要时使用 AQCSFRC 强制 PWMxA 和 PWMxB 都处于低电平状态? 或者、如果这不是选项、我应该使用什么来"断开 PWM 与 GPIO 的连接"? 是否应直接重新配置 GPIO (我不喜欢这种方法)?
这是我用于配置 PWM 通道的函数。
void inum_InitEPwm (volatile struct ePWM_regs * EPwmRegs) { // ePWM 时基时钟由以下公式确定 //参数:EPWMCLK、CLKDIV 和 HSPCLKDIV // EPWMCLK = PLLCLK/EPWMCLKDIV (200MHz) // TBCLK = EPWMCLK/(HSPCLKDIV*CLKDIV)(200MHz) //动作限定符连续 S/W 强制寄存器 //EPwmRegs->AQCSFRC.bit.CSFB = 0b01;//强制输出 B 持续为低电平 //EPwmRegs->AQCSFRC.bit.CSFA = 0b01;//强制输出 A 持续为低电平 //时基控制寄存器(1) //EPwmRegs->TBCTL.bit.free_soft = 0b11;//自由运行(#update) EPwmRegs->TBCTL.bit.PHSDIR = 0b1; //同步事件后向上计数 EPwmRegs->TBCTL.bit.CLKDIV = 0b000; //时基时钟预分频:/1 EPwmRegs->TBCTL.bit.HSPCLKDIV = 0b000;//高速时基时钟预分频:/1 EPwmRegs->TBCTL.bit.SYNCOSEL = 0b01;//同步输出选择:TBCTL=0x00 EPwmRegs->TBCTL.bit.PRDLD = 0b0; //当 TBCTL=0x00时、TBPRD 从其影子寄存器加载 EPwmRegs->TBCTL.bit.PHSEN = 0b0; //不要从 TBPHS 加载 TBCTR EPwmRegs->TBCTL.bit.CTRMODE = 0b10; //计数器模式:向上向下计数模式 //时基控制寄存器(2) EPwmRegs->TBCTL2.bit.PRDLDSYNC = 0b00;//只有当 TBCTL=0x00时 TBPRD 才会影子到活动负载 //计数器比较控制寄存器(1) EPwmRegs->CMPCTL.bit.LOADBSYNC = 0b00;//影子到活动 CMPB:CMPBHR 根据 LOADBMODE 位发生 EPwmRegs->CMPCTL.bit.LOADASHNC = 0b00;//影子到活动 CMPA:CMPAHR 根据 LOADAMODE 位发生 EPwmRegs->CMPCTL.bit.SHDWBMODE = 0b0;//影子模式用于 CMPB:CMPBHR 寄存器 EPwmRegs->CMPCTL.bit.SHDWAMODE = 0b0;//影子模式用于 CMPA:CMPAHR 寄存器 EPwmRegs->CMPCTL.bit.LOADBMODE = 0b00;//在 TBCTR=0x00上加载 CMPB:CMPBHR EPwmRegs->CMPCTL.bit.LOADAMODE = 0b00;//在 TBCTR=0x00上加载 CMPA:CMPAHR //死区发生器控制寄存器(1) EPwmRegs->DBCTL.bit.HALFCYCLE = 0b0;//死区计数器以 TBCLK 速率计时 EPwmRegs->DBCTL.bit.DEDB_MODE = 0b0;//未使用 EPwmRegs->DBCTL.bit.OUTSWAP = 0b00; // pathA->outa,pathB->outTB EPwmRegs->DBCTL.bit.SHDWDBFEDMODE = 0b0;//影子寄存器不用于 DBFED 寄存器 EPwmRegs->DBCTL.bit.SHDWDBREDMODE = 0b0;//影子寄存器不用于 DBRED 寄存器 EPwmRegs->DBCTL.bit.in_mode = 0b00; // EPWMxA 是下降沿和上升沿延迟的源 EPwmRegs->DBCTL.bit.POLSEL = 0b10; // EPWMxB 反相 EPWMxA EPwmRegs->DBCTL.bit.out_mode = 0b11;// DBM 已完全启用(红色和 FED) //输出 A 的动作限定符控制寄存器 EPwmRegs->AQCTLA.bit.CAD = 0b10;//强制 ePWMxA 为高电平(递减计数) EPwmRegs->AQCTLA.bit.CAU = 0b01;//强制 ePWMxA 为低电平(递增计数) //死区发生器上升沿延迟 //在向上向下计数模式中: // TDLY =(DBRED+DBFED)/(2*TBCTR)*TBCLK (2.5us) EPwmRegs->DBRED.bit.DBRED = 250; EPwmRegs->DBFED.bit.DBFED = 250; //时基计数器寄存器 EPwmRegs->TBCTR = 0x0000; //清除计数器 //时基周期寄存器 //向上计数或向下计数模式:TPWM =(TBCPRD+1)* TBCLK //向上向下计数模式:TPWM =(2*TBCTR )*TBCLK EPwmRegs->TBPRD = 5000; // PWM 周期(50us) //计数器比较 A 寄存器 EPwmRegs->CMPA.bit.CMPA = 0; // ePWMxA 输出的占空比 }