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/TMS320F28069:使用斜坡发生器和比较器 F28069 Piccolo 的电流编程模式

Guru**** 2538960 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/680657/ccs-tms320f28069-current-programmed-mode-using-ramp-generator-and-comparator-f28069-piccolo

器件型号:TMS320F28069
主题中讨论的其他器件:C2000WARE

工具/软件:Code Composer Studio

大家好、我正在为 SEPIC 转换器控制执行电流编程模式。 我想知道如何使用斜坡发生器和目标的比较器块来实现它。  

我尝试执行下一个代码、但示波器中的信号为100kHz 99%占空比。 我想获取50%占空比信号。 感谢你能抽出时间

#include "DSP28x_Project.h"//器件头文件和示例 include 文件


#include
#include

//f deseada en kHz
float f=100;
浮点周期=90000/100;

浮子 TOFF;
浮点 h;
float vo;
浮点 IO;
浮点 IP;
浮动 VP;

float VP=0;
float io=0;
float IP=0;
浮点 Vo=0;

int contador = 0;

浮子 KP=0.2990;
float Ki = 676.7921;
float TM=1/100000;
float Vref=0;

float Salpi[2];
float EntPI[2];

悬空 ACW;


//此文件中找到的函数的原型语句。

void ADC_Config (void);

空 InitEPwm2 (空);
void InitEPwm2Gpio (void);

MAIN ()


InitSysCtrl();


InitEPwm2Gpio();

Dint;

InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

InitPieVectTable();

EALLOW;//这是写入 EALLOW 受保护寄存器所必需的

EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的

InitAdc ();//对于此示例,初始化 ADC
AdcOffsetSelfCal();

IER |= M_INT14;

PieCtrlRegs.PIEIER1.bit.INTx7=1;

EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM

//配置 GPIO




EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1;//禁用 GPIO0上的上拉电阻(EPWM1A)
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 1;//禁用 GPIO1上的上拉电阻(EPWM1B)
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;//将 GPIO0配置为 EPWM1A
GpioCtrlRegs.GPAMUX1.bit.GPIO1=1;//将 GPIO1配置为 EPWM1B

GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1;//禁用 GPIO2上的上拉电阻(EPWM2A)
GpioCtrlRegs.GPAPUD.bit.GPIO3 = 1;//禁用 GPIO3上的上拉电阻(EPWM2B)
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;//将 GPIO2配置为 EPWM2A
GpioCtrlRegs.GPAMUX1.bit.GPIO3=1;//将 GPIO3配置为 EPWM2B


GpioCtrlRegs.GPAPUD.bit.GPIO4 = 1;//禁用 GPIO4上的上拉电阻(EPWM3A)
GpioCtrlRegs.GPAPUD.bit.GPIO5=1;//禁用 GPIO5上的上拉电阻(EPWM3B)
GpioCtrlRegs.GPAMUX1.bit.GPIO4=0;//将 GPIO4配置为 EPWM3A
GpioCtrlRegs.GPAMUX1.bit.GPIO5=0;//将 GPIO5配置为 EPWM3B
GpioCtrlRegs.GPADIR.bit.GPIO4=1;
GpioCtrlRegs.GPADIR.bit.GPIO5=1;

GpioCtrlRegs.GPAPUD.bit.GPIO8 = 1;//禁用 GPIO8上的上拉电阻(EPWM5A)
GpioCtrlRegs.GPAMUX1.bit.GPIO8=1;//将 GPIO1配置为 EPWM5A

GpioCtrlRegs.GPBPUD.bit.GPIO32 = 0;
GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 2;

//将 GPIO31配置为 GPIO 输出引脚(Evalkit 蓝色 LED)
GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO31 = 1;

//红色 OCP LED
GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;
GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;

