我想控制CRM (临界模式)升压电路。 当电感器电流到达其谷值时,ZCD信号获得上升边缘。 当电感器电流达到其峰值时,ZCD信号获得下降边缘。 ZCD信号被发送至DSP。
ZCD连接到DSP的TZ2(GPIO13)引脚,当ZCD的上升沿 出现时,EPWM2的数字比较(DC)子模块输出DCAEVT1.SYNC,如图3-47所示。 如果两个上升边缘之间的时间过小,则可以使用空白窗口过滤ZCD的第二个上升边缘。
如图3-5所示, DCAEVT1.SYNC可将TBPHS加载到TBCTR,然后TBCTR从零增加。 清除TBCTR后,将设置EPWM2B。 当TBCTR等于CMBB时,将清除EPWM2B,并设置EPWM2A。 当TBCTR等于CMPA时,EPWM2A是透明的。
有一个ZCD信号输入DSP,然后是DSP输出EPWM2A和EPWM2B,它们的关系如图1所示。
图1.
我想要使用空白窗口的原因是,当电感器电流有时达到其峰值时,会出现干扰信号,如图 2显示。 绿色波形是我的ZCD信号。 看起来还可以。 但当您看到浅蓝色波形时,它是EPWMSYNCO信号,有时当ZCD信号处于下降边缘时,浅蓝色波形会变得很明显。 因此,我想使用空白窗口来过滤错误的pluse。
通道1:EPWM1B;通道2:EPWM1SYNCO;通道3:电感器电流;通道4:ZCD信号
图 二
在将代码用于我的升压电路之前。 我使用波形发生器生成ZCD信号和干扰信号来验证我的代码。
如图3所示,绿色波形由波形发生器生成。 它的时期是10us。 它包括ZCD信号和干扰信号。 第一个上升沿是ZCD信号,第二个上升沿是干扰信号。 所以ZCD信号的周期是20us,干扰信号也是20us。 我希望ZCD信号控制PWM,干扰信号被空白窗口忽略。 因此 ,我的PWM周期是20us。 我的偏移量(9-11us) 小于三大珠三角(20us)。
我认为,如果编码正确,第一个信号是ZCD信号,那么EPWM1B设置为高。 6US之后,EPWM1B清除。 第二个信号是干扰信号来了,它将通过空白窗口过滤,因此EPWM1B保持零。 但实验结果并不匹配。
通道1:EPWM1B;通道2:EPWM1A;通道4:ZCD信号
图3.
有我的代码:
包含 "math.h"
#include "DSP28x_Project.h"
void InitEPwm2示例(void);
int main (void){
InitSysCtrl();// 初始化系统控制
InitGpio(); //初始化GPIO
Initepwm2gpio();
InitTzGpio();
//配置ePWM模块
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
InitEPwm2Example();
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
//等待timer0中断
for (;;);
}
void InitEPwm2Example(){
//设置TBCLK
EPwm2Regs.TBCTL.bit.CTRMODE = 0x0; //计数模式
EPwm2Regs.TBPRD =4500; //设置计时器周期,对于本示例,设置为最大值
EPwm2Regs.TBCTL.bit.PHSEN = 0x1; //启用相位加载
EPwm2Regs.TBPHS.Half.TBPHS = 0; //相位为0
EPwm2Regs.TBCTR = 0x0000; //清除计数器
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; //与SYSCLKOUT的时钟比率
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;
//将阴影寄存器加载设置为零
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOD; //加载每零个寄存器
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADO;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
//设置比较值
EPwm2Regs.CMPA.Halp.CMPA = 720; // set比较值8us
EPwm2Regs.CMPB = 450; //设置比较B值5us
//设置操作
EPwm2Regs.AQCTLA.bit.CBU = AQ_SET; //强制EPWM1A输出高电平;高电平开关打开
EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR; //强制EPWM1A输出低电平;高电平开关关闭
EPwm2Regs.AQCTLB.bit.ZRO = AQ_SET; //强制EPWM1B输出高电平;低电平开关打开
EPwm2Regs.AQCTLB.bit.CBU = AQ_CLEAR; //强制EPWM1B输出电压低;低电平开关关闭
//死机时间
EPwm2Regs.DBCTL.bit.in_mode = 0; //清除事件B上的PWM1B,上升计数
EPwm2Regs.DBCTL.bit.HALFCYCLE = 0; //清除事件B上的PWM1B,上升计数
EPwm2Regs.DBCTL.bit.POLSEL = 0; //清除事件B上的PWM1B,上升计数
EPwm2Regs.DBCTL.bit.out模式=2; //清除事件B上的PWM1B,上升计数
EPwm2Regs.DBRED =9; //清除事件B上的PWM1B,上升计数0.1us
//直流
EPwm2Regs.DCTRIPSEL.bit.DCAHCOMPSEL = 1; //TZ2输入
EPwm2Regs.TZDCSEL.bit.DCAEVT1 = 2; //DCAH =高,DCAL =不在乎
EPwm2Regs.DCACTL.bit.EVT1SYNCE = 1; //已启用同步生成
EPwm2Regs.DCACTL.bit.EVT1SRCSEL = 0; //0:源为DCAEVT1信号;1:源为DCEVTFILT信号
EPwm2Regs.TZCTL.bit.DCAEVT1 = 3;
//过滤器
EPwm2Regs.DCFCTL.bit.PULSESEL = 1; //时基计数器等于零
EPwm2Regs.DCFCTL.bit.BLANKINV = 0; //空白窗口未反转
EPwm2Regs.DCFCTL.bit.Blanke =1; //启用了空白窗口
EPwm2Regs.DCFCTL.bit.SRCSEL = 0; //源为DCAEVT1信号
EPwm2Regs.DCFOFFSET = 810; //空白窗口偏移9us
EPwm2Regs.DCFWINDW = 180; //空白窗口宽度2us
}
谢谢!
Chenkai




