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/TMS320F28335:ECAP 作为 APWM 与 ePWM 同步从不达到 PRD=CTR

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/788890/ccs-tms320f28335-ecap-as-apwm-synchronize-with-epwm-never-reaches-prd-ctr

器件型号:TMS320F28335

工具/软件:Code Composer Studio

您好!

我将 ECAP 用作 PWM 信号。 以下是我的测试的详细信息:

  • 我使用了 ECAP1中断(PRD=CTR)和 ePWM1中断(PRD=CTR)。
  • ePWM1配置为递增/递减计数(对称波载波)。  
  • 在 ePWM1中、CMP 和 CTRRPHS 的中断值写入影子 CMP 寄存器(CAP4)和 CTRPHS 寄存器。
  • ECAP1中断仅用于切换 GPIO 以查看中断是否完成。
  • 两个信号(ECAP1和 EPWM1)具有相同的周期。

当我通过 ePWM1的 CTR_EQ_ZERO 使 ECAP1与 ePWM1同步并且 ECAP1的相位为0或接近0时、我的问题就会开始。 eCAP 驱动程序的中断会发生、因此 CAP4的影子寄存器不会写入 CAP2、因为 CTR=PRD 永远不会发生! 如果我不能同步、则输入两个选项时不会出现任何问题、并且正确写入占空比值。 由于应用要求、我需要 ePWM 与 eCAP 同步、有任何解决方案可确保 ECAP 的 PRD=CTR、以便正确加载 CAP4的值? 或者是否可以在同步时刻更新 CAP2值? 因为在 eCAP 的参考指南中、他们说 CAP4和 CAP3在 PRD=CTR 时加载到 CAP1和 CAP2中。

在这里、代码使用的定义与 eCAP 参考指南中使用的定义相同:

========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

INTERRUPT void APWM_ISR1 ()
{
_ISR_COUNTER++;//如果
(_ISR_COUNTER>=150){_ISR_COUNTER=0;}
GpioDataRegs.GPATOGGLE.bit.GPIO16=1、则该计数器仅用于调试模式;
//确认此中断以从组4 PieCRIT.GPIOL.C=4接收更多的中断
;
非常重要| GPIOCRIT.GPIOCRIT.BO.GPIO=1;//确认此中断以接收更多中断 ========================================================================================================================================================================================================================================================PRD,然后是 INT 标志
ECap1Regs.ECCLR.bit.INT=1,再是 INT 标志 ECap1Regs.ECCLR.bit.CTRL_EQPRD=1;//clear
标志}==========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================