// GPIO 10作为输入(使能开关)
GpioCtrlRegs.GPAPUD.bit.GPIO10=1;//禁用 GPIO10上的上拉
GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 0;// GPIO10 = GPIO10
GpioCtrlRegs.GPADIR.bit.GPIO10 = 0;// GPIO10 =输入
GpioCtrlRegs.GPACTRL.bit.QUALPRD1=10;//双周期= SYSCLKOUT/10
GpioCtrlRegs.GPAQSEL1.bit.GPIO10=2;// 6个样本


AdcRegs.ADCCTL1.bit.ADCBGPWD = 1;//电源 ADC 带隙
AdcRegs.ADCCTL1.bit.ADCREFPWD = 1;//电源基准
AdcRegs.ADCCTL1.bit.ADCPWDN = 1;//电源 ADC
AdcRegs.ADCCTL1.bit.ADCENABLE = 1;//启用 ADC
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0;//选择内部带隙

EDIS;

InitEPwm2();

PieCtrlRegs.PIEIER1.bit.INTx7=1;
//在 PIE 中启用 ePWM INTn:组2中断1
PieCtrlRegs.PIEIER2.bit.INTx1 = 1;
//在 PIE:组3中断1中启用 EPWM1_INT
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
//在 PIE:组3中断2中启用 EPWM2_INT
PieCtrlRegs.PIEIER3.bit.INTx2 = 1;
//在 PIE:组3中断4中启用 EPWM4_INT
PieCtrlRegs.PIEIER3.bit.INTx4 = 1;
//在 PIE:组1中启用 ADC
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//在 PIE 中启用 INT 1.1

//启用全局中断和更高优先级的实时调试事件:
PieCtrlRegs.PIEACX.ALL = 0xFFFF;

//等待 ADC 中断



空 InitEPwm2Gpio (空)

EALLOW;

/*禁用所选输出引脚的内部上拉电阻
以降低功耗*/
//用户可以启用或禁用上拉。
//这将启用指定引脚的上拉电阻。
//注释掉其他不需要的行。

GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1;//禁用 GPIO2上的上拉电阻(EPWM2A)
GpioCtrlRegs.GPAPUD.bit.GPIO3 = 1;//禁用 GPIO3上的上拉电阻(EPWM2B)

/*使用 GPIO 寄存器配置 EPWM-2引脚*/
//这指定哪些可能的 GPIO 引脚将是 EPWM2功能引脚。
//注释掉其他不需要的行。

GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;//将 GPIO2配置为 EPWM2A
GpioCtrlRegs.GPAMUX1.bit.GPIO3=1;//将 GPIO3配置为 EPWM2B

EDIS;


空 InitEPwm2()

EALLOW;

// fórmula 40MHz/50kHz=800周期、TBCLK 计数


EPwm1Regs.TBPRD =周期;  
//EPwm1Regs.TBPHS.Half.TBPHS = 0;

//EPwm1Regs.TBPHS = 0x0000;//将相位寄存器设置为零
EPwm1Regs.TBPHS.Half.TBPHS = 0;//将相位寄存器设置为零
EPwm1Regs.TBCTR = 0;//清除 TB 计数器
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//相位加载被禁用
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;

EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;// TBCLK = SYSCLK
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;


EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;// CTR 上的负载=零
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;// CTR 上的负载=零

EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;

EPwm1Regs.AQCTLA.bit.PRD = AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;
//
//运行时间
//==== ===== ===== ===== ====
//EPwm1Regs.CMPA.half.CMPA = 0.5;//调整输出 EPWM1A 的占空比

Comp1Regs.COMPCTL.bit.COMPDACEN = 1;
Comp1Regs.COMPCTL.bit.SYNCSEL = 1;
Comp1Regs.COMPCTL.bit.CMPINV = DC_BLANK_NOTINV;
Comp1Regs.COMPCTL.bit.COMPSOURCE = 0;
Comp1Regs.COMPCTL.bit.QUALSEL = 0;
COMP1Regs.DACCTL.bit.RAMPSOURCE = 0;
Comp1Regs.DACCTL.bit.DACSOURCE = 1;
COMP1Regs.DACCTL.bit.FREE_SOFT = 0;
COMP1Regs.DACVAL.ALL = 1024;
Comp1Regs.RAMPDECVAL_Shdw = 20000;
COMP1Regs.RAMPMAXREF_Shdw = 49000;


