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/LAUNCHXL-F2.8377万S:抖动HRPWM上升计数模式

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/576919/ccs-launchxl-f28377s-jitter-hrpwm-up-count-mode

部件号:LAUNCHXL-F2.8377万S

工具/软件:Code Composer Studio

您好,

我想在每个中断期间更新TBPRD TBPRDHR CMPA CMPAHR寄存器。 但我有一个+-1周期抖动的问题。 在技术参考手册p 1744/2352中2352中我找到了

当启用高分辨率周期模式时,EPWMxSYNC脉冲将引入+/- 1 - 2
对PWM循环抖动(加载计数模式下的+/- 1循环和加减计数中的+/- 2循环)
模式)。 因此,TBCTL[SYNCOSEL]不应设置为1 (CTR =0为
EPWMxSYNCO源)或2 (CTR = CMBB为EPWMxSYNCO源)。 否则,抖动
将在同步脉冲的每个PWM循环上发生。
当TBCTL[SYNCOSEL]= 0 (EPWMxSYNCI是EPWMxSYNCO源)时,是一个软件
在高分辨率初始化期间,同步脉冲只能发出一次。
如果在PWM运行时应用软件同步脉冲,则抖动将出现在上
同步脉冲时的PWM输出。

我的设置为:

	//抖动
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;

//使用HRPWM的ePWM通道寄存器配置
EPwm2Regs.TBCTL.bit.PRDLD = TB_shadow; //设置阴影加载TBPRD寄存器在时基计数器为零时从阴影寄存器加载
EPwm2Regs.TBPRD =周期1; // PWM频率= 1/周期
EPwm2Regs.CMPA.bit.CMPA =周期/ 2; //初始设置占空比50 %
EPwm2Regs.CMPA.bit.CMPAHR =(1 <8); //初始化HRPWM扩展

// zweiten中断生成器
EPwm2Regs.CMPB.Bit.CMPB =周期/ 20;//初始设置占空比5 %
//EPwm2Regs.CMPB.all ||(1 << 8); //初始化HRPWM扩展

EPwm2Regs.TBPHS.ALL = 0;
EPwm2Regs.TBCTR = 0;							// Time_base计数器等于零| Zaehler auf null setzen

EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; //计数模式

EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;		//不要从时基相寄存器(TBPHS)加载时基计数器(TBCTR)。
//抖动
//EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;			//测试

//EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;//EPWMXSYNCO由TBCTL2[SYNCOSELX]|JITTERvermeidung nicht auf 1 oder 2 setzten定义
//抖动
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;

EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; //
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1; // Setzt man HSPCLKDIV CLKDIV auf Teiler 1.
											// Dann ist SYSCLK=TBCLK -> T_SYSCLK =T_TBCLK

EPwm2Regs.TBCTL.bit.FREE_SOFT = 11;				//选择ePWM的行为
												//仿真事件期间的时基计数器

EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR _PRD;	// UP计数模式bei CTR = PRD满载S1744参考手册
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHAMODE;		//用作双缓冲区。 所有通过CPU进行的写入都访问卷影寄存器


EPwm2Regs.AQCTLA.bit.ZRO = AQ_SET; //当TBCTR = 0 -> 10时的操作:设置:强制EPWMxA输出高
EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;			// Setze EPWM2A bei TBCTR = CMPA auf LOW

EALLOW;
EPwm2Regs.HRCNFG.all = 0x0;						//首先清除所有位
//EPwm2Regs.HRCNFG.bit.EDGMODE = HR_FEP; //在下降边缘上进行MEP控制
EPwm2Regs.HRCNFG.bit.EDGMODE = HR_BEP;			// MEP控制两条边
EPwm2Regs.HRCNFG.bit.CTLMODE = HR_CMP;			// CMPDHR/TBPRDHR控制MEP



//EPwm2Regs.HRCNFG.bit.HRLOAD = HR_CTR归零;		// CTR Zero上的影子负载
EPwm2Regs.HRCNFG.bit.HRLOAD = HR_CTR PRD;		//模拟zu LOADAMODE
EPwm2Regs.HRCNFG.bit.AUTOCONV = 1; //启用自动转换逻辑MEP SFO


EPwm2Regs.HRPCTL.bit.HRPE = 1;					//打开高分辨率周期控制。


EPwm2Regs.DBCTL.bit.out模式= DB_FULL启用;//启用上升边缘延迟和下降边缘延迟
EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // 10:有源高互补(AHC)。 EPWMxB反转。
EPwm2Regs.DBCTL.bit.in_mode = DBA_All; //死带输入模式控制:EPWMxA是上升和下降边缘的来源
EPwm2Regs.DBRED = EPWM2_DB; //上升边缘延迟值
EPwm2Regs.DBFED = EPWM2_DB; //下降边缘延迟值


// ADC versuch einen中断zu erzeugen adca1_ISR
EPwm2Regs.ETSEL.bit.SOCAEN = 0;//禁用组上的SOC
EPwm2Regs.ETSEL.bit.SOCASEL = ET_CTRU_CMBB;//当计数器= CMBB时,选择SOC on up-count (计数器= CMBB)
EPwm2Regs.ETPS.bit.SOCAPRD = 1; //在第一个事件上生成脉冲


EPwm2Regs.ETSEL.bit.INTSEL = ET_CTRU_CMBB;
EPwm2Regs.ETSEL.bit.inten = 1; //启用INT
EPwm2Regs.ETPS.bit.INTPRD = ET_1st; //在第一个事件上生成INT


EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
EPwm2Regs.TBCTL.bit.SWFSYNC = 1; //同步高
//解析阶段至
//开始HR期间


EDIS;
}

这种抖动的原因是什么?为什么在我的示例中HRPWM_PRDUPDOWN SFO_cpu01没有抖动?

