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.

[参考译文] TMS320F28069:互补 PWM 信号

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/746724/tms320f28069-complementary-pwm-signals

器件型号:TMS320F28069

 您好!

我将 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 配置正确。

有人能告诉我为什么会发生这种情况吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否澄清"我只能在示波器上看到通道3B、而不能看到通道 B"?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我只能看到 PWM3B 信号、不能看到 PWM3A
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我尝试分别使用比较器1、2和3来控制 PWM3、4、5。 但是、我看到只有 PWM4的工作方式是应该的。 由于比较器1和3变为高电平、PWM3A 和 PWM5A 在第一次跳闸时会立即保持低电平。 我注意到、当有一个 TRIP TZFLG 寄存器被置位时、它永远不会在下一个周期内被清零(当比较器输出变为低电平时)。

    请参阅我随附的硬件配置文件:

    e2e.ti.com/.../HwConfig.zip

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

    您是否正在使用 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);
    }