请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320F28379S 工具/软件:Code Composer Studio
当我在 CMPSS 子系统中使用斜坡发生器来生成斜率电压时、会发生问题。 我设置"Cmpss1Regs.COMPDACCTL.bit.RAMPSOURCE = 6"、我需要在 ePWM7中的 TBCTR=CMPA 上产生中断。 但是、当我启用 ePWM7的中断时、 Cmpss1Regs.RAMPSTS 不变;当我禁用 ePWM7的中断时、 Cmpss1Regs.RAMPSTS 减少了;μ s
我想知道这种现象的原因。 我的代码是否有任何问题?
我的代码被禁止。
void ePwmConfigForCOT( void ){
InitEPwm7Gpio();
//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
EALLOW;
//写入 EALLOW 受保护的寄存器需要此操作
PieVectTable.EPWM7_INT =&epwm7_ISR;
EDIS;
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0;
//////将 ePWM 配置为在 SYSCLK 上运行
ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV = 0;
EPwm7Regs.TBCTL.bit.CLKDIV = 0;
EPwm7Regs.TBCTL.bit.HSPCLKDIV = 0;
EPwm7Regs.TBPRD = 5000; //设置计时器周期
EPwm7Regs.TBPHS.ALL = 0; //相位为0
EPwm7Regs.TBCTR = 0;
//设置 TBCLK
EPwm7Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//向上计数
EPwm7Regs.TBCTL.bit.PHSEN = TB_ENABLE;//同步到来时、TBCTR=TBPHS
//EPwm1Regs.TBCTL.bit.SYNCOSEL = 1; //这些位选择 EPWMxSYNCO 信号源。 0表示 EPWMxSYNC
// EPwm7Regs.HRPCTL.bit.PWMSYNCSEL = 1;// 0 PWMSYNC = PRD_eq 信号脉冲 1 PWMSYNC = CNT_ZERO 信号脉冲
//EPwm1Regs.TBCTL.bit.FREE_SOFT=0x0;
// SyncSockRegs.SYNCSELECT.BIT.EPWM7SYNCIN = 6;// 0:EPWM7SYNCOUT
EPwm7Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//这些位选择 EPWMxSYNCO 信号源。 0表示 EPWMxSYNC TB_SYNC_IN
// TB_SYNC_IN=0 TB_CTR_ZERO
EPwm7Regs.TBCTL.bit.HSPCLKDIV=0; //时钟与 SYSCLKOUT 的比率
EPwm7Regs.TBCTL.bit.CLKDIV = 0;
// TBCLK = SYSCLKOUT /(HSPCLKDIV×CLKDIV)
EPwm7Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE;//每零加载一次寄存
器// EPwm7Regs.CMPCTL.bit.SHDWBMODE = CC_SHADODE;
EPwm7Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
// EPwm7Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
//设置比较
EPwm7Regs.CMPA.bit.CMPA = 55;// 40/8*(10^7)= 500ns
EPwm7Regs.AQCTLA.bit.ZRO = AQ_SET; //在 CAU 当CTR = 0时,强制EPWM1A输出高电平 Ω 时设置 PWM1A
EPwm7Regs.AQCTLA.bit.CAU = AQ_CLEAR; // 当CTR = CMPA且计数器CTR增计数时,强制EPWM1A输出低电平 μ V
// EPwm7Regs.AQCTLB.bit.ZRO = AQ_CLEAR; //在 CAU 当CTR = 0时,强制EPWM1A输出高电平 μ s 上设置 PWM1A
// EPwm7Regs.AQCTLB.bit.CAU = AQ_SET; // 当CTR = CMPA且计数器CTR增计数时,强制EPWM1A输出低电平 Ω
//低电平有效 PWM -设置死区
EPwm7Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;
EPwm7Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm7Regs.DBCTL.bit.IN_MODE = DBA_ALL;
EPwm7Regs.DBRED.bit.DBRED = 5;
EPwm7Regs.DBFED.bit.DBFED = 10;
EDIS;
EALLOW;
// EPwmXbarRegs
EPwmXbarRegs.TRIP4MUX0TO15CFG.bit.MUX0 = 0;// CMPSS1.CTRIPH -> MUX0输出-> TRIP4MUXENABLE 开关
EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX0 = 1;// TRIP4MUXENABLE 启用 MUX0
EPwmXbarRegs.TRIPOUTINV.bit.TRIP4 = 0;//高电平有效
EPwm7Regs.DCTRIPSEL.bit.DCAHCOMPSEL = DC_TRIPIN4; // DCAH =比较器1输出 DCAH的电平高低由比较器1的输出决定
// EPwm7Regs.DCTRIPSEL.bit.DCALCOMPSEL = DC_TZ2; // DCAL = TZ2 DCAL的电平高低由TZ2决定 μ A
EPwm7Regs.TZDCSEL.bit.DCAEVT1 = TZ_DCAH_HI; // DCAEVT1 = DCAH 高电平(随着比较器输出变为高电平将变为有效)
// // DCAH高电平时产生DCAEVT1事件
//
// EPwm7Regs.DCACTL.bit.EVT1SRCSEL = DC_EVT_FLT;
EPwm7Regs.DCACTL.bit.EVT1SRCSEL = DC_EVT1; //
EPwm7Regs.DCACTL.bit.EVT1FRCSYNCSEL = DC_EVT_异 步;//采用异步路径
EPwm7Regs.DCACTL.bit.EVT1SYNCE = 1; ////同步已启用:
////与 DCAEVT1同步:166ns 延迟。 跳闸时间:31ns
EPwm7Regs.TZCTL.bit.DCAEVT1 = TZ_NO_CHANGE;
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
// DCAEVT1的事件过滤配置(目前已禁用)
EPwm7Regs.DCFCTL.bit.SRCSEL = DC_SRC_DCAEVT1;
EPwm7Regs.DCFCTL.bit.Blanke = DC_BLANK_DISABLE;
EPwm7Regs.DCFCTL.bit.PULSESEL = DC_PULSESEL_ZERO;//针对消隐和捕捉对齐的脉冲选择
EPwm7Regs.DCFCTL.bit.BLANKINV = 0;
EPwm7Regs.DCFOFFSET = 0;//消隐窗口偏移= CMPA (n+1)
EPwm7Regs.DCFWINDOW = 100;//消隐窗口长度-初始值
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//EPwm7Regs.TZFlG.bit.DCAEVT1
//EPwm7Regs.TZCLR.bit.DCAEVT1
EDIS;
//中断,我们将在其中更改比较值
EPwm7Regs.ETSEL.bit.INTSEL = ET_CTRL_CMPA; //选择“零时 INT”事件
// EPwm7Regs.ETSEL.bit.INTSEL = et_CTR_ZERO; //选择“零时 INT”事件
EPwm7Regs.ETPS.bit.INTPRD = et_1st; //在第1个事件发生时生成 INT
EPwm7Regs.ETSEL.bit.INTEN = 1; //启用 INT
//步骤5. 特定于用户的代码、启用中断:
//启用连接到 EPWM1-12 INT 的 CPU INT3:
//IER |= M_INT3;
//在 PIE 中启用 ePWM INTn:组3中断1-12
//PieCtrlRegs.PIEIER3.bit.INTx7=1;
EALLOW;
GpioCtrlRegs.GPBGMUX2.bit.GPIO52=01; //
GpioCtrlRegs.GPBMUX2.bit.GPIO52=01; //gpio60 -> OUTPUTXBAR3 (O)
//
//配置 CTRIPOUTH 输出引脚
//将 OUTPUTXBAR3配置为 CTRIPOUT1H
//
SyncSockRegs.SYNCSELECT.BIT.SYNCOUT = 2;// 0:EPWM7SYNCOUT
OutputXbarRegs.OUTPUT1MUX0TO15CFG.bit.MUX14 = 3;
//
//为输出启用 OUTPUTXBAR3多路复用器
//
OutputXbarRegs.OUTPUT1MUXENABLE.bit.MUX0 = 1;
EDIS;
}
void CmpssConfigForCOT (void){
// GPIO_SetupPinMux (GPIO_CTRIP_PIN_NUM、GPIO_MUX_CPU1、GPIO_CTRIP_PER_NUM);
// GPIO_SetupPinMux (GPIO_CTRIPOUT_PIN_NUM、GPIO_MUX_CPU1、
// GPIO_CTRIPOUT_PER_NUM);
EALLOW;
GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 01; //
GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 01; //gpio60 -> OUTPUTXBAR3 (O)
// GpioCtrlRegs.GPBDIR.bit.GPIO60 =
EDIS;
EALLOW;
// CpuSysRegs.PCLKCR0.bit.ADCENCLK = 1;
AdcRegs.ADCCTL1.bit.ADCPWDNZ = 1;
// AdcRegs.ADCCTL1.bit.ADCBGPWD = 1;
DELAY_US (1000);
//
//启用 CMPSS
//
Cmpss1Regs.COMPCTL.bit.COMPDACE = 1;
//
//NEG 信号来自 DAC
//
Cmpss1Regs.COMPCTL.bit.COMPHSOURCE = NEGIN_DAC;
//
//使用 VDDA 作为 DAC 的基准
//
Cmpss1Regs.COMPDACCTL.bit.SELREF = reference_VDDA;
Cmpss1Regs.COMPDACCTL.bit.DACSOURCE = 1;//从斜坡发生器更新 DACHVALA
Cmpss1Regs.COMPDACCTL.bit.RAMPSOURCE = 6;// n-1 --> PWMSYNCn
// Cmpss1Regs.COMPDACCTL.bit.RAMPLOADSEL = 1;
// Cmpss1Regs.COMPDACCTL.bit.SWLOADSEL = 1;
//
//将 DAC 设置为中点以进行任意引用
//
//Cmpss1Regs.DACHVALS .bit.DACVAL = 2048;
cmps1Regs.RAMPMAXREFS =(uint16)(2048 << 4);
cmps1Regs.RAMPDECVALS = 2;
cmps1Regs.RAMPDLYS.bit.delay = 30;
Cmpss1Regs.COMPHYSCTL.bit.COMPHYS = 4; // 2设置为典型迟滞的2倍
//
//配置 CTRIPOUT 路径
//异步输出馈送 CTRIPH 和 CTRIPOUTH
//
Cmpss1Regs.COMPCTL.bit.CTRIPHSEL = Clrip_asynch;
Cmpss1Regs.COMPCTL.bit.CTRIPOUTHSEL = Clrip_asynch;
//
//配置 CTRIPOUTH 输出引脚
//将 OUTPUTXBAR3配置为 CTRIPOUT1H
//
OutputXbarRegs.OUTPUT3MUX0TO15CFG.bit.MUX0 = 0;
//
//为输出启用 OUTPUTXBAR3多路复用器
//
OutputXbarRegs.OUTPUT3MUXENABLE.bit.MUX0 = 1;
// Cmpss1Regs.COMPCTL.bit.COMPDACE = 1;
EDIS;
}
_interrupt void epwm7_isr (void){ //清除此计时器的 INT 标志 EPwm7Regs.ETCLR.bit.INT = 1; if (Cmpss1Regs.COMPSTS.bit.COMPHSTS ==1){ // EPwm1Regs.TZFRC.bit.DCAEVT1 = 1; EPwm7Regs.TBCTL.bit.SWFSYNC = 1; } //确认此中断以接收来自组3的更多中断 PieCtrlRegs.PIEACX.ALL = PIEACK_Group3; }