Comp1Regs.DACVAL.bit.DACVAL=310;

EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL=0;// DCAH =比较器输出
EPwm1Regs.DCTRIPSEL.bit.DCALCOMPSEL=8;

EPwm1Regs.TZDCSEL.bit.DCAEVT2 = TZ_DCAH_HI;// DCAEVT2 =(当比较器输出变为高电平时将变为有效)

EPwm1Regs.DCACTL.bit.EVT2SRCSEL = 1;//DC_EVT2;// DCAEVT2 = DCAEVT2 (未滤波)
EPwm1Regs.DCACTL.bit.EVT2FRCSYNCSEL = 1;//采用同步路径

EPwm1Regs.TZSEL.bit.DCAEVT2 = 1;
EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_HI;// EPWM1A 将变为低电平
EPwm1Regs.TZCTL.bit.TSB = TZ_FORCE_LO;// EPWM1A 将变为低电平
EPwm1Regs.TZEINT.BIT.DCAEVT2 = 1;
EPwm1Regs.DCFCTL.bit.PULSESEL = 0;//时基计数器等于零(TBCTR = 0x0000)-开始空定时器

EPwm1Regs.DCFCTL.bit.BLANKINV=0;

EPwm1Regs.DCFCTL.bit.Blanke=1;


EPwm1Regs.DCFCTL.bit.SRCSEL = 3;//源是 DCAEVT2信号

EPwm1Regs.DCFOFFSET = 0;//无偏移
EPwm1Regs.DCFWINDOW = 255;//消隐窗口

