paradoxfx

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

0
阅读(5518)

调用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