主题中讨论的其他器件:SYSBIOS
工具/软件:
BIOS 系统的代码如下所示。 图 1 显示了 EPWM 波形(蓝色)和中断波形(黄色,每次进入 EPWM 中断时切换一次)。 如图所示、中断的切换位置不会在 ePWM 波形的中点(即 PRD 位置)发生。 此外、在固定的间隔 (1ms) 下会发生中断异常。
BIOS.cpufreq.lo = 120000000;
load.hwiEnabled = true;
load.swiEnabled = true;
Var task0Params = new Task.Params ();
task0Params.instance.name =“task0";“;
task0Params.priority = 12;
TASK0Params.STACKSIZE = 512;
program.global.task0 = Task.create(“&TaskParameterInit",“,task0Params、task0Params);
Var task1Params =新建 Task.Params ();
task1Params.instance.name =“Task1";“;
task1Params.priority = 8;
TASK1Params.STACKSIZE = 512;
program.global.task1 = Task.create(“&TaskBasicControl",“,task1Params、task1Params);
//任务 2
Var task2Params =新建 Task.Params ();
task2Params.instance.name =“task2";“;
task2Params.priority = 7;
TASK2Params.STACKSIZE = 768;
program.global.task2 = Task.create(“&TaskMonitorControl",“,task2Params、task2Params);
var ti_sysbios_hal_Hwi0Params = new ti_sysbios_hal_hwi.Params ();
ti_sysbios_hal_Hwi0Params.instance.name =“hwi_pwm";“;
TI_SYSBIOS_Hal_Hwi0Params.priority = 15;
TI_SYSBIOS_Hal_Hwi0Params.EventID =–1;
program.global.hwi_pwm = ti_sysbios_hal_hwi.create (52、“&HwiPwmISR",“,ti_sysbios_hal_Hwi0Params、ti_sysbios_hal_Hwi0Params);
// hwi1
var ti_sysbios_hal_hwi1Params = new ti_sysbios_hal_hwi.Params ();
ti_sysbios_hal_Hwi1Params.instance.name =“hwi_sciarx";“;
TI_SYSBIOS_Hal_Hwi1Params.priority = 9;
program.global.hwi_sciarx = ti_sysbios_hal_Hwi.create (96、“&HwiSciaRX",“,ti_sysbios_hal_Hwi1Params、ti_sysbios_hal_Hwi1Params);
// hwi2
var ti_sysbios_hal_Hwi2Params = new ti_sysbios_hal_hwi.Params ();
ti_sysbios_hal_Hwi2Params.instance.name =“hwi_sciatx";“;
TI_SYSBIOS_Hal_Hwi2Params.priority = 8;
program.global.hwi_sciatx = ti_sysbios_hal_Hwi.create (97、“&HwiSciaTX",“,ti_sysbios_hal_Hwi2Params、ti_sysbios_hal_Hwi2Params);
void EPWM5_Init (void)
{
EALLOW;
CpuSysRegs.PCLKCR2.bit.EPWM5 = 1;//开启EPWM1时钟 μ s
EDIS;
// EALLOW;
//EPwm5Regs.TZSEL.BIT.OSHT4 = 1;//使能单次触发(单次触发)保护 μ s
//EPwm5Regs.TZEINT.bit.OST = 1;
//EDIS;
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO8 = 1;//禁用 GPIO0 (EPWM1A) 上的上拉
GpioCtrlRegs.GPAPUD.bit.GPIO9 = 1;//禁用 GPIO1 上的上拉电阻 (EPWM1B)
GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 1;//将 GPIO0 配置为 EPWM1A
GpioCtrlRegs.GPAMUX1.bit.GPIO9 = 1;//将 GPIO1 配置为 EPWM1B
EDIS;
EPwm5Regs.TBCTL.BIT.PHSEN = TB_ENABLE;//相位加载使能 μ s
EPwm5Regs.TBPHS.bit.TBPHS = 0;相位值为0 μ s
EPwm5Regs.TBCTL.BIT.HSPCLKDIV = TB_DIV1;//高速预分频 μ s
EPwm5Regs.TBCTL.BIT.CLKDIV = TB_DIV1;//时基预分频 DIV1意思不分频 μ s
EPwm5Regs.TBPRD = 1000;//设置周期值(决定PWM频率)μ s
EPwm5Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPdown;//向上 μ 向下计数模式 μ s
EPwm5Regs.TBCTL.BIT.PRDLD = TB_SHADOW;//影子寄存器模式 μ s
EPwm5Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;// CMPA使用影子寄存器 μ s
EPwm5Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;// CMPB使用影子寄存器 μ s
EPwm5Regs.CMPCTL.bit.LOADAMODE = 2;//重要、关乎合适加载占空比 μ s
EPwm5Regs.CMPCTL.bit.LOADBMODE = 2;重要、关乎合适加载占空比 μ s
EPwm5Regs.CMPA.bit.CMPA = 0;////初始化CMPA值 μ s
EPwm5Regs.CMPB.bit.CMPB = 1000;//初始化CMPA值 μ s
EPwm5Regs.AQCTLA.bit.CAU = AQCLEAR;//当计数器 μ 比较值A且计数方向向上(μ s 向上)时、清除PWM1A(拉低)μ s
EPwm5Regs.AQCTLA.bit.cad = AQ_SET;//当计数器=比较值A且计数方向向下(μ s 向下)时、置位PWM1A(拉高)μ s
EPwm5Regs.AQCTLB.bit.CBU = AQ_SET;//当计数器 μ 比较值A且计数方向向上(μ s)时、清除PWM1A(拉低)μ s 向上计数
EPwm5Regs.AQCTLB.bit.CBD = AQCLEAR;//当计数器=比较值A且计数方向向下(μ s 向下)时、置位PWM1A(拉高)μ s
EPwm5Regs.ETSEL.bit.INTSEL = ET_CTR_PRD;
EPwm5Regs.ETSEL.bit.intEn = 1;//使能ePWM1中断 μ s
EPwm5Regs.ETPS.bit.INTPRD = 1;//每个事件都触发中断(无分频)μ s
}
void HwiPwmISR (void)
{
LED16_TOGGLE;
LED17_toggle;
EPwm5Regs.ETCLR.bit.INT = 1;
}
非 BIOS 系统的代码如下所示。 图 2 显示了 EPWM(蓝色)波形和中断(黄色,每次进入 EPWM 中断时切换一次)波形。 从图中可以看出、中断切换恰好在 EPWM 波形的中点发生、并保持稳定、不会出现任何异常。
void EPWM5_Init (void)
{
EALLOW;
CpuSysRegs.PCLKCR2.bit.EPWM5 = 1;//开启EPWM1时钟 μ s
EDIS;
EALLOW;
PieVectTable.EPWM5_INT =&epwm1_timer_ISR;提供中断服务程序入口 μ s
EDIS;
// EALLOW;
// EPwm5Regs.TZSEL.bit.OSHT4 = 1;//使能单次触发(单次)保护 μ s
//EPwm5Regs.TZEINT.bit.OST = 1;
//EDIS;
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO8 = 1;//禁用 GPIO0 (EPWM1A) 上的上拉
GpioCtrlRegs.GPAPUD.bit.GPIO9 = 1;//禁用 GPIO1 上的上拉电阻 (EPWM1B)
GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 1;//将 GPIO0 配置为 EPWM1A
GpioCtrlRegs.GPAMUX1.bit.GPIO9 = 1;//将 GPIO1 配置为 EPWM1B
EDIS;
EPwm5Regs.TBCTL.BIT.PHSEN = TB_ENABLE;//相位加载使能 μ s
EPwm5Regs.TBPHS.bit.TBPHS =0;//相位值为0 μ s
EPwm5Regs.TBCTL.BIT.HSPCLKDIV=TB_DIV1;//高速预分频 μ s
EPwm5Regs.TBCTL.BITS.CLKDIV=TB_DIV1;//时基预分频 DIV1意思不分频 μ s
EPwm5Regs.TBPRD = 1000;//设置周期值(决定PWM频率)μ s
EPwm5Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPdown;//向上 μ 向下计数模式 μ s
EPwm5Regs.TBCTL.BIT.PRDLD = TB_SHADOW;//影子寄存器模式 μ s
EPwm5Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;// CMPA使用影子寄存器 μ s
EPwm5Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;// CMPB使用影子寄存器 μ s
EPwm5Regs.CMPCTL.bit.LOADAMODE = 2;//重要、关乎合适加载占空比 μ s
EPwm5Regs.CMPCTL.bit.LOADBMODE = 2;重要、关乎合适加载占空比 μ s
EPwm5Regs.CMPA.bit.CMPA = 500;//初始化CMPA值 μ s
EPwm5Regs.CMPB.bit.CMPB = 500;//初始化CMPA值 μ s
EPwm5Regs.AQCTLA.bit.CAU = AQclear;//当计数器 μ 比较值A且计数方向向上(μ s)时、清除PWM1A(拉低)μ s 向上计数
EPwm5Regs.AQCTLA.bit.cad = AQ_SET;//当计数器=比较值A且计数方向向下(μ s 向下)时、置位PWM1A(拉高)μ s
EPwm5Regs.AQCTLB.bit.CBU = AQ_SET;//当计数器 μ 比较值A且计数方向向上(μ s 向上)时、清除PWM1A(拉低)μ s
EPwm5Regs.AQCTLB.bit.CBD = AQCLEAR;//当计数器=比较值A且计数方向向下(μ s 向下)时、置位PWM1A(拉高)μ s
EPwm5Regs.ETSEL.bit.INTSEL =ET_CTR_PRD;
EPwm5Regs.ETSEL.bit.intEn = 1;//使能ePWM1中断 μ s
EPwm5Regs.ETPS.bit.INTPRD = 1;//每个事件都触发中断(无分频)μ s
EALLOW;
PieCtrlRegs.PIEIER3.bit.INTx5 = 1;// EPWM1中断 μ s
IER |= M_INT3;使能CPU中断3 μ s
EDIS;
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;//同步启动所有ePWM时基计数器 μ s
EDIS;
EINT;//开启全局中
ERTM;//允许实时调试中断
}
__ interrupt void epwm1_timer_isr (void)
{
LED16_TOGGLE;
LED17_toggle;
EPwm1Regs.ETCLR.bit.INT = 1;
PieCtrlRegs.PIEACK.bit.ACK3 = 1;
}

