大家好,
以下是客户提出的一些问题可能需要您的帮助:
使用2800X系列的ADC中断时:
2800x系列有四个中断:ADCINT1,ADCINT2,ADCINT3,ADCINT4。
1.使用ADCINT1中断时,执行了以下3项测试:
a.使用 PIE中断向量表的ADCA1作为中断项时,中断程序工作正常, LED_FLASH引脚翻转时间:17.2us,80次。
PieVectTable.ADCA1_INT = &adc_A1ISR; // Function for ADCA interrupt 1
IER |= M_INT1;//T0 ADCINT1
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;// ADCINT1
EPwm1Regs.ETSEL.bit.SOCAEN = 0; // Disable SOC on A group
EPwm1Regs.ETSEL.bit.SOCASEL = 3; // Select SOC on up-count
EPwm1Regs.ETPS.bit.SOCAPRD = 1; // Generate pulse on 1st event
EPwm1Regs.CMPA.bit.CMPA = 430; // Set compare A value to 2048 counts
EPwm1Regs.TBPRD = 862; // Set period to 4096 counts
EPwm1Regs.TBCTL.bit.CTRMODE = 3; // Freeze counter
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 7; // SOC0 will convert pin A1
// 0:A0 1:A1 2:A2 3:A3
// 4:A4 5:A5 6:A6 7:A7
// 8:A8 9:A9 A:A10 B:A11
// C:A12 D:A13 E:A14 F:A15
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 9; // Sample window is 10 SYSCLK cycles
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5; // Trigger on ePWM1 SOCA
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0; // End of SOC1 will set INT1 flag
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1; // Enable INT1 flag
AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 0; //Discontinuous
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // Make sure INT1 flag is cleared
The timer function starts the ePWM conversion for 25 ms
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group
EPwm1Regs.TBCTL.bit.CTRMODE = 0; // Unfreeze, and enter up count mode
ADC1 interrupt function
__interrupt void adc_A1ISR(void)
{
LED_FLASH=1;
Current.Sum+=AdcaResultRegs.ADCRESULT1;
if(++Current.ConversionCount==80)
{
Current.ConversionCount=0;
Current.Data=(Current.Sum/80);
Current.Sum=0;
EALLOW;
EPwm1Regs.ETSEL.bit.SOCAEN = 0; // Enable SOC on A group
EPwm1Regs.TBCTL.bit.CTRMODE = 3; // Unfreeze, and enter up count mode
EDIS;
}
//
// Clear the interrupt flag
//
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
//
// Check if overflow has occurred
//
if(1 == AdcaRegs.ADCINTOVF.bit.ADCINT1)
{
AdcaRegs.ADCINTOVFCLR.bit.ADCINT1 = 1; //clear INT1 overflow flag
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag
}
//
// Acknowledge the interrupt
//
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
b. 使用PIE中断向量表的ADCC1作为中断项时,中断程序不运行,并且不能输入中断。
PieVectTable.ADCC1_INT = &adc_C1ISR; // Function for ADCC interrupt 1
IER |= M_INT1;//T0 ADCINT1
PieCtrlRegs.PIEIER1.bit.INTx3 = 1;// ADCINT1
EPwm1Regs.ETSEL.bit.SOCAEN = 0; // Disable SOC on A group
EPwm1Regs.ETSEL.bit.SOCASEL = 3; // Select SOC on up-count
EPwm1Regs.ETPS.bit.SOCAPRD = 1; // Generate pulse on 1st event
EPwm1Regs.CMPA.bit.CMPA = 430; // Set compare A value to 2048 counts
EPwm1Regs.TBPRD = 862; // Set period to 4096 counts
EPwm1Regs.TBCTL.bit.CTRMODE = 3; // Freeze counter
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 7; // SOC0 will convert pin A1
// 0:A0 1:A1 2:A2 3:A3
// 4:A4 5:A5 6:A6 7:A7
// 8:A8 9:A9 A:A10 B:A11
// C:A12 D:A13 E:A14 F:A15
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 9; // Sample window is 10 SYSCLK cycles
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5; // Trigger on ePWM1 SOCA
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0; // End of SOC1 will set INT1 flag
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1; // Enable INT1 flag
AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 0; //discontinous
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // Make sure INT1 flag is cleared
The timer function starts the ePWM conversion for 25 ms
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group
EPwm1Regs.TBCTL.bit.CTRMODE = 0; // Unfreeze, and enter up count mode
ADC1 interrupt function
__interrupt void adc_C1ISR(void)
{
LED_FLASH=1;
Current.Sum+=AdcaResultRegs.ADCRESULT1;
if(++Current.ConversionCount==80)
{
Current.ConversionCount=0;
Current.Data=(Current.Sum/80);
Current.Sum=0;
EALLOW;
EPwm1Regs.ETSEL.bit.SOCAEN = 0; // Enable SOC on A group
EPwm1Regs.TBCTL.bit.CTRMODE = 3; // Unfreeze, and enter up count mode
EDIS;
}
//
// Clear the interrupt flag
//
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
//
// Check if overflow has occurred
//
if(1 == AdcaRegs.ADCINTOVF.bit.ADCINT1)
{
AdcaRegs.ADCINTOVFCLR.bit.ADCINT1 = 1; //clear INT1 overflow flag
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag
}
//
// Acknowledge the interrupt
//
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
c. 使用PIE中断向量表的ADCA2作为中断项时,中断程序不运行,并且不能输入中断。
PieVectTable.ADCA2_INT = &adc_A2ISR; // Function for ADCA interrupt 1
IER |= M_INT10; //ADCINT1
PieCtrlRegs.PIEIER10.bit.INTx2 = 1;// ADCINT1
EPwm1Regs.ETSEL.bit.SOCAEN = 0; // Disable SOC on A group
EPwm1Regs.ETSEL.bit.SOCASEL = 3; // Select SOC on up-count
EPwm1Regs.ETPS.bit.SOCAPRD = 1; // Generate pulse on 1st event
EPwm1Regs.CMPA.bit.CMPA = 430; // Set compare A value to 2048 counts
EPwm1Regs.TBPRD = 862; // Set period to 4096 counts
EPwm1Regs.TBCTL.bit.CTRMODE = 3; // Freeze counter
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 7; // SOC0 will convert pin A1
// 0:A0 1:A1 2:A2 3:A3
// 4:A4 5:A5 6:A6 7:A7
// 8:A8 9:A9 A:A10 B:A11
// C:A12 D:A13 E:A14 F:A15
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 9; // Sample window is 10 SYSCLK cycles
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5; // Trigger on ePWM1 SOCA
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0; // End of SOC1 will set INT1 flag
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1; // Enable INT1 flag
AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 0; //discontinous
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // Make sure INT1 flag is cleared
The timer function starts the ePWM conversion for 25 ms
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group
EPwm1Regs.TBCTL.bit.CTRMODE = 0; // Unfreeze, and enter up count mode
ADC1 interrupt function
__interrupt void adc_A2ISR(void)
{
LED_FLASH=1;
Current.Sum+=AdcaResultRegs.ADCRESULT1;
if(++Current.ConversionCount==80)
{
Current.ConversionCount=0;
Current.Data=(Current.Sum/80);
Current.Sum=0;
EALLOW;
EPwm1Regs.ETSEL.bit.SOCAEN = 0; // Enable SOC on A group
EPwm1Regs.TBCTL.bit.CTRMODE = 3; // Unfreeze, and enter up count mode
EDIS;
}
//
// Clear the interrupt flag
//
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
//
// Check if overflow has occurred
//
if(1 == AdcaRegs.ADCINTOVF.bit.ADCINT1)
{
AdcaRegs.ADCINTOVFCLR.bit.ADCINT1 = 1; //clear INT1 overflow flag
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag
}
//
// Acknowledge the interrupt
//
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
2.使用 ADCINT2中断时,执行了以下两项测试:
答 当使用PIE中断向量表的ADCA1作为中断项时,中断程序不运行,并且不能输入中断。
PieVectTable.ADCA1_INT = &adc_A1ISR; // Function for ADCA interrupt 1
IER |= M_INT1;//T0 ADCINT1
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;// ADCINT1
EPwm1Regs.ETSEL.bit.SOCAEN = 0; // Disable SOC on A group
EPwm1Regs.ETSEL.bit.SOCASEL = 3; // Select SOC on up-count
EPwm1Regs.ETPS.bit.SOCAPRD = 1; // Generate pulse on 1st event
EPwm1Regs.CMPA.bit.CMPA = 430; // Set compare A value to 2048 counts
EPwm1Regs.TBPRD = 862; // Set period to 4096 counts
EPwm1Regs.TBCTL.bit.CTRMODE = 3; // Freeze counter
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 7; // SOC0 will convert pin A1
// 0:A0 1:A1 2:A2 3:A3
// 4:A4 5:A5 6:A6 7:A7
// 8:A8 9:A9 A:A10 B:A11
// C:A12 D:A13 E:A14 F:A15
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 9; // Sample window is 10 SYSCLK cycles
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5; // Trigger on ePWM1 SOCA
AdcaRegs.ADCINTSEL1N2.bit.INT2SEL = 0; // End of SOC1 will set INT2 flag
AdcaRegs.ADCINTSEL1N2.bit.INT2E = 1; // Enable INT1 flag
AdcaRegs.ADCINTSEL1N2.bit.INT2CONT = 0; //discontinous
AdcaRegs.ADCINTFLGCLR.bit.ADC2NT1 = 1; // Make sure INT2 flag is cleared
The timer function starts the ePWM conversion for 25 ms
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group
EPwm1Regs.TBCTL.bit.CTRMODE = 0; // Unfreeze, and enter up count mode
ADC1 interrupt function
__interrupt void adc_A1ISR(void)
{
LED_FLASH=1;
Current.Sum+=AdcaResultRegs.ADCRESULT1;
if(++Current.ConversionCount==80)
{
Current.ConversionCount=0;
Current.Data=(Current.Sum/80);
Current.Sum=0;
EALLOW;
EPwm1Regs.ETSEL.bit.SOCAEN = 0; // Enable SOC on A group
EPwm1Regs.TBCTL.bit.CTRMODE = 3; // Unfreeze, and enter up count mode
EDIS;
}
//
// Clear the interrupt flag
//
AdcaRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;
//
// Check if overflow has occurred
//
if(1 == AdcaRegs.ADCINTOVF.bit.ADCINT2)
{
AdcaRegs.ADCINTOVFCLR.bit.ADCINT2 = 1; //clear INT2 overflow flag
AdcaRegs.ADCINTFLGCLR.bit.ADCINT2 = 1; //clear INT2 flag
}
//
// Acknowledge the interrupt
//
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
B. 使用PIE中断向量表的ADCA2作为中断项时,中断程序可以运行,但结果不正确:LED_FLASH引脚翻转20毫秒(设置了17.2us):
PieVectTable.ADCA2_INT = &adc_A2ISR; // Function for ADCA interrupt 1
IER |= M_INT10; //ADCINT1
PieCtrlRegs.PIEIER10.bit.INTx2 = 1;// ADCINT1
EPwm1Regs.ETSEL.bit.SOCAEN = 0; // Disable SOC on A group
EPwm1Regs.ETSEL.bit.SOCASEL = 3; // Select SOC on up-count
EPwm1Regs.ETPS.bit.SOCAPRD = 1; // Generate pulse on 1st event
EPwm1Regs.CMPA.bit.CMPA = 430; // Set compare A value to 2048 counts
EPwm1Regs.TBPRD = 862; // Set period to 4096 counts
EPwm1Regs.TBCTL.bit.CTRMODE = 3; // Freeze counter
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 7; // SOC0 will convert pin A1
// 0:A0 1:A1 2:A2 3:A3
// 4:A4 5:A5 6:A6 7:A7
// 8:A8 9:A9 A:A10 B:A11
// C:A12 D:A13 E:A14 F:A15
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 9; // Sample window is 10 SYSCLK cycles
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5; // Trigger on ePWM1 SOCA
AdcaRegs.ADCINTSEL1N2.bit.INT2SEL = 0; // End of SOC1 will set INT2 flag
AdcaRegs.ADCINTSEL1N2.bit.INT2E = 1; // Enable INT2 flag
AdcaRegs.ADCINTSEL1N2.bit.INT2CONT = 0; //discontinous
AdcaRegs.ADCINTFLGCLR.bit.ADCINT2 = 1; // Make sure INT1 flag is cleared
The timer function starts the ePWM conversion for 25 ms
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group
EPwm1Regs.TBCTL.bit.CTRMODE = 0; // Unfreeze, and enter up count mode
ADC1 interrupt function
__interrupt void adc_A2ISR(void)
{
LED_FLASH=1;
Current.Sum+=AdcaResultRegs.ADCRESULT1;
if(++Current.ConversionCount==80)
{
Current.ConversionCount=0;
Current.Data=(Current.Sum/80);
Current.Sum=0;
EALLOW;
EPwm1Regs.ETSEL.bit.SOCAEN = 0; // Enable SOC on A group
EPwm1Regs.TBCTL.bit.CTRMODE = 3; // Unfreeze, and enter up count mode
EDIS;
}
//
// Clear the interrupt flag
//
AdcaRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;
//
// Check if overflow has occurred
//
if(1 == AdcaRegs.ADCINTOVF.bit.ADCINT2)
{
AdcaRegs.ADCINTOVFCLR.bit.ADCINT2 = 1; //clear INT1 overflow flag
AdcaRegs.ADCINTFLGCLR.bit.ADCINT2 = 1; //clear INT1 flag
}
//
// Acknowledge the interrupt
//
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
问题:
1) 如何将中断程序配置为与上述测试1C正常工作?
2)如何将中断程序配置为与上面的测试2a一样正常运行?
3)如何将中断程序配置为与上面的测试2b一样正常运行? 中断当前可用,但无法正常工作。
您可以帮助检查此问题吗? 谢谢。
此致,
樱桃