【原创】TI C2833x介绍---HRPWM(11)
0赞
调用SFO的库进行MEP预定标因子的实时修正,在把相关的头文件、库文件(例如SFO.h、SFO_TI_Build_fpu.lib)添加近工程之后,一般情况下可以按照下面的步骤进行:
1. main函数中初始化系统时钟、GPIO、外设控制、IER、IFR、中断向量表、使能中断等。
2. 关闭各个ePWM模块间的时钟同步。
3. 根据需要校正的通道数,定义并初始化MEP_ScaleFactor的数组。
for(i=0;i<PWM_CH;i++)
{
MEP_ScaleFactor[i] =0;
}
4. 等待SFO的初始化完毕。
5. 给ePWM和HRPWM的相关寄存器赋初值,例如开关频率、计数模式等。
6. 重新使能各个ePWM模块间的时钟同步。
7. 使能HRPWM对传统ePWM波形的校正,并调用SFO_MepDis_V5或者别的库进行预定标因子的初始化。(V5版本的库可以修正6个通道,老版本的支持4个通道)。
8. 接下来可以体验一下HRPWM的修正效果了:主要是按照前面提到的方法写入CMPA和CMPAHR寄存器;TI官方例子中对这两个寄存器的赋值程序如下,已经是优化的很好的代码了:
for(i=1;i<PWM_CH;i++)
{
CMPA_reg_val = ((long)DutyFine * (*ePWM[i]).TBPRD)>>15;
temp = ((long)DutyFine * (*ePWM[i]).TBPRD) ;
temp = temp - ((long)CMPA_reg_val<<15);
CMPAHR_reg_val = (temp*MEP_ScaleFactor[i])>>15;
CMPAHR_reg_val = CMPAHR_reg_val << 8;
CMPAHR_reg_val += 0x0180;
// Example for a 32 bit write to CMPA:CMPAHR
(*ePWM[i]).CMPA.all = ((long)CMPA_reg_val)<<16 | CMPAHR_reg_val;
}
如果暂时不需要修正,则可以使用:
(*ePWM[i]).CMPA.half.CMPA = ((long)DutyFine * (*ePWM[i]).TBPRD>>15);
9。 因为MEP预定标因子在实际系统里也不会变化很快,所以可以把它放在主程序里面的后台循环里面,这样只要在紧张的中断间隙里调用一下就好了:
status = SFO_MepEn_V5(nMepChannel);
if (status == SFO_COMPLETE)
// Once SFO_MepEn_V5 complete (returns 1)-
nMepChannel++; // move on to next channel
else if (status == SFO_OUTRANGE_ERROR)
// If MEP_ScaleFactor[nMepChannel] differs
{
// from seed Mep_ScaleFactor[0] by more than
error();
// +/-15, status = 2 (out of range error)
}
if(nMepChannel==PWM_CH)
nMepChannel =1;
// Once max channels reached, loop back to channel 1