This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
您好!
我正在使用全桥逆变器。 我在20kHz 频率下成功地使用正弦表获得了4个 PWM 信号、以实现开环输出。 它使用 ePWM ISR 从正弦表更新占空比。 我目前正在研究闭环解决方案。 我正在尝试使用 ADC 计算输出60Hz 波形的 RMS 值。 当我尝试将 Timer1设置为16.67ms (60Hz)时、我 的 EPWM ISR 将被忽略。 我无法 同时运行两个 ISR。 下面是我的一些代码(主代码和计时器 ISR)、用于查看是否有人可以发现问题:
void main (void)
{
InitSysCtrl();// DSP2833x_sysctrl.c 中的基本内核初始化
EALLOW;
SysCtrlRegs.WDCR= 0x00AF;//重新启用看门狗
EDIS;//0x00AF 要不禁用看门狗、预分频器= 64
DINT;//禁用所有中断
GPIO_SELECT();
Setup_ePWM ();//init of ePWM1A
InitPieCtrl();// PIE 表的基本设置;来自 DSP2833x_PIECTRL.c
InitPieVectTable();// PIE 中的缺省 ISR
InitAdc();
EALLOW;
PieVectTable.TINT0 =&CPU_timer0_ISR;
EDIS;
InitCpuTimer();//基本设置 CPU Timer0、1和2
ConfigCpuTimer (&CpuTimer0、150、833);
CpuTimer0Regs.TCR.bit.TSS = 0;
EALLOW;
PieVectTable.EPWM1_INT =&ePWM_COMPARE_ISR;
EDIS;
PieCtrlRegs.PIEIER1.bit.INTx7=1;
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
IER |= 1;\
IER |= M_INT1;
EINT;
ERTM;
//配置 ADC
AdcRegs.ADCMAXCONV.ALL = 0;//在 SEQ1上设置1 conv
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x3;//将 ADCINA3设置为第1个 SEQ1转换器
AdcRegs.ADCTRL2.bit.ePWM_SOCA_SEQ1 = 1;//从 ePWM 启用 SOCA 以启动 SEQ1
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;//启用 SEQ1中断(每个 EOS)
值= 1;
while (1)
{
while (CpuTimer0.InterruptCount = 0)
CpuTimer0.InterruptCount = 0;
EALLOW;
SysCtrlRegs.WDKEY = 0x55;//服务 WD #1
EDIS;
}
}
中断空 CPU_timer0_ISR (空)
{
CpuTimer0.InterruptCount++;
值++;
EALLOW;
SysCtrlRegs.WDKEY = 0xAA;//服务 WD #2
EDIS;
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;
}
感谢您的任何帮助、
Joe
Joseph、
我的想法是、您要清除 中断 Y 中的一个中断 X 的标志、反之亦然。
1.注释掉计时器 ISR 初始化、并确保问题消失。
2.将定时器 ISR 添加回、在您单步执行中断时观察中断标志行为。
默认情况下应禁用嵌套中断、以便一个中断可以延迟另一个中断、但正确设置不应错过任何中断。 需要注意的一点是、如果中断 X 非常长、中断 Y 可能会在被处理前多次跳闸。
此致、
Cody