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.

[参考译文] LAUNCHXL-F28069M:如何使 EPwm1Regs.CMPB 寄存器在立即加载模式下工作?

Guru**** 2605275 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/681651/launchxl-f28069m-how-to-make-epwm1regs-cmpb-register-work-at-immediate-load-mode

器件型号:LAUNCHXL-F28069M

我想让 EPwm1Regs.CMPB 寄存器在立即加载模式下工作。 "TMS320x2806x Piccolo 技术参考手册 "说:"如果选择了立即加载模式(TBCTL[SHADWAMODE]= 1或 TBCTL[SHADWBMODE]= 1)、 那么对寄存器的读取或写入将直接进入活动寄存器。 "。

据此,我编写了以下代码:

主函数的一部分:

//ePWM
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;

InitEPwm1Examples();  
InitEPwm2Examples();  
InitEPwm3Examples();  
InitEPwm4Examples();  

EPwm1Regs.AQCSFRC.bit.CSFA=1;
EPwm1Regs.AQCSFRC.bit.CSFB=1;
EPwm2Regs.AQCSFRC.bit.CSFA=1;
EPwm2Regs.AQCSFRC.bit.CSFB=1;
EPwm3Regs.AQCSFRC.bit.CSFA=1;
EPwm3Regs.AQCSFRC.bit.CSFB=1;

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

InitEPwm1示例函数:

void InitEPwm1Examples(){
//设置 TBCLK
EPwm1Regs.TBCTL.bit.CTRMODE = 0x0;//向上计数模式
EPwm1Regs.TBPRD = 9000;//设置定时器周期、在本示例中设置为最大值
EPwm1Regs.TBCTL.bit.PHSEN = 0x1;//启用相位加载
EPwm1Regs.TBPHS.Half.TBPHS = 0;//相位为0
EPwm1Regs.TBCTR = 0x0000;//清除计数器
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.SYNCOSEL = 2;//EPWM1SYNCO:TBCTR = CMPB
EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0x1;//立即模式。

//将影子寄存器加载设置为零
EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0x0;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0x0;
EPwm1Regs.CMPCTL.bit.LOADAMODE = 0x0;
EPwm1Regs.CMPCTL.bit.LOADBMODE = 0x0;

//设置比较值
EPwm1Regs.CMPA.half.CMPA = TON;//设置比较 A 值
EPwm1Regs.CMPB =相位;//设置比较 B 值

//设置操作
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;//将 PWM1A 设置为零
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;//在事件 A 上清除 PWM1A、递增计数
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;//将 PWM1B 设置为零
EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;//在事件 A 上清除 PWM1B,递增计数

//设置 DCAEVT1.sync
EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = 0x1;// DCAH = TZ2
EPwm1Regs.TZDCSEL.bit.DCAEVT1 = 0x2;// DCAEVT1 = DCAH 高电平、DCAL 无关;
// EPwm1Regs.DCFCTL.bit.SRCEL = 0x0;// DCEVTFLT 滤波器源= DCAEVT1
EPwm1Regs.DCACTL.bit.EVT1SRCSEL = 0x0;// DCAEVT1 = DCAEVT1 (未过滤)
EPwm1Regs.DCACTL.bit.EVT1SYNCE = 0x1;//采用同步路径
EPwm1Regs.TZCTL.bit.DCAEVT1 = 3;

但是,结果是意料之外的。 EPwm1Regs.CMPCTL.bit.SHDWBMODE 不是"1"。 这种现象的原因是什么?

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

    [引用用户="Chenka"]

    EPwm1Regs.TBCTL.bit.SYNCOSEL = 2;//EPWM1SYNCO:TBCTR = CMPB
    EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0x1;//立即模式。

    //将影子寄存器加载设置为零
    EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0x0;
    EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0x0;
    EPwm1Regs.CMPCTL.bit.LOADAMODE = 0x0;
    EPwm1Regs.CMPCTL.bit.LOADBMODE = 0x0;

    [/报价]

    您好 Chenkai、

    我想问题是 SHDWBMODE 模式在下面的代码中再次变为0。 删除这段代码、它应按预期工作。 请告诉我这是否能解决您的问题。

    //将影子寄存器加载设置为零
    EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0x0;
    EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0x0;
    EPwm1Regs.CMPCTL.bit.LOADAMODE = 0x0;
    EPwm1Regs.CMPCTL.bit.LOADBMODE = 0x0;

    谢谢

    Vasudha

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

    Chenkai