我是否应该使用向上-向下-计数模式?

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

    在高分辨率周期模式下,HRLOAD/HRLOADB位应设置为2,以便在CTR =0和CTR = PRD上加载。 您是否尝试过此操作?

    谢谢!
    伊丽莎白
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢Elizabeth,
    我会试试这个。 但使用HRPWM和死区模块是否存在问题?
    EPWMxSYNC脉冲何时发生?

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

    抖动仍然存在。

    我尝试在中断中设置TBPRD和TBPRDHR寄存器。 发生抖动。

    然后我在主菜单中设置了TBPRD和TBPRDHR。 未发生抖动。

    在中断中设置这些寄存器似乎是问题所在。 有人能证实这一点吗? 是否有类似的问题?
    如何解决此问题? 因为我想使用HRPWM进行周期控制。


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

    另一个建议是考虑触发PWM中断的其他事件,而不是当前在TBCTR = CMBB上触发的设置。 您是否尝试过设置INTSEL,以便在1) TBCTR = 0,2) TBCTR = TBPRD,3) TBCTR = TBPRD /TBCTR = 0上生成中断?

    将死区模块与HRPWM一起使用应该不会有问题。 您面临的问题是什么-您是否未看到指定的延迟?

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

    我正在尝试为LLC半桥创建PWM信号。 我遇到的问题是,当我在中断中更新TBPRDHR时,存在大约一个ePWM时钟周期的抖动。 我可以看到示波器上的抖动。 我正在使用带Deadband的EPWM2A通道将其用于红色,并将此通道反转为有源高互补。 因此,EPWM2A和EPWM2B正在驾驶半桥。
    但我不知道抖动为什么会出现。 使用一个ePWM时钟周期的抖动时,HRPWM模块对我的应用毫无用处,因为我必须在每个周期更新HRPWM设置。
    如果不更新中断中的TBPRDHR寄存器,一切都正常。

    您还有其他建议,如何解决抖动问题?

    谢谢!
    Jonas
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    更新:我修改了HRPWM_PRDUPDOWN SFO示例,使抖动消除它似乎是死区模块


    这是配置:


    Void HRPWM_Config (句点)

    UINT16 j;

    //
    //采用HRPWM的ePWM通道寄存器配置
    // ePWMxA切换低/高,MEP控制在上升沿
    //
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;//在ePWM中禁用TBCLK
    EDIS;

    对于(j=1;j<PWM_CH;j++)

    EPwm2Regs.TBCTL.bit.PRDLD = TB_shadow;//设置阴影负载
    EPwm2Regs.TBPRD =周期; // PWM频率=1/(2*TBPRD)
    EPwm2Regs.CMPA.bit.CMPA =句点/ 2;//初始设置占空比50 %
    EPwm2Regs.CMPA.bit.CMPAHR =(1<8);//初始化HRPWM扩展
    EPwm2Regs.CMPB.Bit.CMPB =周期/ 2;//初始设置占空比50 %
    EPwm2Regs.CMPB.all |=1;
    EPwm2Regs.TBPHS.ALL = 0;
    EPwm2Regs.TBCTR = 0;

    EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UDOWN;//选择Up-Down
    //计数模式
    EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
    EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1; // TBCLK = SYSCLKOUT
    EPwm2Regs.TBCTL.bit.FREE_SOFT = 11;

    EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//在CTR = 0上加载CMPA
    EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
    EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHAME;
    EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADO;

    EPwm2Regs.AQCTLA.bit.CAU = AQ_SET; // PWM切换高/低
    EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;
    EPwm2Regs.AQCTLB.bit.CBU = AQ_SET; // PWM切换高/低
    EPwm2Regs.AQCTLB.bit.CBD = AQ_CLEAR;

    EALLOW;
    EPwm2Regs.HRCNFG.ALL = 0x0;
    EPwm2Regs.HRCNFG.bit.EDGMODE = HR_BEP; // MEP控制开启
    //两条边线。
    EPwm2Regs.HRCNFG.bit.CTLMODE = HR_CMP; // CMPAHR和TBPRDHR
    // HR控制。
    EPwm2Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO_PRD;//在CTR上加载= 0
    //和CTR = TBPRD
    EPwm2Regs.HRCNFG.bit.EDGMODEB = HR_BEP; // MEP控制开启
    //两条边线
    EPwm2Regs.HRCNFG.bit.CTLMODEB = HR_CMP; // CMPBHR和TBPRDHR
    // HR控制
    EPwm2Regs.HRCNFG.bit.HRLOADB = HR_CTR_ZERO_PRD;//在CTR上加载= 0
    //和CTR = TBPRD
    EPwm2Regs.HRCNFG.bit.AUTOCONV = 1; //为启用自动转换
    // HR期间

    EPwm2Regs.HRPCTL.bit.TBPHSHRLOADE = 1;//启用TBPHSHR同步
    //(对于上一个上一个上一个上一个上一个上
    //计数HR控制)
    EPwm2Regs.HRPCTL.bit.HRPE = 1; //打开高分辨率
    //期间控制。

    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1; //在中启用TBCLK
    // ePWM
    EPwm2Regs.TBCTL.bit.SWFSYNC = 1; //同步高
    //解析阶段至
    //开始HR期间
    EDIS;
    }

    //有源低互补PWM -设置死区|图13-33技术参考手册
    EPwm2Regs.DBCTL.bit.out模式= DB_FULL启用;//启用上升边缘延迟和下降边缘延迟
    EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //极性选择控制EPWMxB反转|| 10:有源高互补(AHC)。
    EPwm2Regs.DBCTL.bit.in_mode = DBA_All; //死带输入模式控制:EPWMxA是上升和下降边缘的来源
    EPwm2Regs.DBRED = 10; //上升边缘延迟值
    EPwm2Regs.DBFED = 10; //下降边缘延迟值
    }


    是否有人对死区模块有同样的问题?
    如何创建无死区模块的反向通道?

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

    C2000Ware示例HRPWM_DEADBACDE_SFO_V8显示了如何与HRWPM一起使用DEADBAND。
    此示例设置DBCTL寄存器中的其他位。 它启用DBRED/DBFED的阴影模式并设置加载模式以将阴影寄存器值传输到CTR =0上的活动寄存器。 如果您的项目还将在某个点启用HR死区,则应启用半循环。

    (* ePWM[PWM2]).DBCTL.bit.SHDWDBREDMODE = 1;
    (* ePWM[PWM2]).DBCTL.bit.SHDWDBFEDMODE = 1;
    (* ePWM[PWM2]).DBCTL.bit.LOADREDMODE = 0;
    (* ePWM[PWM2]).DBCTL.bit.LOADFEDMODE = 0;
    (* ePWM[PWM2]).DBCTL.bit.HALFCYCLE = 1;

    您可以在以下网址安装C2000Ware: www.ti.com/.../c2000ware
    示例位于以下目录中:
    C:\ti\c2000Ware_1_00_00\DEVICE_support\f2837xs+示2837示例\CPU1\HRPWM_DEADBACDE_SFO_V8\cpu01

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

    你好,Elizabeth,

    感谢您的快速回复。 我将示例加载到CCS。 顺便说一下,我使用的是6.2 .0.0.005万 版。  我尝试调试该示例,因此我做了一些小改动。 期间应始终相同。

    首先,我在预定义符号中添加了_LAUNCHLL_F2.8377万S。

    我更改了以下代码:

    L.243  HRPWM1_Config (50);

    L.244  HRPWM2_Config (50);

    L.263  UpdateFine = 1;             //禁用连续更新

    L.264  周期= 50;

    L.265  PeriodFine = 6万;

    L.609  //    UpdateFine = 0;

    其他设置也是相同的。

    我在示波器上查看了结果。 期间仍有抖动,无法测量6万的高分辨率(约18ns)。

    是否可以再现抖动? 您是否知道在这种情况下发生这种情况的原因? 为什么启用了HRPWM周期,但似乎禁用了该周期?

    非常感谢,

    Jonas

    //###################################################################
    //
    //文件:HRPWM_DEADBAND SFO_V8.c
    ////
    标题:F2837xS器件HRPWM SFO V8高分辨率死带
    // (向上-向下计数)示例
    ////
    ! \addtogroup cpu01_example_list
    //! <H1>HRPWM死区示例(HRPWM_DEADBACDE_SFO_V8)</H1>//!
    此程序需要F2837xS头文件,包括
    //! 此示例需要以下文件:
    //! SFO_V8.h和SFO_V8_FPU_lib_build_c28.lib
    //!
    //! 在示波器上监控ePWM1和ePWM2 A/B针脚
    //!
    //! 描述:
    //!
    //! 此示例在保持
    //!占空比的同时扫描ePWM频率。 ~ePWM上下计数模式下的50 %。 此外,此示例还演示
    了//! 利用HRPWM
    //!的ePWM高分辨率死区(HRDB)功能 相应ePWM模块的扩展。
    //!
    //! 此示例调用以下TI的微边定位器(MEP)标度
    //! 因子优化器(SFO)软件库V8函数:
    //!
    //! b int \b SFO ();\n
    //! 当HRPWM正在使用
    时动态更新MEP_ScaleFactor //! 更新HRMSTEP寄存器(仅存在于EPwm1Regs寄存器空间)
    //! 更新MEP_ScaleFactor值
    //! -如果指定通道
    //不完整,则返回0! -当为指定通道完成
    时返回1 //! -如果错误:MEP_ScaleFactor大于最大值255
    //,则返回2 (在这种情况下,自动转换可能无法正常工作)
    //!
    //! 此示例旨在演示HRPWM控制
    //! 死区下降边缘延迟(FED)和上升边缘延迟(红色)。
    //!
    //! ePWM1和ePWM2 A/B通道由于HRPWM
    //! 控制。
    //!
    //!=========================================================================================================================================
    //! 注:有关使用SFO软件库的详细信息,请参阅
    //! //!中的F2837xS高分辨率脉宽调制器(HRPWM)一章
    技术参考手册。
    //!=========================================================================================================================================
    //!
    //! 要加载并运行此示例:
    //! -#**!!!重要!!**-在SFO_V8.h中,将PWM_CH设置为
    最大数目//! HRPWM通道加一个。 例如,对于F2837xS,
    //! HRPWM通道的最大数量为8。 8+1=9,因此设置
    //! 在SFO_V8.h中#define PWM_CH 9 (默认值为8)
    //! -#在最大SYSCLKOUT
    //下运行此示例! -#激活实时模式
    //! -#从脚本控制台运行“AddWatchWindowVars_HRPWM.js”脚本
    //! (查看->脚本控制台)使用
    //! 命令:
    //! JSloadFile <path_to_JS_file>/AddWatchWindowVars_HRPWM.js
    //! -#运行代码
    //! -#在示波器上观看ePWM A / B通道波形
    //! -#在监视窗口中:
    //! 将变量InputPeriodInc更改为增加或降低频率
    //! 扫描速率。 设置InputPeriodInInc =0将停止扫描,同时
    //! 允许实时处理和更新其他变量。
    //! -#在监视窗口中:
    //! 将寄存器EPwm1Regs.DBRED/EPwm2Regs.DBRED的值更改为查看
    //! ePWM1和ePWM2上升边缘死区的变化。
    //! 或者,更改寄存器
    //!的值 EPwm1Regs.DBFED/EPwm2Regs.DBFED将更改//的跌落边缘死区!
    ePWM1和ePWM2。 更改这些值将改变占空比
    //! 其各自ePWM模块的百分比。
    //! **!NOTE !!**- DBRED/DBFED值绝不能设置为低于4。
    //! 请勿将这些值设置为0,1,2或3。
    //! -#在监视窗口中:
    //! 更改寄存器//!的值
    EPwm1Regs.DBREDHR.Bit.DBREDHR/EPwm2Regs.DBREDHR.Bit.DBREDHR增加
    //! 或者在
    //! 死区上升边缘。 或者,更改
    //! EPwm1Regs.DBFEDHR.bit.DBFEDHR/EPwm2Regs.DBFEDHR.bit.DBFEDHR要更改
    //! ePWM1
    //! 和ePWM2。
    //
    //###########################################################################
    //$TI发布:F2837xS支持库v 3.00 .00.00 $//
    发布日期:星期三1月25日16:06:35 CST 2017 $//
    $Copyright:
    //版权所有(C) 2014-2017德州2017德州仪器(TI)公司- http://www.ti.com/
    ////
    
    允许以源代码和二进制形式重新发布和使用,无论是否修改//,只要
    满足以下条件//:
    ////
    重新分发源代码必须保留上述版权
    声明,此条件列表和以下免责声明。
    ////
    以二进制格式重新发布必须在
    
    //发布时提供的文档和/或其他材料中复制上述版权//声明,此条件列表和以下免责声明
    。
    ////
    未经
    
    明确的事先书面许可,不得使用德州仪器(TI)公司的名称或//其贡献者的名称来支持或促销从本软件派生的//产品。
    ////
    本软件由版权所有者和贡献者提供
    //“按原样”,
    
    不提供任何明示或暗示的担保,包括但不限于适销性和适用于//特定目的的暗示担保。 在任何情况下,版权
    //所有者或贡献者均不对任何直接,间接,附带,
    //特殊,示范, 或相应的损害(包括但不
    限于购买替代产品或服务;使用损失,
    //数据或利润); (包括
    
    疏忽或其他原因),但由于使用
    //本软件而导致的任何责任理论,无论是合同,严格责任还是侵权//(包括疏忽或其他),即使被告知可能会造成此类损害。
    //$//#############################################################################################################.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.
    
    
    //
    //包含的文件
    //
    #include "F28x_Project.h"
    #include "SFO_V8.h"
    
    //
    定义
    //
    #define PWM_CH 9 // PWM通道数+ 1
    #定义HR_ENABLED 1 // 1 = HR行为
    // 0 =非HR行为
    
    //
    //全局
    //
    UINT16更新,状态;
    UINT16 temp_REM2 =0,temp_PHS2,PhaseFine2;
    
    UINT32 CountUpdatefinine =0,CountUpdateMax =0;
    UINT16期间=0,PeriodFine =0,PeriodOdd =0;
    
    PeriodInInd Increment =0
    ;UINT32 Ind = 0
    UINT16 PWM1 = 1;
    UINT16 PWM2 = 2;
    UINT16 PeriodMax = 600,PeriodMin = 360;
    
    ////
    ePWM寄存器结构指针数组:
    //*ePWM[0]定义为示例
    中未使用的伪值//
    volatile struct ePWM_regs *ePWM[PWM_CH]=
    {&EPwm1Regs,&EPwm1Regs,&EPwm2Regs,&EPwm3Regs,&EPwm4Regs,
    &EPwm5Regs,&EPwm6Regs,&EPwm7Regs,&EPwm8Regs};
    int MEP_ScaleFactor;
    
    ////
    函数原型
    //
    void HRPWM1_Config(int);
    void HRPWM2_Config(int);
    void Freqctl_func(void);
    interrupt void PRDEQfix_ISR(void);
    void error(void);
    
    ////
    主
    //
    void主菜单(void){
    
    //
    //初始化控制和模拟子系统的系统控制。
    //启用外设时钟。
    //此示例函数可在F2837xS_sysctrl.c文件中找到。
    //
    InitSysCtrl();
    
    EALLOW;
    ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV = 1;
    EDIS;
    
    //
    //禁用CPU中断
    //
    色调;
    
    //
    //将PIE控件寄存器初始化为其默认状态。
    //默认状态是禁用所有PIE中断和标志
    //被清除。
    //此函数位于F2837xS_PIECTRL.c文件中。
    //
    InitPieCtrl();
    
    //
    //禁用CPU中断并清除所有CPU中断标志
    //
    IER = 0x0000;
    IFR = 0x0000;
    
    //
    //使用指向外壳中断的指针初始化PIE矢量表
    //服务例程(ISR)。
    //这将填充整个表,即使中断也是如此
    //在本例中不使用。 这对于调试非常有用。
    // shell ISR例程位于F2837xS_DefaultIsr.C.中
    //此函数位于F2837xS_PieVect.C.中
    //
    InitPieVectorTable();
    
    //
    //在PIE矢量表中设置ISR的地址
    //
    EALLOW;
    PieVectorTable.EPWM1_INT =&PRDEQfix_ISR;
    EDIS;
    
    //
    //调用SFH()以校准更新HRMSTEP寄存器
    // MEP_ScaleFactor。 HRMSTEP必须填入比例因子值
    //在启用高分辨率期间控制之前。
    //
    状态= SFO_INCOMPLETE;
    while (status == SFO_INCOMPLETE)
    {
    //
    //呼叫直至完成
    //
    状态= SFA();
    IF (状态== SFO_ERROR)
    {
    错误();
    }
    }
    
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    EDIS;
    
    //
    //初始化HRPWM1/HRPWM2
    //
    Initepwm1gpio();
    Initepwm2gpio();
    HRPWM1_Config (50);
    HRPWM2_Config (50);
    
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;//重新同步PWM时基时钟
    (*ePWM[PWM1]).GLDCTL2.bit.OSHTLD = 1;//这也应该写入
    // PWM2的GLDCTL2
    EDIS;
    
    //
    //将ePWM1配置为在期间匹配时生成中断
    //
    (*ePWM[PWM1]).ETSEL.bit.INTSEL = 1;//计数器零匹配时中断
    (* ePWM[PWM1]).ETSEL.bit.inten = 1; //启用外设中断
    (* ePWM[PWM1]).ETPS.bit.INTPRD = 1; //在每个事件上生成中断
    PieCtrlRegs.PIEIER3.bit.INTx1 = 1; //在PIE中启用ePWM1中断
    
    IER |= 0x0004; //启用核心INT #3
    EINT; //清除全局中断掩码
    
    UpdateFine = 1; //禁用连续更新
    周期=50;
    PeriodFine = 6万;
    CountUpdateMax = 0x0FFFF;
    CountUpdateFine = CountUpdateMax;
    
    //
    //监视窗口变量,用于修改频率扫描的速率
    //
    InputPeriodInc =6553;
    
    对于(;;)
    {
    while (UpdateFine == 0)
    {
    IF (CountUpdateFine >= CountUpdateMax)
    {
    IF (期间<期间最大值)
    {
    //
    //执行扫描
    //
    PeriodIncrement = InputPeriodInc >> 16;
    PeriodFineIncrement =(UINT16) InputPeriodIn;
    期间=期间+期间增量;
    PeriodFine_temp =(UINT32) PeriodFine +
    (UINT32)定期财务增量;
    IF (PeriodFine_temp >= 0x1万)
    {
    PeriodFine_temp = PeriodFine_temp - 0x1万;
    句点=句点+ 1;
    }
    
    //
    //期间奇数- 50 % 关税的CMP除以2
    //
    如果(期间% 2 = 1)
    {
    PeriodOdd =1;}
    
    否则
    {
    PeriodOdd =0;}
    
    
    PeriodFine =(UINT16) PeriodFine_temp;
    
    //
    //更新非零增量的PWM值
    //
    IF (InputPeriodIn!=0)
    {
    Freqctl_func();
    }
    }
    否则
    {
    Period = PeriodMin;
    PeriodFine = 0;
    IF (InputPeriodIn!=0)
    {
    Freqctl_func();
    }
    }
    CountUpdateFine = 0;
    }
    CountUpdateFine ++;
    }
    }
    }////
    
    
    HRPWM1_Config -使用HRPWM
    //的ePWM1寄存器配置 ePWM1A在上升沿//
    
    void HRPWM1_Config (PeriodConfig)
    {
    (* ePWM[PWM1]).tbctl.bit.PRDLD = TB_shadow;//设置立即加载
    
    //
    // PWM频率= 1/ PeriodConfig
    //
    (*ePWM[PWM1]).TBPRD = PeriodConfig;
    
    //
    //初始设置占空比50 % 并初始化HRPWM扩展
    //
    (* ePWM[PWM1]).CMPA.bit.CMPA = PeriodConfig / 2;
    (* ePWM[PWM1]).CMPA.bit.CMPAHR =(1 < 8);
    (* ePWM[PWM1]).CMPB.bit.CMBB = PeriodConfig / 2;
    (* ePWM[PWM1]).CMPB.bit.CMPHR =(1 <8);
    (* ePWM[PWM1]).TBPHS.ALL = 0;
    (* ePWM[PWM1]).TBCTR = 0;
    
    (* ePWM[PWM1]).TBCTL.bit.CTRMODE = TB_COUNT_UDOWN;
    (* ePWM[PWM1]).TBCTL.bit.PHSEN = TB_DISABLE;// ePWM1是主中继器
    (* ePWM[PWM1]).TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
    (* ePWM[PWM1]).TBCTL.bit.HSPCLKDIV = TB_DIV1;
    (* ePWM[PWM1]).TBCTL.bit.CLKDIV = TB_DIV1;
    
    //
    //在CTR上加载CMPA = ZERO_PRD
    //
    (* ePWM[PWM1]).CMPCTL.bit.LOADAMODE = CC_CTR_ZERO_PRD;
    (* ePWM[PWM1]).CMPCTL.bit.LOADBMODE = CC_CTR_ZERO_PRD;
    
    (* ePWM[PWM1]).CMPCTL.bit.SHDWAMODE = CC_SHAMODE;
    (* ePWM[PWM1]).CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    
    (* ePWM[PWM1]).AQCTLA.bit.CAU = AQ_SET;
    (* ePWM[PWM1]).AQCTLA.bit.CAD = AQ_CLEAR;
    
    EALLOW;
    #IF HR_ENABLED
    (* ePWM[PWM1]).HRCNFG.ALL = 0x1353;
    
    //
    //打开高分辨率周期控制
    //
    (* ePWM[PWM1]).HRPCTL.bit.HRPE = 1;
    
    //
    //将高分辨率相位同步到开始HR周期
    //
    (* ePWM[PWM1]).TBCTL.bit.SWFSYNC = 1;
    #endif
    
    (* ePWM[PWM1]).GLDCFG.bit.CMPA_CMPAHR = 1;
    (* ePWM[PWM1]).GLDCFG.bit.CMPB_CMPHR = 1;
    
    //
    // CTR上的负载= ZERO_PRD (2)/零(1)
    //
    (* ePWM[PWM1]).GLDCTL.bit.GLDMODE = 2;
    
    //
    //启用单触发模式和全局加载
    //
    (* ePWM[PWM1]).GLDCTL.bit.OSAHTMODE = 1;
    (* ePWM[PWM1]).GLDCTL.bit.GLD = 1;
    
    //
    //写入PWM1 GLDCTL2将导致同时写入PWM2 GLDCTL2
    //
    (* ePWM[PWM1]).EPWMXLINK.bit.GLDCTL2LINK = PWM1 - 1;
    (* ePWM[PWM1]).DBCTL.bit.out模式= DB_FULL启用;
    (* ePWM[PWM1]).DBCTL.bit.POLSEL = DB_ACTV_HIC;
    (* ePWM[PWM1]).DBCTL.bit.in_mode = DBA_ALL;
    (* ePWM[PWM1]).DBCTL.bit.SHDWDBREDMODE = 1;
    (* ePWM[PWM1]).DBCTL.bit.SHDWDBFEDMODE = 1;
    (* ePWM[PWM1]).DBCTL.bit.LOADREDMODE = 0;//加载计数器== 0
    (* ePWM[PWM1]).DBCTL.bit.LOADFEDMODE = 0;// Load on Counter == 0
    (* ePWM[PWM1]).DBCTL.bit.HALFCYCLE = 1;
    (* ePWM[PWM1]).DBRED.bit.DBRED = 4;
    (* ePWM[PWM1]).DBREDHR.bit.DBREDHR = 0x0;
    (* ePWM[PWM1]).DBFED.bit.DBFED = 4;
    (* ePWM[PWM1]).DBFEDHR.bit.DBFEDHR = 0x0;
    
    (* ePWM[PWM1]).HRCNFG2.bit.EDGMODEDB = HR_BEP;// DBREDHR和DBFEDHR
    (* ePWM[PWM1]).HRCNFG2.bit.CTLMODEDBRED = 0;// ZRO上的负载
    (* ePWM[PWM1]).HRCNFG2.bit.CTLMODEDBED = 0;// ZRO上的负载
    (* ePWM[PWM1]).DBREDHR.bit.DBREDHR =(0 <9);
    
    EDIS;
    }////
    
    
    HRPWM2_Config -使用HRPWM
    //的ePWM2寄存器配置 ePWM2A在上升沿上使用MEP控件切换低/高
    //
    void HRPWM2_Config (PeriodConfig)
    {
    (* ePWM[PWM2]).tbctl.bit.PRDLD = TB_shadow;//设置立即加载
    
    //
    // PWM频率= 1/ PeriodConfig
    //
    (*ePWM[PWM2]).TBPRD = PeriodConfig;
    
    //
    //初始设置占空比50 % 并初始化HRPWM扩展
    //
    (* ePWM[PWM2]).CMPA.bit.CMPA = PeriodConfig / 2;
    (* ePWM[PWM2]).CMPA.bit.CMPAHR =(1 < 8);
    (* ePWM[PWM2]).CMPB.bit.CMBB = PeriodConfig / 2;
    (* ePWM[PWM2]).CMPB.bit.CMPHR =(1 < 8);
    (* ePWM[PWM2]).TBPHS.ALL = 0;
    (* ePWM[PWM2]).TBCTR = 0;
    
    (* ePWM[PWM2]).TBCTL.bit.CTRMODE = TB_COUNT_UDOWN;
    (* ePWM[PWM2]).TBCTL.bit.PHSEN = TB_DISABLE;// ePWM1是主中继器
    (* ePWM[PWM2]).TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
    (* ePWM[PWM2]).TBCTL.bit.HSPCLKDIV = TB_DIV1;
    (* ePWM[PWM2]).TBCTL.bit.CLKDIV = TB_DIV1;
    
    //
    //在CTR = 0上加载CMPA
    //
    (* ePWM[PWM2]).CMPCTL.bit.LOADAMODE = CC_CTR_ZERO_PRD;
    (* ePWM[PWM2]).CMPCTL.bit.LOADBMODE = CC_CTR_ZERO_PRD;
    (* ePWM[PWM2]).CMPCTL.bit.SHDWAMODE = CC_SHAMODE;
    (* ePWM[PWM2]).CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    
    (* ePWM[PWM2]).AQCTLA.bit.CAU = AQ_SET;
    (* ePWM[PWM2]).AQCTLA.bit.CAD = AQ_CLEAR;
    
    EALLOW;
    #IF HR_ENABLED
    (* ePWM[PWM2]).HRCNFG.ALL = 0x1353;
    
    //
    //打开高分辨率周期控制
    //
    (* ePWM[PWM2]).HRPCTL.bit.HRPE = 1;
    
    //
    //将高分辨率相位同步到开始HR周期
    //
    (* ePWM[PWM2]).TBCTL.bit.SWFSYNC = 1;
    #endif
    
    (* ePWM[PWM2]).tbctl.bit.PHSDIR = 1; //同步事件后计数
    (* ePWM[PWM2]).TBPHS.bit.TBPHS = 180;
    
    (* ePWM[PWM2]).GLDCFG.bit.CMPA_CMPAHR = 1;
    (* ePWM[PWM2]).GLDCFG.bit.CMPB_CMPHR = 1;
    
    //
    // CTR上的负载= ZERO_PRD (2)/零(1)
    //
    (* ePWM[PWM2]).GLDCTL.bit.GLDMODE = 2;
    
    //
    //启用单触发模式和全局加载
    //
    (* ePWM[PWM2]).GLDCTL.bit.OSAHTMODE = 1;
    (* ePWM[PWM2]).GLDCTL.bit.GLD = 1;
    
    //
    //写入PWM1 GLDCTL2将导致同时写入PWM2 GLDCTL2
    //
    (* ePWM[PWM2]).EPWMXLINK.bit.GLDCTL2LINK = PWM1 - 1;
    (* ePWM[PWM2]).DBCTL.bit.out模式= DB_FULL启用;
    (* ePWM[PWM2]).DBCTL.bit.POLSEL = DB_ACTV_HIC;
    (* ePWM[PWM2]).DBCTL.bit.in_mode = DBA_ALL;
    (* ePWM[PWM2]).DBCTL.bit.SHDWDBREDMODE = 1;
    (* ePWM[PWM2]).DBCTL.bit.SHDWDBFEDMODE = 1;
    (* ePWM[PWM2]).DBCTL.bit.LOADREDMODE = 0;//加载计数器== 0
    (* ePWM[PWM2]).DBCTL.bit.LOADFEDMODE = 0;// Load on Counter == 0
    (* ePWM[PWM2]).DBCTL.bit.HALFCYCLE = 1;
    (* ePWM[PWM2]).DBRED.bit.DBRED = 4;
    (* ePWM[PWM2]).DBREDHR.bit.DBREDHR = 0x0;
    (* ePWM[PWM2]).DBFED.bit.DBFED = 4;
    (* ePWM[PWM2]).DBFEDHR.bit.DBFEDHR = 0x0;
    
    (* ePWM[PWM2]).HRCNFG2.bit.EDGMODEDB = HR_BEP;// DBREDHR和DBFEDHR
    (* ePWM[PWM2]).HRCNFG2.bit.CTLMODEDBRED = 0;// ZRO上的负载
    (* ePWM[PWM2]).HRCNFG2.bit.CTLMODEDBED = 0;// ZRO上的负载
    (* ePWM[PWM2]).DBREDHR.bit.DBREDHR =(0 <9);
    
    EDIS;
    }////
    
    
    Freqctl_func -调频和相位同步功能
    //仅当启用频率扫描
    时才调用此函数//
    void Freqctl_func (void)
    {
    IF (定期日)
    {
    //
    //如果期间为奇数,则添加0.5
    //
    (* ePWM[PWM1]).CMPA.bit.CMPAHR =(PeriodFine >> 1)+ 0x7FFF;
    (* ePWM[PWM2]).CMPA.bit.CMPAHR =(PeriodFine >> 1)+ 0x7FFF;
    (* ePWM[PWM1]).CMPB.bit.CMPHR =(PeriodFine >> 1)+ 0x7FFF;
    (*ePWM[PWM2]).CMPB.bit.CMPHR =(PeriodFine >>1)+ 0x7FFF;
    }
    否则
    {
    (* ePWM[PWM1]).CMPA.bit.CMPAHR = PeriodFine >> 1;
    (* ePWM[PWM2]).CMPA.bit.CMPAHR =周期性>> 1;
    (* ePWM[PWM1]).CMPB.bit.CMPHR =周期性>> 1;
    (*ePWM[PWM2]).CMPB.bit.CMPHR =周期性>> 1;
    }
    
    (* ePWM[PWM1]).CMPA.bit.CMPA =(句点>> 1)+ 1;
    (* ePWM[PWM2]).CMPA.bit.CMPA =(句点>> 1)+ 1;
    (* ePWM[PWM1]).CMPB.bit.CMBB =(句点>> 1)+ 1;
    (* ePWM[PWM2]).CMPB.bit.CMBB =(句点>> 1)+ 1;
    
    temp_PHS2 =(句点>> 1);
    
    交换机(PeriodOdd)
    {
    案例1:
    //
    //除以2的记帐= 0.5
    //
    PhaseFine2 = 0xFF -(PeriodFine >> 9)- 0x7F;
    中断;
    
    默认:
    PhaseFine2 = 0xFF -(PeriodFine >> 9);
    中断;
    }
    
    //
    //没有要考虑的分相位移
    //
    TEMP_REM2 =(UINT16) 0x100 + PhaseFine2;
    UpdateFine =1;}////
    
    
    
    
    PRDEQfix_ISR -转换器余数计算的ISR
    //
    中断无效PRDEQfix_ISR(void){
    
    EALLOW;
    IF (UpdateFine == 1)
    {
    //
    //这也应该写入PWM2,PWM3和PWM4的GLDCTL2
    //
    (* ePWM[PWM1]).GLDCTL2.bit.OSAHTLD = 1;
    
    //
    // TBCTR同步相位负载(升压计数HR控制所需
    //
    (* ePWM[PWM2]).TBCTL.bit.PHSEN = TB_ENABLE;
    
    //
    //相对于ePWM1的粗相位偏移
    //
    (* ePWM[PWM2]).TBPHS.bit.TBPHS = temp_PHS2;
    (* ePWM[PWM2]).TRREM.bit.TRREM = temp_REM2;
    
    (*ePWM[PWM2]).tbPRDHR = PeriodFine;
    (*ePWM[PWM2]).TBPRD =周期;
    
    (* ePWM[PWM1]).TBPRDHR = PeriodFine;
    (*ePWM[PWM1]).TBPRD =周期;
    (* ePWM[PWM1]).TRREM.bit.TRREM = 0x100;
    // UpdateFine = 0;
    }
    否则
    {
    (*ePWM[PWM2]).TBCTL.bit.PHSEN = TB_DISABLE;
    }
    
    //
    //重新初始化下一个PWM中断
    //
    PieCtrlRegs.PIEACG.ALL = PIEACK_Group3; //确认PIE中断
    (* ePWM[PWM1]).ETCLR.bit.INT = 1; //清除中断位
    EDIS;
    }
    
    无效错误(void)
    {
    ESTOP0; //在此处停止并处理错误
    }////
    
    
    文件结尾
    //
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉,我忘记了提到我添加了c代码。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Jonas,

    您是否尝试过清除InputPeriodInc而不是更改UpdateFine的值? 如注释所说,InputPeriodInc设置频率扫描的速率。 当InputPeriodInc =0时,频率将保持不变,因此不应出现任何抖动。

    此外,HRPWM2_Config函数将TBPHS设置为180,但当您将初始TBPRD更改为50时,TBPHS最初应设置为25。

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

    I changed update fine do set *ePWM[PWM2]).TBPRDHR = PeriodFine every interrupt (我更改了更新,请设置*ePWM2].TBPRDHR =每中断一次 因为这是我的应用程序所需要的。
    我的目的是根据中断中的值TBPRDHR TBPRD CMPA和CMPAHR计算设置的期间值。 我尝试了几种不同的设置,但都失败了。 问题似乎是在将死区模块与HRPWM周期结合使用。

    我会再试一次,初始TBPHS值为25,但我很肯定结果会是一样的。

    通常不能设置每个中断的TBPRDHR吗?


    此致,

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

    我将TBHPS值更改为25,但对结果没有影响。
    我不设置InputPeriodInc =0,因为我要设置每个中断的HRPWM值。 如果我按照上述方式在每次中断中更改程序,TBPRDHR都会有一个“新”(设置始终相同)值。

    在使用Deadband时,通常是否可以在每个中断中设置HRPWM (TBPRD TBPRDHR CMPA CMPAHR)? 我尝试过不同的设置,但没有人能不抖动地运行。

    我要执行期间控制,因此必须更改中断中的值,而不是主中的值。
    您对此问题有什么建议吗?

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

    您可以修改ISR以取消对UpdateFine的检查,因此ePWM寄存器会在每次中断时更新,而不管UpdateFine的值如何。 这样,UpdateFine值可以在其他地方的逻辑中使用,但不能在ISR中使用。

    还将InputPeriodInc设置为0以确保频率扫描停止。

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

    你好,Elizabeth,

    我在你描述的过程中做到了。 但现在,三丁一氧化二氧化三代前三代人力资源的价值似乎没有增加到这一时期。 期间时间总是1.000 Us,但我想1.01 Us这样的东西,因为我改变 了PeriodFine =3.2万;看看HRPWM是否工作。

    与原始代码相比,我更改了以下内容:

       HRPWM1_Config (50);//!
       HRPWM2_Config (50);//!

      周期= 50;//!

      PeriodFine = 3.2万;//! 一个ePWM时钟步长中的大约一半->应为

      InputPeriodInInc = 0;//!

       (* ePWM[PWM2]).TBPHS.bit.TBPHS = 25;//!

    //

    // PRDEQfix_ISR -用于转换器余数计算的ISR

    //

    中断无效PRDEQfix_ISR(void)

      EALLOW;

    //  if (UpdateFine == 1)

    //  {

        //

        //这也应该写入PWM2,PWM3和PWM4的GLDCTL2

        //

        (* ePWM[PWM1]).GLDCTL2.bit.OSAHTLD = 1;

        //

        // TBCTR同步相位负载(升压计数HR控制所需

        //

        (* ePWM[PWM2]).TBCTL.bit.PHSEN = TB_ENABLE;

        //

        //相对于ePWM1的粗相位偏移

        //

        (* ePWM[PWM2]).TBPHS.bit.TBPHS = temp_PHS2;

        (* ePWM[PWM2]).TRREM.bit.TRREM = temp_REM2;

        (*ePWM[PWM2]).tbPRDHR = PeriodFine;

        (*ePWM[PWM2]).TBPRD =周期;

        (* ePWM[PWM1]).TBPRDHR = PeriodFine;

        (*ePWM[PWM1]).TBPRD =周期;

        (* ePWM[PWM1]).TRREM.bit.TRREM = 0x100;

        UpdateFine =0;

    //  }

    //  其他

    //  {

    //    (* ePWM[PWM2]).TBCTL.bit.PHSEN = TB_DISABLE;

    //  }

      //

      //重新初始化下一个PWM中断

      //

      PIECtrlRegs.PIEACK/ALL = PIEACK_Group3;  //确认PIE中断

      (* ePWM[PWM1]).ETCLR.bit.INT = 1;       //清除中断位

      EDIS;

    }

    //###################################################################
    //
    //文件:HRPWM_DEADBAND SFO_V8.c
    ////
    标题:F2837xS器件HRPWM SFO V8高分辨率死带
    // (向上-向下计数)示例
    ////
    ! \addtogroup cpu01_example_list
    //! <H1>HRPWM死区示例(HRPWM_DEADBACDE_SFO_V8)</H1>//!
    此程序需要F2837xS头文件,包括
    //! 此示例需要以下文件:
    //! SFO_V8.h和SFO_V8_FPU_lib_build_c28.lib
    //!
    //! 在示波器上监控ePWM1和ePWM2 A/B针脚
    //!
    //! 描述:
    //!
    //! 此示例在保持
    //!占空比的同时扫描ePWM频率。 ~ePWM上下计数模式下的50 %。 此外,此示例还演示
    了//! 利用HRPWM
    //!的ePWM高分辨率死区(HRDB)功能 相应ePWM模块的扩展。
    //!
    //! 此示例调用以下TI的微边定位器(MEP)标度
    //! 因子优化器(SFO)软件库V8函数:
    //!
    //! b int \b SFO ();\n
    //! 当HRPWM正在使用
    时动态更新MEP_ScaleFactor //! 更新HRMSTEP寄存器(仅存在于EPwm1Regs寄存器空间)
    //! 更新MEP_ScaleFactor值
    //! -如果指定通道
    //不完整,则返回0! -当为指定通道完成
    时返回1 //! -如果错误:MEP_ScaleFactor大于最大值255
    //,则返回2 (在这种情况下,自动转换可能无法正常工作)
    //!
    //! 此示例旨在演示HRPWM控制
    //! 死区下降边缘延迟(FED)和上升边缘延迟(红色)。
    //!
    //! ePWM1和ePWM2 A/B通道由于HRPWM
    //! 控制。
    //!
    //!=========================================================================================================================================
    //! 注:有关使用SFO软件库的详细信息,请参阅
    //! //!中的F2837xS高分辨率脉宽调制器(HRPWM)一章
    技术参考手册。
    //!=========================================================================================================================================
    //!
    //! 要加载并运行此示例:
    //! -#**!!!重要!!**-在SFO_V8.h中,将PWM_CH设置为
    最大数目//! HRPWM通道加一个。 例如,对于F2837xS,
    //! HRPWM通道的最大数量为8。 8+1=9,因此设置
    //! 在SFO_V8.h中#define PWM_CH 9 (默认值为8)
    //! -#在最大SYSCLKOUT
    //下运行此示例! -#激活实时模式
    //! -#从脚本控制台运行“AddWatchWindowVars_HRPWM.js”脚本
    //! (查看->脚本控制台)使用
    //! 命令:
    //! JSloadFile <path_to_JS_file>/AddWatchWindowVars_HRPWM.js
    //! -#运行代码
    //! -#在示波器上观看ePWM A / B通道波形
    //! -#在监视窗口中:
    //! 将变量InputPeriodInc更改为增加或降低频率
    //! 扫描速率。 设置InputPeriodInInc =0将停止扫描,同时
    //! 允许实时处理和更新其他变量。
    //! -#在监视窗口中:
    //! 将寄存器EPwm1Regs.DBRED/EPwm2Regs.DBRED的值更改为查看
    //! ePWM1和ePWM2上升边缘死区的变化。
    //! 或者,更改寄存器
    //!的值 EPwm1Regs.DBFED/EPwm2Regs.DBFED将更改//的跌落边缘死区!
    ePWM1和ePWM2。 更改这些值将改变占空比
    //! 其各自ePWM模块的百分比。
    //! **!NOTE !!**- DBRED/DBFED值绝不能设置为低于4。
    //! 请勿将这些值设置为0,1,2或3。
    //! -#在监视窗口中:
    //! 更改寄存器//!的值
    EPwm1Regs.DBREDHR.Bit.DBREDHR/EPwm2Regs.DBREDHR.Bit.DBREDHR增加
    //! 或者在
    //! 死区上升边缘。 或者,更改
    //! EPwm1Regs.DBFEDHR.bit.DBFEDHR/EPwm2Regs.DBFEDHR.bit.DBFEDHR要更改
    //! ePWM1
    //! 和ePWM2。
    //
    //###########################################################################
    //$TI发布:F2837xS支持库v 3.00 .00.00 $//
    发布日期:星期三1月25日16:06:35 CST 2017 $//
    $Copyright:
    //版权所有(C) 2014-2017德州2017德州仪器(TI)公司- http://www.ti.com/
    ////
    
    允许以源代码和二进制形式重新发布和使用,无论是否修改//,只要
    满足以下条件//:
    ////
    重新分发源代码必须保留上述版权
    声明,此条件列表和以下免责声明。
    ////
    以二进制格式重新发布必须在
    
    //发布时提供的文档和/或其他材料中复制上述版权//声明,此条件列表和以下免责声明
    。
    ////
    未经
    
    明确的事先书面许可,不得使用德州仪器(TI)公司的名称或//其贡献者的名称来支持或促销从本软件派生的//产品。
    ////
    本软件由版权所有者和贡献者提供
    //“按原样”,
    
    不提供任何明示或暗示的担保,包括但不限于适销性和适用于//特定目的的暗示担保。 在任何情况下,版权
    //所有者或贡献者均不对任何直接,间接,附带,
    //特殊,示范, 或相应的损害(包括但不
    限于购买替代产品或服务;使用损失,
    //数据或利润); (包括
    
    疏忽或其他原因),但由于使用
    //本软件而导致的任何责任理论,无论是合同,严格责任还是侵权//(包括疏忽或其他),即使被告知可能会造成此类损害。
    //$//#############################################################################################################.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.
    
    
    //
    //包含的文件
    //
    #include "F28x_Project.h"
    #include "SFO_V8.h"
    
    //
    定义
    //
    #define PWM_CH 9 // PWM通道数+ 1
    #定义HR_ENABLED 1 // 1 = HR行为
    // 0 =非HR行为
    
    //
    //全局
    //
    UINT16更新,状态;
    UINT16 temp_REM2 =0,temp_PHS2,PhaseFine2;
    
    UINT32 CountUpdatefinine =0,CountUpdateMax =0;
    UINT16期间=0,PeriodFine =0,PeriodOdd =0;
    
    PeriodInInd Increment =0
    ;UINT32 Ind = 0
    UINT16 PWM1 = 1;
    UINT16 PWM2 = 2;
    UINT16 PeriodMax = 600,PeriodMin = 360;
    
    ////
    ePWM寄存器结构指针数组:
    //*ePWM[0]定义为示例
    中未使用的伪值//
    volatile struct ePWM_regs *ePWM[PWM_CH]=
    {&EPwm1Regs,&EPwm1Regs,&EPwm2Regs,&EPwm3Regs,&EPwm4Regs,
    &EPwm5Regs,&EPwm6Regs,&EPwm7Regs,&EPwm8Regs};
    int MEP_ScaleFactor;
    
    ////
    函数原型
    //
    void HRPWM1_Config(int);
    void HRPWM2_Config(int);
    void Freqctl_func(void);
    interrupt void PRDEQfix_ISR(void);
    void error(void);
    
    ////
    主
    //
    void主菜单(void){
    
    //
    //初始化控制和模拟子系统的系统控制。
    //启用外设时钟。
    //此示例函数可在F2837xS_sysctrl.c文件中找到。
    //
    InitSysCtrl();
    
    EALLOW;
    ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV = 1;
    EDIS;
    
    //
    //禁用CPU中断
    //
    色调;
    
    //
    //将PIE控件寄存器初始化为其默认状态。
    //默认状态是禁用所有PIE中断和标志
    //被清除。
    //此函数位于F2837xS_PIECTRL.c文件中。
    //
    InitPieCtrl();
    
    //
    //禁用CPU中断并清除所有CPU中断标志
    //
    IER = 0x0000;
    IFR = 0x0000;
    
    //
    //使用指向外壳中断的指针初始化PIE矢量表
    //服务例程(ISR)。
    //这将填充整个表,即使中断也是如此
    //在本例中不使用。 这对于调试非常有用。
    // shell ISR例程位于F2837xS_DefaultIsr.C.中
    //此函数位于F2837xS_PieVect.C.中
    //
    InitPieVectorTable();
    
    //
    //在PIE矢量表中设置ISR的地址
    //
    EALLOW;
    PieVectorTable.EPWM1_INT =&PRDEQfix_ISR;
    EDIS;
    
    //
    //调用SFH()以校准更新HRMSTEP寄存器
    // MEP_ScaleFactor。 HRMSTEP必须填入比例因子值
    //在启用高分辨率期间控制之前。
    //
    状态= SFO_INCOMPLETE;
    while (status == SFO_INCOMPLETE)
    {
    //
    //呼叫直至完成
    //
    状态= SFA();
    IF (状态== SFO_ERROR)
    {
    错误();
    }
    }
    
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    EDIS;
    
    //
    //初始化HRPWM1/HRPWM2
    //
    Initepwm1gpio();
    Initepwm2gpio();
    HRPWM1_Config (50);//!
    HRPWM2_Config (50);//!
    
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;//重新同步PWM时基时钟
    (*ePWM[PWM1]).GLDCTL2.bit.OSHTLD = 1;//这也应该写入
    // PWM2的GLDCTL2
    EDIS;
    
    //
    //将ePWM1配置为在期间匹配时生成中断
    //
    (*ePWM[PWM1]).ETSEL.bit.INTSEL = 1;//计数器零匹配时中断
    (* ePWM[PWM1]).ETSEL.bit.inten = 1; //启用外设中断
    (* ePWM[PWM1]).ETPS.bit.INTPRD = 1; //在每个事件上生成中断
    PieCtrlRegs.PIEIER3.bit.INTx1 = 1; //在PIE中启用ePWM1中断
    
    IER |= 0x0004; //启用核心INT #3
    EINT; //清除全局中断掩码
    
    UpdateFine =0; //禁用连续更新
    周期= 50;//!
    PeriodFine = 3.2万;//!
    CountUpdateMax = 0x0FFFF;
    CountUpdateFine = CountUpdateMax;
    
    //
    //监视窗口变量,用于修改频率扫描的速率
    //
    InputPeriodInInc = 0;//!
    
    对于(;;)
    {
    while (UpdateFine == 0)
    {
    IF (CountUpdateFine >= CountUpdateMax)
    {
    IF (期间<期间最大值)
    {
    //
    //执行扫描
    //
    PeriodIncrement = InputPeriodInc >> 16;
    PeriodFineIncrement =(UINT16) InputPeriodIn;
    期间=期间+期间增量;
    PeriodFine_temp =(UINT32) PeriodFine +
    (UINT32)定期财务增量;
    IF (PeriodFine_temp >= 0x1万)
    {
    PeriodFine_temp = PeriodFine_temp - 0x1万;
    句点=句点+ 1;
    }
    
    //
    //期间奇数- 50 % 关税的CMP除以2
    //
    如果(期间% 2 = 1)
    {
    PeriodOdd =1;}
    
    否则
    {
    PeriodOdd =0;}
    
    
    PeriodFine =(UINT16) PeriodFine_temp;
    
    //
    //更新非零增量的PWM值
    //
    IF (InputPeriodIn!=0)
    {
    Freqctl_func();
    }
    }
    否则
    {
    Period = PeriodMin;
    PeriodFine = 0;
    IF (InputPeriodIn!=0)
    {
    Freqctl_func();
    }
    }
    CountUpdateFine = 0;
    }
    CountUpdateFine ++;
    }
    }
    }////
    
    
    HRPWM1_Config -使用HRPWM
    //的ePWM1寄存器配置 ePWM1A在上升沿//
    
    void HRPWM1_Config (PeriodConfig)
    {
    (* ePWM[PWM1]).tbctl.bit.PRDLD = TB_shadow;//设置立即加载
    
    //
    // PWM频率= 1/ PeriodConfig
    //
    (*ePWM[PWM1]).TBPRD = PeriodConfig;
    
    //
    //初始设置占空比50 % 并初始化HRPWM扩展
    //
    (* ePWM[PWM1]).CMPA.bit.CMPA = PeriodConfig / 2;
    (* ePWM[PWM1]).CMPA.bit.CMPAHR =(1 < 8);
    (* ePWM[PWM1]).CMPB.bit.CMBB = PeriodConfig / 2;
    (* ePWM[PWM1]).CMPB.bit.CMPHR =(1 <8);
    (* ePWM[PWM1]).TBPHS.ALL = 0;
    (* ePWM[PWM1]).TBCTR = 0;
    
    (* ePWM[PWM1]).TBCTL.bit.CTRMODE = TB_COUNT_UDOWN;
    (* ePWM[PWM1]).TBCTL.bit.PHSEN = TB_DISABLE;// ePWM1是主中继器
    (* ePWM[PWM1]).TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
    (* ePWM[PWM1]).TBCTL.bit.HSPCLKDIV = TB_DIV1;
    (* ePWM[PWM1]).TBCTL.bit.CLKDIV = TB_DIV1;
    
    //
    //在CTR上加载CMPA = ZERO_PRD
    //
    (* ePWM[PWM1]).CMPCTL.bit.LOADAMODE = CC_CTR_ZERO_PRD;
    (* ePWM[PWM1]).CMPCTL.bit.LOADBMODE = CC_CTR_ZERO_PRD;
    
    (* ePWM[PWM1]).CMPCTL.bit.SHDWAMODE = CC_SHAMODE;
    (* ePWM[PWM1]).CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    
    (* ePWM[PWM1]).AQCTLA.bit.CAU = AQ_SET;
    (* ePWM[PWM1]).AQCTLA.bit.CAD = AQ_CLEAR;
    
    EALLOW;
    #IF HR_ENABLED
    (* ePWM[PWM1]).HRCNFG.ALL = 0x1353;
    
    //
    //打开高分辨率周期控制
    //
    (* ePWM[PWM1]).HRPCTL.bit.HRPE = 1;
    
    //
    //将高分辨率相位同步到开始HR周期
    //
    (* ePWM[PWM1]).TBCTL.bit.SWFSYNC = 1;
    #endif
    
    (* ePWM[PWM1]).GLDCFG.bit.CMPA_CMPAHR = 1;
    (* ePWM[PWM1]).GLDCFG.bit.CMPB_CMPHR = 1;
    
    //
    // CTR上的负载= ZERO_PRD (2)/零(1)
    //
    (* ePWM[PWM1]).GLDCTL.bit.GLDMODE = 2;
    
    //
    //启用单触发模式和全局加载
    //
    (* ePWM[PWM1]).GLDCTL.bit.OSAHTMODE = 1;
    (* ePWM[PWM1]).GLDCTL.bit.GLD = 1;
    
    //
    //写入PWM1 GLDCTL2将导致同时写入PWM2 GLDCTL2
    //
    (* ePWM[PWM1]).EPWMXLINK.bit.GLDCTL2LINK = PWM1 - 1;
    (* ePWM[PWM1]).DBCTL.bit.out模式= DB_FULL启用;
    (* ePWM[PWM1]).DBCTL.bit.POLSEL = DB_ACTV_HIC;
    (* ePWM[PWM1]).DBCTL.bit.in_mode = DBA_ALL;
    (* ePWM[PWM1]).DBCTL.bit.SHDWDBREDMODE = 1;
    (* ePWM[PWM1]).DBCTL.bit.SHDWDBFEDMODE = 1;
    (* ePWM[PWM1]).DBCTL.bit.LOADREDMODE = 0;//加载计数器== 0
    (* ePWM[PWM1]).DBCTL.bit.LOADFEDMODE = 0;// Load on Counter == 0
    (* ePWM[PWM1]).DBCTL.bit.HALFCYCLE = 1;
    (* ePWM[PWM1]).DBRED.bit.DBRED = 4;
    (* ePWM[PWM1]).DBREDHR.bit.DBREDHR = 0x0;
    (* ePWM[PWM1]).DBFED.bit.DBFED = 4;
    (* ePWM[PWM1]).DBFEDHR.bit.DBFEDHR = 0x0;
    
    (* ePWM[PWM1]).HRCNFG2.bit.EDGMODEDB = HR_BEP;// DBREDHR和DBFEDHR
    (* ePWM[PWM1]).HRCNFG2.bit.CTLMODEDBRED = 0;// ZRO上的负载
    (* ePWM[PWM1]).HRCNFG2.bit.CTLMODEDBED = 0;// ZRO上的负载
    (* ePWM[PWM1]).DBREDHR.bit.DBREDHR =(0 <9);
    
    EDIS;
    }////
    
    
    HRPWM2_Config -使用HRPWM
    //的ePWM2寄存器配置 ePWM2A在上升沿上使用MEP控件切换低/高
    //
    void HRPWM2_Config (PeriodConfig)
    {
    (* ePWM[PWM2]).tbctl.bit.PRDLD = TB_shadow;//设置立即加载
    
    //
    // PWM频率= 1/ PeriodConfig
    //
    (*ePWM[PWM2]).TBPRD = PeriodConfig;
    
    //
    //初始设置占空比50 % 并初始化HRPWM扩展
    //
    (* ePWM[PWM2]).CMPA.bit.CMPA = PeriodConfig / 2;
    (* ePWM[PWM2]).CMPA.bit.CMPAHR =(1 < 8);
    (* ePWM[PWM2]).CMPB.bit.CMBB = PeriodConfig / 2;
    (* ePWM[PWM2]).CMPB.bit.CMPHR =(1 < 8);
    (* ePWM[PWM2]).TBPHS.ALL = 0;
    (* ePWM[PWM2]).TBCTR = 0;
    
    (* ePWM[PWM2]).TBCTL.bit.CTRMODE = TB_COUNT_UDOWN;
    (* ePWM[PWM2]).TBCTL.bit.PHSEN = TB_DISABLE;// ePWM1是主中继器
    (* ePWM[PWM2]).TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
    (* ePWM[PWM2]).TBCTL.bit.HSPCLKDIV = TB_DIV1;
    (* ePWM[PWM2]).TBCTL.bit.CLKDIV = TB_DIV1;
    
    //
    //在CTR = 0上加载CMPA
    //
    (* ePWM[PWM2]).CMPCTL.bit.LOADAMODE = CC_CTR_ZERO_PRD;
    (* ePWM[PWM2]).CMPCTL.bit.LOADBMODE = CC_CTR_ZERO_PRD;
    (* ePWM[PWM2]).CMPCTL.bit.SHDWAMODE = CC_SHAMODE;
    (* ePWM[PWM2]).CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    
    (* ePWM[PWM2]).AQCTLA.bit.CAU = AQ_SET;
    (* ePWM[PWM2]).AQCTLA.bit.CAD = AQ_CLEAR;
    
    EALLOW;
    #IF HR_ENABLED
    (* ePWM[PWM2]).HRCNFG.ALL = 0x1353;
    
    //
    //打开高分辨率周期控制
    //
    (* ePWM[PWM2]).HRPCTL.bit.HRPE = 1;
    
    //
    //将高分辨率相位同步到开始HR周期
    //
    (* ePWM[PWM2]).TBCTL.bit.SWFSYNC = 1;
    #endif
    
    (* ePWM[PWM2]).tbctl.bit.PHSDIR = 1; //同步事件后计数
    (* ePWM[PWM2]).TBPHS.bit.TBPHS = 25;//!
    
    (* ePWM[PWM2]).GLDCFG.bit.CMPA_CMPAHR = 1;
    (* ePWM[PWM2]).GLDCFG.bit.CMPB_CMPHR = 1;
    
    //
    // CTR上的负载= ZERO_PRD (2)/零(1)
    //
    (* ePWM[PWM2]).GLDCTL.bit.GLDMODE = 2;
    
    //
    //启用单触发模式和全局加载
    //
    (* ePWM[PWM2]).GLDCTL.bit.OSAHTMODE = 1;
    (* ePWM[PWM2]).GLDCTL.bit.GLD = 1;
    
    //
    //写入PWM1 GLDCTL2将导致同时写入PWM2 GLDCTL2
    //
    (* ePWM[PWM2]).EPWMXLINK.bit.GLDCTL2LINK = PWM1 - 1;
    (* ePWM[PWM2]).DBCTL.bit.out模式= DB_FULL启用;
    (* ePWM[PWM2]).DBCTL.bit.POLSEL = DB_ACTV_HIC;
    (* ePWM[PWM2]).DBCTL.bit.in_mode = DBA_ALL;
    (* ePWM[PWM2]).DBCTL.bit.SHDWDBREDMODE = 1;
    (* ePWM[PWM2]).DBCTL.bit.SHDWDBFEDMODE = 1;
    (* ePWM[PWM2]).DBCTL.bit.LOADREDMODE = 0;//加载计数器== 0
    (* ePWM[PWM2]).DBCTL.bit.LOADFEDMODE = 0;// Load on Counter == 0
    (* ePWM[PWM2]).DBCTL.bit.HALFCYCLE = 1;
    (* ePWM[PWM2]).DBRED.bit.DBRED = 4;
    (* ePWM[PWM2]).DBREDHR.bit.DBREDHR = 0x0;
    (* ePWM[PWM2]).DBFED.bit.DBFED = 4;
    (* ePWM[PWM2]).DBFEDHR.bit.DBFEDHR = 0x0;
    
    (* ePWM[PWM2]).HRCNFG2.bit.EDGMODEDB = HR_BEP;// DBREDHR和DBFEDHR
    (* ePWM[PWM2]).HRCNFG2.bit.CTLMODEDBRED = 0;// ZRO上的负载
    (* ePWM[PWM2]).HRCNFG2.bit.CTLMODEDBED = 0;// ZRO上的负载
    (* ePWM[PWM2]).DBREDHR.bit.DBREDHR =(0 <9);
    
    EDIS;
    }////
    
    
    Freqctl_func -调频和相位同步功能
    //仅当启用频率扫描
    时才调用此函数//
    void Freqctl_func (void)
    {
    IF (定期日)
    {
    //
    //如果期间为奇数,则添加0.5
    //
    (* ePWM[PWM1]).CMPA.bit.CMPAHR =(PeriodFine >> 1)+ 0x7FFF;
    (* ePWM[PWM2]).CMPA.bit.CMPAHR =(PeriodFine >> 1)+ 0x7FFF;
    (* ePWM[PWM1]).CMPB.bit.CMPHR =(PeriodFine >> 1)+ 0x7FFF;
    (*ePWM[PWM2]).CMPB.bit.CMPHR =(PeriodFine >>1)+ 0x7FFF;
    }
    否则
    {
    (* ePWM[PWM1]).CMPA.bit.CMPAHR = PeriodFine >> 1;
    (* ePWM[PWM2]).CMPA.bit.CMPAHR =周期性>> 1;
    (* ePWM[PWM1]).CMPB.bit.CMPHR =周期性>> 1;
    (*ePWM[PWM2]).CMPB.bit.CMPHR =周期性>> 1;
    }
    
    (* ePWM[PWM1]).CMPA.bit.CMPA =(句点>> 1)+ 1;
    (* ePWM[PWM2]).CMPA.bit.CMPA =(句点>> 1)+ 1;
    (* ePWM[PWM1]).CMPB.bit.CMBB =(句点>> 1)+ 1;
    (* ePWM[PWM2]).CMPB.bit.CMBB =(句点>> 1)+ 1;
    
    temp_PHS2 =(句点>> 1);
    
    交换机(PeriodOdd)
    {
    案例1:
    //
    //除以2的记帐= 0.5
    //
    PhaseFine2 = 0xFF -(PeriodFine >> 9)- 0x7F;
    中断;
    
    默认:
    PhaseFine2 = 0xFF -(PeriodFine >> 9);
    中断;
    }
    
    //
    //没有要考虑的分相位移
    //
    TEMP_REM2 =(UINT16) 0x100 + PhaseFine2;
    UpdateFine =1;}////
    
    
    
    
    PRDEQfix_ISR -转换器余数计算的ISR
    //
    中断无效PRDEQfix_ISR(void){
    
    EALLOW;
    // IF (UpdateFine == 1)
    //{
    //
    //这也应该写入PWM2,PWM3和PWM4的GLDCTL2
    //
    (* ePWM[PWM1]).GLDCTL2.bit.OSAHTLD = 1;
    
    //
    // TBCTR同步相位负载(升压计数HR控制所需
    //
    (* ePWM[PWM2]).TBCTL.bit.PHSEN = TB_ENABLE;
    
    //
    //相对于ePWM1的粗相位偏移
    //
    (* ePWM[PWM2]).TBPHS.bit.TBPHS = temp_PHS2;
    (* ePWM[PWM2]).TRREM.bit.TRREM = temp_REM2;
    
    (*ePWM[PWM2]).tbPRDHR = PeriodFine;
    (*ePWM[PWM2]).TBPRD =周期;
    
    (* ePWM[PWM1]).TBPRDHR = PeriodFine;
    (*ePWM[PWM1]).TBPRD =周期;
    (* ePWM[PWM1]).TRREM.bit.TRREM = 0x100;
    UpdateFine = 0;//
    }//
    else
    //{//
    (*ePWM[PWM2]).TBCTL.bit.PHSEN = TB_DISABLE;
    //}
    
    //
    //重新初始化下一个PWM中断
    //
    PieCtrlRegs.PIEACG.ALL = PIEACK_Group3; //确认PIE中断
    (* ePWM[PWM1]).ETCLR.bit.INT = 1; //清除中断位
    EDIS;
    }
    
    无效错误(void)
    {
    ESTOP0; //在此处停止并处理错误
    }////
    
    
    文件结尾
    //
    

    顺便说一下,更改UpdateFine有什么问题? 我不需要在主循环中进行计算,因此我可以避免它。

    对于抖动问题,仅使用EPWM2而不是EPWM1和EPWM2是否会产生影响?

    我使用的是采用TMX320 F2.8377万SPZPT YFB-52AS8NW的LaunchXL-F2.8377万S

    芯片的修订是否是问题所在?

    您是使用我的设置重新创建抖动,还是根本没有此问题?

    非常感谢您的帮助和时间,

    Jonas

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,您说的对,当InputPeriodInc为0时,UpdateFine应初始设置为1,以便可以将PeriodFine加载到TPBRDHR中。 您还可以考虑在main()中添加自己的逻辑,以确定何时应设置UpdateFine。

    如果您只使用EPWM2,最好为EPWM2配置ETSEL,而不是像示例代码那样配置EPWM1。 这是为了确保根据EPWM2事件触发中断。 也可以删除/注释掉EPWM1配置和全局负载的代码。

    当InputPeriodInc不是0时,我看到EPWM2抖动-我在任何其他情况下都没有看到抖动。


    伊丽莎白