// ePWM 中断
void ePWM_SYNC_ISR ()
{

ECap1Regs.CAP4=_newDuty_value;//uint32变量(如果它与同步使能且 PHASE = 0时的起始值不同、则不更新该值!) 为什么?

ECap1Regs.CTRPHS=_newPhase_value;//uint32变量





/*我的新占空比和相位值代码...

将占空比从0增加到1并根据 PRD 调整到 uint32值

更改相位值并根据 PRD 调整到 uint32值、因为 ECAP1始终为0!



============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================确认

此中断接收来自组3

的更多中断 PieCtrlRegs.PIEACk.PIEACk.PIEACk.all |PIEACK_Group3





//main //====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

void main (void)
{

//Configuraton of DSP
EALLOW;
SysCtrlRegs.WDCR = 0x0068;//看门狗关闭
SysCtrlRegs.PLLSTS.bit.DIVSEL = 2;// PLL SysCtrlRegs.PLLCR.BIT.DIV
= 10;// 30MHz * 10 / 2 = 0x0000.SysCtrlRegs.0XCLPCP




= 0x0000.SysCLP= 0x0000.SysCROP SysCLCR.all;SYSCRP.0.SysCLP= 0x0000.SysCLP= 0x0000.SysCLP= 0x0000.SysCLP= 0x0000.SysCLP= 0x0000.0.SysCLP= 0x0000.SysCLP= 0x0000.SysCLP= 0x0000.all SysCLP= 0x0000.SysCLP= 0x0000.SysCLP= 0x0000.SysCP.

//启用 PWM 和 ECAP CLK
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;//在 ePWM
SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;//启用 EPWM1 SysClRegs.PCLCLK 内的 TBCLK;//
启用 TBCLKCLK


=

1;启用 TCLKCLKCLK = 0;/启用 TCLKCLKCLKCLKCLK =


0;启用 TCLKCLKCLKCLKCLKCLK=0;启用 TCLKCLKCLKCLKCLKCLKCLKCLK=0;必须启用 TCLKCLKCLKCLKCLKCLKCLKCLKCLK.GPIOCLK=0;/位

//启用命令
GpioCtrlRegs.GPADIR.bit.GPIO16 = 1;// GPIOX = OUT
EDIS;

//配置 ePWM
EALLOW 的输出;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;
GpioCtrlRegs.bit.GPIO0 = 1

;GPO1.GPIOX=GP1/ GPIO1.GPIO1.GPIO1.GPIO1.bit.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.



GpioCtrlRegs.GPADIR.bit.GPIO5=1;// GPIOX =输出
GpioCtrlRegs.GPAMUX1.bit.GPIO10=1;
GpioCtrlRegs.GPADIR.bit.GPIO10=1;// GPIOX =输出 GpioCtrlRegs.gpio11Ms/GPU1.150








;/pio1.1Ms.gpintr.1ms/gpiox1.150 = 1;/gpio1.mpr.gp1.ms/p1.mr.gp1ms/p1.mr.gp1.mr.gp1.ms/gp1.mr.gp1.mr.gp1.mr.gp1.ms/gp1.mr.gp1.mr.gp1.ms/gp1.ms/p1.mr.gp1.ms/p1.
//计数类型
EPwm1Regs.TBPHS.half.TBPHS=0;//将相位寄存器设置为零
EPwm1Regs.TBCTR=0;//清除 TB 计数
器 EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_TBRDD.TBIT.TBR
= 0


;EPwm1RCTL.TBIT.TBR
= 0


;EPWCLTBIT.TBIT.TBIT.TBIT.TCMTL.TL.TBIT.TBIT.TBIT.TBIT.TCMTL.TB.TBIT.TB.TBIT.TB.TBIT.TBIT.Tb = 0 = 0 = 0;EP_TBIT.TBIT.TBIT.TBIT.TBIT.TBIT.TBIT.TBIT.TCMTCMTB.TB.TBIT.TB.TB.TBIT.TBIT.TB.TB.TBIT.TB.TCMTB.TB.TBIT.TBIT.TCMTB.TB.TBIT.TBIT.TBIT.TBIT.TCM
//对 CMPA
EPwm1Regs.CMPCTL.bit.SHHDWBMODE 使用阴影模式= CC_SHADDADE;//对 CMPB
EPwm1Regs.CMPCTL.bit.LOADAMOCompare = CC_CTR_ZERO;//对 CTR 加载= EPwm1Regs.CMPCTL.bit.LOADAMODE



= CCR 0;//在 CTR 上加载= 0;//初始 CMPADR0 = 0 = 0 = CMPADCMPA.0;//非 CMPADRPM0 = 0 = 0 = 0 = 0;//初始 CMPADCMPADRCMPADRCMPADRPM0 = 0 = 0 = 0;// CTR = 0 = 0 = 0 = 0;CMPAD
//开始时的 PWM 比率



//动作限定符:互补模式
EPwm1Regs.AQCTLB.bit.PRD = AQ_SET;//通过 CMPA CAD 将 EPWMxB 从0转换为1 (AQCTLB.bit.CAU
= AQ_CLEAR;//通过交叉点将 EPWM1REGS.AQCTAQACA.bit.CAU 设置为0 (
即 EQMCLA_SET)/从0转换为1 (即 EQMCAMB) 如果 CMPB 增大、则 EPWMA 的占空比增大。

//如果死区被启用为互补高电平有效、AQCTLA 位被覆盖!!!
EPwm1Regs.AQCTLA.bit.PRD = AQ_CLEAR;//通过 CMPB CAD (交叉)设置 EPWMxA 从1转换为0 (AQCTLA.bit.CAU
= AQ_SET;//设置 EPWMxA 从0转换为1 (交叉)(
即通过 CMPB / CAU 设置) 如果 CMPB 增大、EPWMB 的占空比减小。
//死区
EPwm1Regs.DBCTL.bit.out_mode = DB_full_enable;//启用死区模块,ePWMB 的上升被延迟,ePWMA 的下降被延迟
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;//活动 HIC
,//如果启用了互补高电平!
EPwm1Regs.DBFED = dt_1;// FED = XX TBCLK;1 TBCLK=SYSCLKOUT = 6.67ns;
EPwm1Regs.DBRED = dt_1;// RED = XX TBCLK;299 ~ 2us



//为 aPWM
EALLOW 配置输出;
// ECCCL1CLK
= ENCLK1CLK;// ECC1CLK = ENCLK1CLK = ENCLK = CLKCLK;//
ECLK = ENCLKCLKCLKCLKCLKCLK1CLK = ENCLK = CLK1CLKCLKCLK //为 ECAP2
SysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK 启用 CLK = 1;//为 ECAP3
SysCtrlRegs.PCLKCR1.bit.ECAP4ENCLK = 1;//为 ECAPSysCtrlRegs.PCLKCRs.PCLKCR1.bit.ECAP4ENCLK 启用 CLK

= 1;//


为 ECAP1.GPIOCLK = 1。 // GPIOX =输出
GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO25 = 1;// GPIOX=输出 GpioRegs.GPBMUX2.bit.GPIOX2=
1;
GpioCtrl.GPIOX=GPIO1.GPIO1.bit.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.





// GPIOX =输出
EDIS;



//预设值:
GpioDataRegs.gpACLEAR.bit.GPIO16=1;
//定义 PWM 占空
比 EPwm1Regs.CMPB=(tsw_us*TR75)* duty1;


EPwm1Regs.tb.SYNCOSEL = 0





;/eEC_TREC_TR2.tb.eEC_EC_TREC_TR2.tb.eAC2.t_EC_EC_TREC_TREC_MOTION = 0;/eEC_EC_TREC_TREC_TREC_TREC_TRL2.t_TREC_TREC_MOTION = 0;/eEC_TREC_TREC_TREC_TREC_TRIP.EC_TRIP.EC_TREC_TREC_TRL2.t_TRIP.EC_TRIP.EC_TRIP.EC_MOTION = 0;/TRIP.EC_TRIP.EC_TRIP.EC_TRIP.EC_TRIP.EC_TRIP.EC_TRIP.EC_TRIP.ECT. //运行时钟
ECap1Regs.CAP1 = 50*150;//设置信号的周期。


//启用 ECAP 中断
DINT;//可寻




址中断 ECap1Regs.ECEINT.ALL=0;//可寻址所有中断 ECap1Regs.ECCLR.ALL=1;//清除所有标志 ECap1Regs.ECEINT.bit.CTR_EQ_PRD=1;//启用 CTR=CMP 中断 EALLOOR.INT.1R=





1;// ETR1.ETR1.ETR1.ETR1.t_INT.ETRP= 1;// ETR1.ETR1.ETR1.ETR_INT.ETR1;ENTR1.ETR1.ETR_INT.ETR1;ENTR1.ETR_INT.ETRP= 1;// ETR1.ETR1.INT.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR
//启用 INT
EPwm1Regs.ETPS.bit.INTPRD = et_1st;//在第一个事件发生时生成 INT
//启用 PWM 中断
EALLOW;
*(&PieVectTable.EPWM1_INT + 0)= ePWM_SYNC_ISR;
EDIS;
//启用连接到 EPWM1-6*的 CPU INT3;*


= ePWM_SYn1|eR=


ePREC1
;//启用 eCAP1.150| eR= eMR1<= eMR1<|eIP1;/I1<= ePREC1 = eMR1<= eMR1<= eMR1<|eIP1 //设置周期值(150无预分频器)
ECap1Regs.CAP2 =50*150*0.5;//设置比较值(150无预分频器)
ECap1Regs.CTRPHS = 0x0;//使相位为零



//启用中断;
//启用 PIE
PieCtrlRegs.PIECTRL.BIT.ENPE

=
0x1;启用 PIE 脉冲到所有 CPU;

//在 CPU 级别
EINT 启用中断;

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

//*********
//无限循环
//*********
while (1)
{
//********
}//End Infinity Loop
}//end main 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在想象这种情况时遇到了一些困难。 您是否停止获取中断、还是仅错过了更新后的中断?

    正确的方法是、影子加载仅在 CTR=PRD 时发生。 同步输入仅适用于相位。

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

    尊敬的惠特尼:

    我停止获取中断、但只有 eCAP1中断、ePWM1 PRD=CTR 在每个周期都正确发生。 我将尝试 澄清我要做的事情:

    • 我希望 eCAP1作为 APWM1、与 ePWM1同步
    • 每个新周期都应更新新值(在影子寄存器中之前计算且已设置)。
    • 但是、对于零的固定相移和 eCAP1与 ePWM1 CTR =零的同步比较值不会在 CAP2中更新。 本指南介绍了影子寄存器在 PRD=CMP 处加载、并在 SYNC 信号处加载相位。 因此、我在 PRD=CTR 处创建 ECAP1中断以查看训练脉冲并放置调试断点、以了解我是否达到该中断。 当 ePWM 和 eCAP1在 ePWM CTR =零时同步时、相位被加载、并且 eCAP 的 PRD=CTR 永远不会发生、因此 CAP2保持与之前的值相同。 目前我的结论是、SYNC 信号发生在 PRD=CTR 之前、然后加载相位、使 CTR=0并且从不达到 PRD。  

    在更新相位或在同步时强制更新 CAP2之前、是否有任何方法等待或检查 PRD=CTR 八倍频? 还是在将 CAP4加载到 CAP2中时强制 PHASE/SYNC_SIGNAL 更新? 或者检查 CAP2是否尚未更新、因此不更新阶段?

    如果 eCAP 的 CTR=PRD 之前的 EPWM 八倍周期都设置为相同的周期和相同的相位、那么为什么这两个周期都设置为零呢?  

    米格尔

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、我想我看到您说的是什么。 因此、如果您将 eCAP 周期值减少一个或两个计数、以便在 PRD 事件和同步事件之间有更多的时间、那么我猜0相位不会再导致这个问题?

    惠特尼
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、您回答正确。 我将 PRD 从7500降低到7499、现在它正确加载阴影并进入中断。
    谢谢!