paradoxfx

【原创】TI C2833x介绍---HRPWM(14)

0
阅读(4638)

下面用一个Buck变换器的小例子说明HRPWM的使用;Buck变换器的示意图为:

既然是Buck变化,那开关频率自然是非常高的,具体的参数是:

1.SYSCLOCKOUT=100MHz

2.PWM开关频率=1MHz(非对称模式下,ePWM的周期值为100,计数器为增计数模式)

3.期望的PWM分辨率为1.27bit

4.MEP步长为150ps

PWM的计数模式示意图为:

为了模块化的编程,在HRPWM相关的头文件里用宏定义:

// HRPWM的配置

#define HR_Disable 0x0

#define HR_REP 0x1 //上升沿控制

#define HR_FEP 0x2 //下降沿控制

#define HR_BEP 0x3 //边沿控制

#define HR_CMP 0x0 //调整CMPAHR

#define HR_PHS 0x1 //调整TBPHSHR

#define HR_CTR_ZERO 0x0 //计数值= 0的事件

#define HR_CTR_PRD 0x1 //周期匹配事件

然后在使能ePWM的计数器之前,初始化HRPWM

void HrBuckDrvCnf(void)

{

//首先需要配置传统的PWM

EPwm1Regs.TBCTL.bit.PRDLD = TB_IMMEDIATE; //立即装载模式

EPwm1Regs.TBPRD = 100; //开关频率为1MHz

hrbuck_period = 200; // Q15Q0的转换

EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;

EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // EPWM1 is the Master

EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;

EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;

EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

// EPWMxB都不能被调节,但是可以用来与HRPWM的波形做对比

EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;

EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;

EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; //可选的

EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; //可选的

EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;

EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;

EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET; //可选的

EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR; //可选的

//配置HRPWM相关寄存器的初始化

EALLOW; // HRPWM的几个配置寄存器为EALLOW保护的

// 28335上只有6EPWMxA可以调整

EPwm1Regs.HRCNFG.all = 0x0; //初始化所有配置

EPwm1Regs.HRCNFG.bit.EDGMODE = HR_FEP; //调整下降沿

EPwm1Regs.HRCNFG.bit.CTLMODE = HR_CMP; //CMPAHR完成MEP的调整

EPwm1Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO; //在计数值为0时映射

EDIS;

MEP_ScaleFactor = 66*256; //初始化为典型的MEP预定标因子值

// 100MHz系统时钟频率的情况

//后面使用SFOMEP预定标因子进行实时调节

}

为了达到更快的处理速度,在这里使用一段简单的汇编代码进行CMPAHR寄存器的赋值:

MPYU ACC,T,@_hrbuck_period ; Q15Q0的转换

MOV T,@_MEP_ScaleFactor ; MEP预定标因子

MPYU P,T,@AL ; P <= T * AL,

MOVH @AL,P ; AL <= P,把结果返回给ACC

ADD ACC, #0x180 ; MEP调整

MOVL *XAR3,ACC ; CMPA:CMPAHR(31:8) <= ACC

; EPWM1B (Regular Res)只用来对比

MOV *+XAR3[2],AH ;ACCH保存到CMPB

Baidu
map