【原创】TI C2833x介绍---HRPWM(14)
0赞下面用一个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; // Q15到Q0的转换
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上只有6个EPWMxA可以调整
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系统时钟频率的情况
//后面使用SFO对MEP预定标因子进行实时调节
}
为了达到更快的处理速度,在这里使用一段简单的汇编代码进行CMPAHR寄存器的赋值:
MPYU ACC,T,@_hrbuck_period ; Q15到Q0的转换
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