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 SignalPieVectTable.ADCINT2= &adc_current_isr;// ADC currentIER |= M_INT1;// T0 ADCINT1PieCtrlRegs.PIEIER1.bit.INTx1 = 1;// ADCINT1P1.1PieCtrlRegs.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中断。
Green Deng:
你好,粗看了一下代码,有一句:
AdcaRegs.ADCINTSEL1N2.bit.INT2SEL = 1; // End of SOC0 will set INT2 flag
按照注释的说明,应该是:
AdcaRegs.ADCINTSEL1N2.bit.INT2SEL = 0; // End of SOC0 will set INT2 flag
你看看这么修改是否有效。
,
Huit Wu:
注释我忘记更改了,实际我配置到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
,
Green Deng:
看到你发布了新帖,后续将在新帖中回复:e2echina.ti.com/…/tms320f280021-2800x-adc-pie-adcint1-adcint2