具体移步:http://bbs.21ic.com/icview-767440-1-1.html
一.ePWM模块
void ePWM2_config()
{
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;
EDIS;
/*-------------------------------------------------
STEP1:设置TB,为输出PWM产生始终基准TBCLK,配置PWM的时钟基准计数器TBCTR,
设置计数器的计数模式,配置硬件或软件同步时钟基准计数器,确定ePWM同步信号输出源;
-------------------------------------------------*/
EPwm2Regs.TBPRD=6000;
EPwm2Regs.TBCTR=0;
EPwm2Regs.TBCTL.bit.CTRMODE=TB_COUNT_UPDOWN;
EPwm2Regs.TBPHS.half.TBPHS=0;
EPwm2Regs.TBCTL.bit.PHSEN=TB_DISABLE;
/*----------------------------------------------
注1:相位寄存器TBPHS和TBCTL.bit.PHSEN+PHSDIR连用,表示在同步输入信号SWFSYNC有效时,
在下一个时钟沿,TBCTR自动装入TBPHS的内容,并按照PHSDIR计数方式继续。
-----------------------------------------------*/
EPwm2Regs.TBCTL.bit.HSPCLKDIV=TB_DIV4;
EPwm2Regs.TBCTL.bit.CLKDIV=TB_DIV4;
//以上两个共同决定TBCLK频率
/*-------------------------------------------------
STEP2:设置CC和AQ,确定PWM占空比,以及ePWM输出高低电平切换时间;
确定计数器和比较寄存器匹配时产生动作,即ePWM 高低电平的切换;
-------------------------------------------------*/
EPwm2Regs.CMPA.half.CMPA=3000;
EPwm2Regs.AQCTLA.bit.CAU=AQ_SET;
EPwm2Regs.AQCTLA.bit.CAD=AQ_CLEAR;
EPwm2Regs.AQCTLB.bit.CAU=AQ_CLEAR;
EPwm2Regs.AQCTLB.bit.CAD=AQ_SET;
/*------------------------------------------------
注2:CAU和CAD用于规定增计数和减计数过程中TBCTR=CMPA时输出的动作.
CBU和CBD用于规定增计数和减计数过程中TBCTR=CMPB时输出的动作.
AQCTLA和AQCTLB用于规定事件发生时ePWMxA和ePWMxB的动作.
这里面两路都和CMPA相比较,因而可输出两路互补的波形.
当然,在非互补时,CMPA和CMPB不同,因而有一定的时间延迟(可转换成角度).
-------------------------------------------------*/
/*-------------------------------------------------
STEP3:设置DB,为了使互补信号电平转换(边沿)时刻,上下两个器件不能同时导通,
必须保证二者的开启时间不能重叠,因此要插入波形上升沿或下降沿延时时间
-------------------------------------------------*/
EPwm2Regs.DBCTL.bit.OUT_MODE=DB_FULL_ENABLE; //死区使能
EPwm2Regs.DBCTL.bit.POLSEL=DB_ACTV_HIC; //极性选择,两路延时后输出均不反向
EPwm2Regs.DBRED=20;
EPwm2Regs.DBFED=20; //死区时间
/*-------------------------------------------------
STEP4:设置 EZ,使能ePWM中断,使能ePWM触发ADC采样,
以及确定事件产生触发的速度和清除相关事件标志位。
-------------------------------------------------*/
EPwm2Regs.ETSEL.bit.INTSEL=ET_CTR_ZERO;
EPwm2Regs.ETSEL.bit.INTEN=1; //INTEN+INTSEL(ePWM_INT)类型,本次为下溢中断
EPwm2Regs.ETPS.bit.INTPRD=ET_3RD; //ETPS选择触发或中断周期,本次为每3个事件触发一次中断
// 注3:进入中断后别忘了 EPwm2Regs.ETCLR.bit.INT=1清除中断
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;
EDIS;
}
二.eCAP模块
可用于检测脉冲周期和占空比,本次为检测捕获输入引脚上发生的电平跳变。
注:引脚设置和中断设置,略
void eCap1——config(void)
{
ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP2POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP3POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP4POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CTRRST1 = EC_ABS_MODE;
ECap1Regs.ECCTL1.bit.CTRRST2 = EC_ABS_MODE;
ECap1Regs.ECCTL1.bit.CTRRST3 = EC_ABS_MODE;
ECap1Regs.ECCTL1.bit.CTRRST4 = EC_ABS_MODE;
ECap1Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
ECap1Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
ECap1Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap1Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
ECap1Regs.ECEINT.all=0x0000;//stop all interrupt
ECap1Regs.ECCLR.all=0xFFFF;//clare all flag
ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;// 启动
ECap1Regs.ECEINT.bit.CEVT4=1;// Enable cevt4 interrupt
}
void eCap2——config(void)
{
ECap2Regs.ECCTL1.bit.CAP1POL = EC_FALLING;
ECap2Regs.ECCTL1.bit.CAP2POL = EC_FALLING;
ECap2Regs.ECCTL1.bit.CAP3POL = EC_FALLING;
ECap2Regs.ECCTL1.bit.CAP4POL = EC_FALLING;
ECap2Regs.ECCTL1.bit.CTRRST1 = EC_ABS_MODE;
ECap2Regs.ECCTL1.bit.CTRRST2 = EC_ABS_MODE;
ECap2Regs.ECCTL1.bit.CTRRST3 = EC_ABS_MODE;
ECap2Regs.ECCTL1.bit.CTRRST4 = EC_ABS_MODE;
ECap2Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
ECap2Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
ECap2Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
ECap2Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
ECap2Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap2Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
ECap2Regs.ECEINT.all=0x0000;//stop all interrupt
ECap2Regs.ECCLR.all=0xFFFF;//clare all flag
ECap2Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;// 启动
ECap2Regs.ECEINT.bit.CEVT4=1;// Enable cevt4 interrupt
}
interrupt void ISRCap1(void)
{
// Acknowledge this interrupt to receive more interrupts from group 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
ECap1Regs.ECCLR.all=0xFFFF;//clare all flag
t1= ECap1Regs.CAP1;
t2= ECap1Regs.CAP2;
t3= ECap1Regs.CAP3;
t4= ECap1Regs.CAP4;
T1=t2-t1;T2=t4-t3;
}
interrupt void ISRCap2(void)
{
// Acknowledge this interrupt to receive more interrupts from group 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
ECap2Regs.ECCLR.all=0xFFFF;//clare all flag
t5= ECap2Regs.CAP1;
t6= ECap2Regs.CAP2;
t7= ECap2Regs.CAP3;
t8= ECap2Regs.CAP4;
T3=t6-t5;T4=t8-t7;
}