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.

[参考译文] CCS/TMS320F28379D:为三相逆变器应用配置 PWM 发生器

Guru**** 2595770 points
Other Parts Discussed in Thread: TMS320F28379D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/667602/ccs-tms320f28379d-configure-pwm-generator-for-3-phase-inverter-application

器件型号:TMS320F28379D

工具/软件: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 输出的占空比
} 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我设法解决了这个问题。

    动作限定符子模块的 PWMxA 和 PWMxB 输出被定义为相等:

    EPwmRegs->AQCTLA.bit.CAD = 0b10;//强制 ePWMxA 为高电平(递减计数)
    EPwmRegs->AQCTLA.bit.CAU = 0b01;//强制 ePWMxA 为低电平(递增计数) EPwmRegs->AQCTLB.bit.CAU
    = 0b01;//
    强制 ePWMxA 为低电平(递增计数) EPwmCL1.b0bcB=0bcB=0bcad = 0bcu;EPwmcw 计数 EPwmRegs->EPwmcB=0bcB=0bcad (递增计数) 

    死区子模块定义如下:

    OUTA = PWMxA*、其中 PWMxA*被延迟(上升沿) PWMxA 信号。
    OUTB = PWMxB**、其中 PWMxB**被延迟(下降沿)并反相 PWMxB 信号。

    EPwmRegs->DBCTL.bit.DEDB_MODE = 0b0;
    EPwmRegs->DBCTL.bit.OUTSWAP = 0b00;
    EPwmRegs->DBCTL.bit.IN_MODE = 0b10;
    EPwmRegs->DBCTL.bit.SEL = 0b10
    ;EPwmRegs->DBCTL.POL.bit = 0b10;EPwbdb10 

    3.要断开 PWM 与输出的连接,请写入 EPwmRegs 的以下位:

    AQSFRC.bit.CSFB = 0b10;//在 PWMxB 上强制一个持续高电平、这意味着 OUTB 将为低
    AQSFRC.bit.CSFA = 0b01;//在 PWMxA 上强制一个持续低电平、这意味着 OUTA 将为低电平 

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

    感谢您将解决方案发布到您的问题。