EDIS;


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

    我写信告诉您、已指派一名 C2000团队成员回答此帖子。

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

    我们只能帮助您调试特定模块故障。 您是否确定了系统中产生此行为的故障? 如果没有、我建议您将软件分解为隔离测试、以验证模块是否按预期工作。

    例如、从 ePWM 设置开始、以确保频率正确。 然后添加斜坡发生器来监控比较器输入上的静态直流电压。 验证 ePWM 是否按预期跳闸。 您可以通过测量 PWMSYNC 和比较器在直流电平跳闸之间的时间来确认递减行为。

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

    自您上次更新以来、已经将近两周了。 我假设您能够解决您的问题。 如果情况并非如此,请拒绝此解决方案并回复此主题。 如果此主题已锁定、请制作一个描述问题当前状态的新主题。

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

    Tommy、您好、感谢您的回复。 我已经尝试使用 VisSim 软件和 PSIM 软件、但仍然无法使用斜坡发生器看到 PWM 信号。

    我只想看到一个 PWM 信号、它只是使用斜坡来修改模拟输入。 类似这张图片的东西。

    如果您有一个代码让我这样做、我将不胜感激。

    谢谢你

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

    我们无法在这里帮助您解决 VisSim 或 PSIM 问题--您需要直接联系他们以获得支持。

    对于 C 语言实现、我建议您从 C2000Ware 中的 ePWM_dcevent_trip_comp 示例开始、并确保您可以监控 ePWM 输出、并且它会响应您的比较器跳闸。

    一旦工作正常、您可以在比较器设置中进行移植、以使用斜坡发生器控制反相输入。

    从一个已知示例开始、我们将只关注少数几行被修改的代码。

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

    Tommy、非常感谢您的快速回复、我一直在寻找和测试该示例、但结果不是所需的、 我想将 DAC 配置为中点值(512)、我想看到的结果与模拟比较器相同(1在输入 A2为3.3时、0在 A2为0时) 但在开始时、我得到一个470Hz PWM 信号、当我将 A2连接到0V 时、GPIO00变为高电平、不再如此、您能帮我解决这个问题吗? 我非常感谢

    谢谢你

    (运行示例如下所示):

    //######################################################################################################################
    //描述:
    //! addtogroup f2806x_example_list
    //!

    ePWM 直流事件触发比较器(ePWM_dcevent_TRIP_comp)


    //!
    //! 在此示例中、ePWM1配置为 PWM 数字比较事件
    //! 使用比较器1A 和比较器1B 引脚输入跳闸。
    //! DCAEVT1、DCBEVT1事件通过增加上的电压来触发
    //! 将 COMP1B 引脚电平设置为高于 COMP1A 引脚电平。
    //! 在此示例中:
    //!    - ePWM1将 DCAEVT1和 DCBEVT1作为单触发源
    //!            DCAEVT1将 EPWM1A 拉至高电平
    //!            DCBEVT1将 EPWM1B 拉至低电平
    //!
    //! 最初使 COMP1A 上的电压电平高于 COMP1B。
    //! 增加比较器反相侧(COMP1B 引脚)上触发的电压
    //! DCAEVT1和 DCBEVT1。 ePWM1将对 DCAEVT1和 DCBEVT1作为1次触发做出反应
    //! 跳闸。 在示波器上查看 EPWM1A/B 波形以查看的效果
    //! 事件。
    //!
    //! b 外部连接\n
    //!  - EPTWM1A 位于 GPIO0上
    //!  - EPWM1B 位于 GPIO1上
    //!  - COMP1A 位于 ADCA2上
    //!  - COMP1B 位于 ADCB2上
    //!  -将 COMP1B 拉至比 COMP1A 更高的电压电平。
    //
    //######################################################################################################################
    //$TI 版本:F2806x C/C++头文件和外设示例 V151 $
    //$Release Date: 2016年2月2日$
    //版权所有:版权所有(C) 2011-2016德州仪器(TI)公司-
    //            http://www.ti.com/ 保留所有权利$
    //######################################################################################################################

    #include "DSP28x_Project.h"    //器件头文件和示例 include 文件

    //此文件中找到的函数的原型语句。
    void InitEPwm1Examples(void);
    _interrupt void epwm1_tzint_ISR (void);

    //此示例中使用的全局变量
    uint32 EPwm1TZIntCount;
    uint32 EPwm2TZIntCount;

    void main (void)

    //步骤1. 初始化系统控制:
    // PLL、安全装置、启用外设时钟
    //此示例函数位于 F2806x_SYSCTRL.c 文件中。
      InitSysCtrl();

    //步骤2. 初始化 GPIO:
    //此示例函数位于 F2806x_GPIO.c 文件和中
    //说明了如何将 GPIO 设置为其默认状态。
    // InitGpio(); //针对此示例跳过

    //在这种情况下、只需为 ePWM1、ePWM2和 TZ 引脚初始化 GPIO 引脚
      InitEPwm1Gpio();


    //步骤3. 清除所有中断并初始化 PIE 矢量表:
    //禁用 CPU 中断
      Dint;

    //将 PIE 控制寄存器初始化为默认状态。
    //默认状态为禁用所有 PIE 中断和标志
    //被清除。
    //此函数位于 F2806x_PIECTRL.c 文件中。
      InitPieCtrl();

    //禁用 CPU 中断并清除所有 CPU 中断标志:
      IER = 0x0000;
      IFR = 0x0000;

    //使用指向 shell 中断的指针初始化 PIE 矢量表
    //服务例程(ISR)。
    //这将填充整个表,即使是中断也是如此
    //在本例中未使用。  这对于调试很有用。
    //可以在 F2806x_DefaultIsr.c 中找到 shell ISR 例程
    //此函数可在 F2806x_PieVect.c 中找到
      InitPieVectTable();

    //此示例中使用的中断被重新映射到
    //此文件中的 ISR 函数。
      EALLOW; //这是写入 EALLOW 受保护寄存器所必需的
      PieVectTable.EPWM1_TZINT =&epwm1_tzint_ISR;
      EDIS;   //这是禁止写入 EALLOW 受保护寄存器所必需的

    //步骤4. 初始化所有器件外设:
    //此函数可在 F2806x_InitPeripherals.c 中找到
    // InitPeripherals (); //此示例不需要

      
      EALLOW;
      SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;                //启用 ADC 时钟
      AdcRegs.ADCCTL1.bit.ADCBGPWD = 1;                    //比较器共享 ADC 的内部 BG 参考、即使 ADC 未使用也必须被加电
      DELAY_US (1000);                               //加电延迟
      SysCtrlRegs.PCLKCR3.bit.COMP1ENCLK = 1;              //启用到比较器1块的时钟
      Comp1Regs.COMPCTL.bit.COMPDACEN = 1;                 //本地加电比较器1
      Comp1Regs.COMPCTL.bit.COMPSOURCE = 1;                //将反相输入连接到引脚 COMP1B
    //////////////////////////////// 取消注释以下2行以使用 DAC、而不是引脚 COMP1B ///////////////////////////////////////////////////////////////////////////////////////////////////////
      Comp1Regs.COMPCTL.bit.COMPSOURCE = 0;             //将反相输入连接到内部 DAC
      COMP1Regs.DACCTL.bit.DACSOURCE=0;
      Comp1Regs.DACVAL.bit.DACVAL = 512;                //将 DAC 输出设置为中点

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;
      EDIS;

      InitEPwm1Examples();

      EALLOW;
      SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;
      EDIS;

    //步骤5. 特定于用户的代码、启用中断
    //初始化计数器:
      EPwm1TZIntCount = 0;

    //启用连接到 EPWM1-3 INT 的 CPU INT3:
      IER |= M_INT2;

    //在 PIE 中启用 ePWM INTn:组2中断1-3
      PieCtrlRegs.PIEIER2.bit.INTx1 = 1;

    //启用全局中断和更高优先级的实时调试事件:
      EINT;  //启用全局中断 INTM
      ERTM;  //启用全局实时中断 DBGM



    //步骤6. 空闲循环。 只需坐下来循环(可选):
      for (;;)
      {
         _asm ("         NOP");
      }



    _interrupt void epwm1_tzint_ISR (void)

      EPwm1TZIntCount++;

    //将这些标志保留为设置,这样我们就只接受它
    //中断一次
    //
    // EALLOW;
    // EPwm1Regs.TZCLR.bit.OST = 1;
    // EPwm1Regs.TZCLR.bit.INT = 1;
    // EDIS;

      //确认此中断以接收来自组2的更多中断
      PieCtrlRegs.PIEACX.ALL = PIEACK_group2;






    空 InitEPwm1Examples()


      EALLOW;
      EPwm1Regs.TBPRD = 6000;                        //设置定时器周期
      EPwm1Regs.TBPHS.Half.TBPHS = 0x0000;           //相位为0
      EPwm1Regs.TBCTR = 0x0000;  
      

      //设置 TBCLK
      EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上/向下计数
      EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;       //禁用相位加载
      EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV4;      //时钟与 SYSCLKOUT 的比率
      EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV4;

      EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE;   //每0加载一次寄存器
      EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
      EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
      EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

      //设置比较
      EPwm1Regs.CMPA.half.CMPA = 3000;

      //设置操作
      EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;            //在 CAU 上设置 PWM1A
      EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;           //清除 CAD 上的 PWM1A


      EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;          //清除 CAU 上的 PWM1B
      EPwm1Regs.AQCTLB.bit.CAD = AQ_SET;            //在 CAD 上设置 PWM1B
      
      //根据 TZ1和 TZ2定义事件(DCAEVT1)
      EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = DC_COMP1OUT;       // DCAH =比较器1输出
      EPwm1Regs.DCTRIPSEL.bit.DCALCOMPSEL = DC_TZ2;            // DCAL = TZ2
      EPwm1Regs.TZDCSEL.bit.DCAEVT1 = TZ_DCAH_LOW;             // DCAEVT1 = DCAH LOW (当比较器输出变为低电平时将变为有效)  
      EPwm1Regs.DCACTL.bit.EVT1SRCSEL = DC_EVT1;               // DCAEVT1 = DCAEVT1 (未滤波)
      EPwm1Regs.DCACTL.bit.EVT1FRCSYNCSEL = DC_EVT_异 步;      //采用异步路径
      
      //根据 TZ1和 TZ2定义事件(DCBEVT1)
      EPwm1Regs.DCTRIPSEL.bit.DCBHCOMPSEL = DC_COMP1OUT;       // DCBH =比较器1输出
      EPwm1Regs.DCTRIPSEL.bit.DCBLCOMPSEL = DC_TZ2;            // DCAL = TZ2  
      EPwm1Regs.TZDCSEL.bit.DCBEVT1 = TZ_DCBH_LOW;             // DCBEVT1 = (当比较器输出变为低电平时将变为有效)    
      EPwm1Regs.DCBCTL.bit.EVT1SRCSEL = DC_EVT1;               // DCBEVT1 = DCBEVT1 (未滤波)
      EPwm1Regs.DCBCTL.bit.EVT1FRCSYNCSEL = DC_EVT_异 步;      //采用异步路径
            
      //启用 DCAEVT1和 DCBEVT1是一次性触发源
      //注意:DCxEVT1事件可定义为单次触发。  
      //      DCxEVT2事件可定义为逐周期。
      EPwm1Regs.TZSEL.bit.DCAEVT1 = 1;
      EPwm1Regs.TZSEL.bit.DCBEVT1 = 1;

      //我们希望 DCAEVT1和 DCBEVT1事件执行什么操作?
      // DCAEVTx 事件会强制 EPWMxA
      // DCBEVTx 事件会强制 EPWMxB  
      EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_HI;          // EPWM1A 将变为高电平
      EPwm1Regs.TZCTL.bit.TSB = TZ_FORCE_LO;          // EPWM1B 将变为低电平

      //启用 TZ 中断
      EPwm1Regs.TZEINT.bit.OST = 1;
      EDIS;
      
      


    //============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    //不再需要。
    //============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

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

    Daniel:

    您似乎正在寻找比较器1的直接输出。  如果您查看 TRM 中的 GPIO MUX 表、则可以在任何具有比较器输出的 GPIO 上配置用于 COMP1OUT 的 MUX。  因此、如果您将 GPIO1多路复用器设置从0b01 (ePWM)更改为0b11 (COMP1OUT)、您应该能够直接在 GPIO1而不是 EPWM1B 上看到比较器输出。

    由于 EPWM1A 配置为通过从未清除的单次触发(OST)对比较器做出反应、因此 GPIO0输出在跳闸后保持高电平。  清除跳闸状态的代码在 epwm1_tzint_isr()中注释掉。  实施斜坡发生器时、您可能需要逐周期(CBC)跳闸。

    Tommy

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

    Tommy、您好、感谢您的帮助。 现在我可以使用比较器、但不能使用斜坡、我想看到我的 PWM 信号、但由于降低了斜坡值、它太小了、我已经使用了一些值、但仍然看不到例如0.99占空比 PWM 信号。 这是我的代码、您能检查一下它吗?请告诉我为什么在 GPIO1中看不到良好的 PWM? 谢谢:

    #include "DSP28x_Project.h"//器件头文件和示例 include 文件

    void main (void)


    InitSysCtrl();

    Dint;

    InitPieCtrl();

    IER = 0x0000;
    IFR = 0x0000;

    InitPieVectTable();


    EALLOW;

    EPwm1Regs.TBPRD = 903;  


    EPwm1Regs.CMPA.half.CMPA = 100;  
    EPwm1Regs.TBPHS.Half.TBPHS = 0;//将相位寄存器设置为零
    EPwm1Regs.TBCTR = 0;//清除 TB 计数器
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//非对称模式
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//相位加载被禁用
    EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;// TBCLK = SYSCLK
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
    EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;

    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;// CTR 上的负载=零
    EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;//将 PWM1A 设置为零
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;

    SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;//启用 ADC 时钟


    AdcRegs.ADCCTL1.bit.ADCBGPWD = 1;//比较器共享 ADC 的内部 BG 参考、即使 ADC 未使用也必须被加电


    DELAY_US (1000);//加电延迟


    SysCtrlRegs.PCLKCR3.bit.COMP1ENCLK = 1;//启用到比较器1块的时钟


    Comp1Regs.COMPCTL.bit.COMPDACEN = 1;//本地加电比较器1

    //Comp1Regs.COMPCTL.bit.COMPSOURCE = 1;//引脚类比 B
    Comp1Regs.COMPCTL.bit.COMPSOURCE = 0;//DAC 内部否

    COMP1Regs.DACCTL.bit.DACSOURCE=1;//DAC 内部无 Rampa

    // Comp1Regs.DACCTL.bit.DACSOURCE=0;// DAC 无实例

    //Comp1Regs.DACVAL.bit.DACVAL = 512;//将 DAC 输出设置为中点

    COMP1Regs.DACCTL.bit.RAMPSOURCE=0;//Asigna PWMSYNC1

    Comp1Regs.RAMPDECVAL_Shdw=10000;//Pendiente.
    COMP1Regs.RAMPMAXREF_Shdw=30000;//最大值


    GpioCtrlRegs.GPAMUX1.bit.GPIO1=11;//GPIO1 COMPOUT
    GpioCtrlRegs.GPAMUX1.bit.GPIO0=1;//观察同步信号


    EDIS;

    for (;;)

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

    您应该仔细检查 MUX 设置。 看起来您是写入十进制11和01、而不是二进制0b11和0b01。

    如果您需要更长的占空比、则可以减小 DECVAL。 使用您的电流设置、您将在3个周期内跳闸、即使在 COMP1A 上施加0V 电压也是如此。

    Tommy
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好 Tommy。 我不知道 DECVAL 的工作原理、因此无法计算要使用的值。 如果我想在斜坡中使用一个周期为10us 的(3.3V)/(10us)斜率、您能告诉我我必须使用什么 DECVAL 吗? (100kHz)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Daniel:

    TRM 中记录了斜坡发生器 。  最好您详细了解如何为您的特定系统配置它、因为您很可能需要在第一次通过后优化设置。  简 而言之、RAMPSTS 寄存器由 RAMPMAXREF 初始化、并在每个时钟周期由 RAMPDECVAL 递减、直到产生复位事件。

    Tommy

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

    是的、Tommy、知道我看到了什么错误。 当 DAC 等于 RAMPSTS 时、RAMPSTS 再次为 RAMPMAXREF。 我需要一个信号、该信号的值在 RAMPSTS 大于 DAC 之前为高电平、在 RAMPSTS 小于 DAC 之后为低电平(在 cmparation 之后)。

    你可以帮帮我吗? 我想是有触发器的

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

    我不关注您的问题。 DAC 值直接来源于 RAMPSTS。

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

    Tommy 问题是 、当基准电压高于斜坡且 COMPSTS 只是一个脉冲信号时、RAMPSTS 变为高电平。 我希望 PWM 在第一次交叉后处于低电平。 简而言之。 当斜坡较高时、我希望 COMPSTS 为高电平; 当 COMPSTS 穿越时间后、我希望它们为低电平。

    我已经尝试这么做了几周、但斜坡发生器相比起来非常疯狂

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

    斜坡发生器旨在遵循 PCMC 应用的非常具体的状态机行为(包括跳闸响应)、并且不能偏离太大。 我想您可能会通过不使用斜坡发生器而获得更大的成功。

    您是否能够使用 CPU 或 CLA 定期更新 DAC 值以生成您自己的自定义斜坡、然后使用 COMPCTL[CMPINV]位反转比较器输出以满足您所需的行为?

    Tommy