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.

TMS320F280021: 使用ePWM触发ADC,使用ADCINT2中断,中断程序运行不正常

Part Number: TMS320F280021

Dear all:

在使用epwm触发ADC时,使用ADCA1配置为ADCINT1中断,程序可以正常运行,相关程序如下程序如下:

EALLOW;
PieVectTable.ADCA1_INT = &adcA1ISR; // Function for ADCA interrupt 1
EDIS;

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 SOC0 will set INT1 flag
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1; // Enable INT1 flag
AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 0; //不连续
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // Make sure INT1 flag is cleared

__interrupt void adcA1ISR(void)
{
LED_FLASH=1;

Current.Sum+=AdcaResultRegs.ADCRESULT0;
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;

}

上面测试代码中在定时中使能ePWM 开启

EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group
EPwm1Regs.TBCTL.bit.CTRMODE = 0; // Unfreeze, and enter up count mode

转换80个周期,每个周期时间是17.2us, 使用 LED_FLASH=1; 测试管脚来查看转换的周期和每个周期的个位。

上述程序运行正常。

但是ADCINT1已经被其他功能占用,配置到ADCINT2 中断上,使用发现就不能正常运行,相关程序如下:

EALLOW;
PieVectTable.ADCA2_INT  = &adcA2ISR;     // Function for ADCA interrupt 2
EDIS;

IER |= M_INT10; //ADCINT2

PieCtrlRegs.PIEIER10.bit.INTx2 = 1;// ADCINT2

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.ADCSOC1CTL.bit.CHSEL = 7; // SOC1 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.ADCSOC1CTL.bit.ACQPS = 9; // Sample window is 10 SYSCLK cycles
AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 5; // Trigger on ePWM1 SOCA

AdcaRegs.ADCINTSEL1N2.bit.INT2SEL = 1; // End of SOC0 will set INT2 flag
AdcaRegs.ADCINTSEL1N2.bit.INT2E = 1; // Enable INT2 flag
AdcaRegs.ADCINTSEL1N2.bit.INT2CONT = 0; //不连续
AdcaRegs.ADCINTFLGCLR.bit.ADCINT2 = 1; // Make sure INT2 flag is cleared

__interrupt void adcA2ISR(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;

}

通过示波器测试LED_FLASH=1; 管脚上的电平转换时间是20ms,运行不正常

也没查找出是什么具体原因。

原来之前使用的是28065也是这么使用,可以正常工作,插入一段28065的程序

    PieVectTable.ADCINT1   = &adc_isr;            // ADC Signal
    PieVectTable.ADCINT2   = &adc_current_isr;            // ADC current
    IER |= M_INT1;        // T0 ADCINT1
    PieCtrlRegs.PIEIER1.bit.INTx1 = 1;    // ADCINT1   P1.1
    PieCtrlRegs.PIEIER1.bit.INTx2 = 1;    // ADCINT2
    	EALLOW;

	AdcRegs.ADCCTL1.bit.ADCREFSEL = 1;        //外部电源参考
	AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;      //结果存入寄存器才产生中断

	AdcRegs.ADCSAMPLEMODE.bit.SIMULEN0 = 1;   //同时采样

	AdcRegs.ADCSOC0CTL.bit.CHSEL = 0;         //soc通道选择
//	AdcRegs.ADCSOC1CTL.bit.CHSEL = 8;
	AdcRegs.ADCSOC0CTL.bit.ACQPS = 25;         //采样时间  25
	AdcRegs.ADCSOC1CTL.bit.ACQPS = 25;
	AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 1;       //

	AdcRegs.ADCSAMPLEMODE.bit.SIMULEN2 = 1;   //同时采样
	AdcRegs.ADCSOC2CTL.bit.CHSEL = 1;         //soc通道选择
//	AdcRegs.ADCSOC3CTL.bit.CHSEL = 9;
	AdcRegs.ADCSOC2CTL.bit.ACQPS = 50;         //采样时间  20
	AdcRegs.ADCSOC3CTL.bit.ACQPS = 50;
	AdcRegs.ADCSOC2CTL.bit.TRIGSEL = 5;       //set SOC2 start trigger on EPWM1A, due to round-robin SOC2 converts first then SOC3
//	AdcRegs.ADCSOC3CTL.bit.TRIGSEL = 5;       //set SOC3 start trigger on EPWM1A, due to round-robin SOC2 converts first then SOC3

	//EPwm1Regs.ETSEL.bit.SOCAEN	= 1;		// Enable SOC on A group
	EPwm1Regs.ETSEL.bit.SOCASEL	= 3;		// Enable event time-base counter equal to zero or period
	EPwm1Regs.ETPS.bit.SOCAPRD 	= 1;		// Generate pulse on 1st event

	AdcRegs.INTSEL1N2.bit.INT2SEL = 2;        //中断线2选择soc3
	AdcRegs.INTSEL1N2.bit.INT2CONT = 0;       //不连续
	AdcRegs.INTSEL1N2.bit.INT2E = 1;          //中断使能

	AdcRegs.INTSEL1N2.bit.INT1SEL = 1;        //中断线1选择soc1
	AdcRegs.INTSEL1N2.bit.INT1CONT = 0;       //不连续
	AdcRegs.INTSEL1N2.bit.INT1E = 1;          //中断使能
	EDIS;
	

28065 ADCINT1和ADCINT2都能正常运行。

请大家帮忙分析280021 上如何正常使用ADCINT2,(ADCINT1已经被占用),并且必须是在PWM触发上去ADC中断。

  • 你好,粗看了一下代码,有一句:

    AdcaRegs.ADCINTSEL1N2.bit.INT2SEL = 1; // End of SOC0 will set INT2 flag

    按照注释的说明,应该是:

    AdcaRegs.ADCINTSEL1N2.bit.INT2SEL = 0; // End of SOC0 will set INT2 flag

    你看看这么修改是否有效。

  • 注释我忘记更改了,实际我配置到SOC1上

    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.ADCSOC1CTL.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.ADCSOC1CTL.bit.ACQPS = 9; // Sample window is 10 SYSCLK cycles
    AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 5; // Trigger on ePWM1 SOCA

    AdcaRegs.ADCINTSEL1N2.bit.INT2SEL = 1; // End of SOC1 will set INT1 flag
    AdcaRegs.ADCINTSEL1N2.bit.INT2E = 1; // Enable INT1 flag
    AdcaRegs.ADCINTSEL1N2.bit.INT2CONT = 0; //不连续
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT2 = 1; // Make sure INT1 flag is cleared

    实际可以进入ADCINT2中断,只是进入中断的时间不是EPWM的周期触发的,固定20ms

  • 看到你发布了新帖,后续将在新帖中回复:e2echina.ti.com/.../tms320f280021-2800x-adc-pie-adcint1-adcint2