Other Parts Discussed in Thread: TMS320F28035
工具/软件:TI C/C++编译器
您好!
我正在使用“TMS320F28035”处理器。 我有一个与计数器相关的问题(向上、向下、向上-向下)。 我想为连续中断使用递增计数器和递减计数器、而不是直接使用递增/递减计数器。 我正在使用 EPwm1中断。 为此、我编写了如下代码。 对于该代码、我没有获得预期结果。
//
void main (void)
{
InitSysCtrl(); // DSP2803x_sysctrl.c 中的基本内核初始化
EALLOW;
SysCtrlRegs.WDCR= 0x00AF; //重新启用看门狗
EDIS;
DINT; //禁用所有中断
GPIO_SELECT();
InitPieCtrl(); // PIE 表的基本设置;来自 DSP2803x_PIECTRL.c
InitPieVectTable(); // PIE 中的默认 ISR
EALLOW;
PieVectTable.EPWM1_INT =&ePWM1A_COMPARE_ISR;
EDIS;
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;//在 PIE 中启用 EPWM1A INT:组3中断1
IER |= 0x4;//启用中断内核线路3 (INT3)。
EINT;
ERTM;
while (1)
{
Setup_ePWM1 (); // ePWM1A 的初始化
EALLOW;
SysCtrlRegs.WDKEY = 0x55; //服务 WD #1
EDIS;
}
}
void GPIO_select (void)
{
EALLOW;
GpioCtrlRegs.GPAMUX1.ALL = 0; // GPIO15... GPIO0 =通用尸体 I/O
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;// ePWM1A 被激活
GpioCtrlRegs.GPAMUX2.ALL = 0; // GPIO31... GPIO16 =通用 I/O
GpioCtrlRegs.GPBMUX1.ALL = 0; // GPIO44... GPIO32 =通用 I/O
EDIS;
}
void Setup_ePWM1 (void)
{
/******** ePWM1A
EPwm1Regs.TBCTL.bit.CLKDIV = 0x0000; // CLKDIV = 1
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0x0001;// HSPCLKDIV = 2
如果(索引1 % 2 = 0) //余数= 0
{
EPwm1Regs.TBCTL.bit.CTRMODE = 0x0000; // 向上计数模式
EPwm1Regs.AQCTLA.bit.CAU = 0x2; // 在 CMPA 上设置 EPwm1A
EPwm1Regs.AQCTLA.bit.PRD = 0x1; // 清除 TBPRD 上的 EPwm1A
}
其他
{
EPwm1Regs.TBCTL.bit.CTRMODE = 0x0001; // 递减计数模式
EPwm1Regs.AQCTLA.bit.CAD = 0x2; // 将 CMPA 上的 EPwm1A 设置为低电平
EPwm1Regs.AQCTLA.bit.ZRO = 0x1; // 清零 EPwm1A
}
EPwm1Regs.TBPRD = 20000; // 对于1.5KHz PWM 生成50Hz 正弦
EPwm1Regs.ETSEL.ALL = 0;
EPwm1Regs.ETSEL.bit.INTEN = 1; // 针对 ePWM1启用中断
如果(索引1 % 2 = 0)
{
EPwm1Regs.ETSEL.bit.INTSEL = 2; // PRD 匹配上的中断(CTR = PRD)
}
其他
{
EPwm1Regs.ETSEL.bit.INTSEL = 1; // ZRO 匹配上的中断(CTR = ZRO)
}
EPwm1Regs.ETPS.bit.INTPRD = 1; //第一个事件发生中断
///----------------------------------------------
}
中断空 ePWM1A_COMPARE_ISR (空)
{
//每个中断处理看门狗
EALLOW;
SysCtrlRegs.WDKEY = 0xAA; //服务 WD #2
EDIS;
EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD -_IQsat (_IQ30mpy (_IQ30 (0.2)、EPwm1Regs.TBPRD)、EPwm1Regs.TBPRD、0);
index1 += 1; //使用查找表中的下一个元素
if (索引1>30)
{
索引1 = 1;
}
EPwm1Regs.ETCLR.bit.INT = 1; //清除 ePWM1中断标志
PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;//或4 (0000000000000100)
}