大家好、我正在编写一个程序、该程序使用 ePWM7 ADCSOCA 触发 SOC1、然后使用 ADCINT1。 在 ADCISC 中、CLA1TASK1通过软件 __asm (" IACK #0x0001")触发;
在这种情况下、可以触发并执行 ADCINT1、但不能触发 CLA1TASK1。
如果我将 ADCINT1配置为由软件触发、那么 ADCINT 和 CLA1TASK1都可以被触发并执行。
什么可能导致问题?
ePWM7 ADCSOCA 触发 SOC1、然后触发 ADCINT1的代码如下所示:
//ePWM7初始化
void EPWM7_Config (USHORT 周期)
{
EPwm7Regs.ETSEL.bit.SOCAEN = 1; //在组上启用 SOC
EPwm7Regs.ETSEL.bit.SOCASEL = 4; //从 CPMA 中选择 SOC,启用计数
EPwm7Regs.ETPS.bit.SOCAPRD = 1; //在发生第一个事件时生成脉冲
EPwm7Regs.CMPA.half.CMPA =周期/2; //设置比较值
EPwm7Regs.TBPRD =周期; //为 ePWM1设置周期
EPwm7Regs.TBCTL.bit.CTRMODE = 0; //向上计数并启动
unprotect_regs();
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;
protect_regs();
}
//ADC 初始化
void ADC_SOC_Init( void )
{
EALLOW;
PieVectTable.ADCINT1 =&ADC_ISR;//映射ADC中断
EDIS;
InitAdc();
PieCtrlRegs.PIEIER1.bit.INTx1 = 1; //使能PIE级INT1.1中断
IER |= M_INT1; 使能CPU级INT1中断 μ s
// EINT; 使能总中断 μ s
EALLOW;
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; 转换完成前一个ADC时钟周期产生EOC μ s
AdcRegs.INTSEL1N2.bit.INT1E = 1; 使能ADCINT1 μ s
AdcRegs.INTSEL1N2.bit.INT1CONT = 0; //关闭连续模式
AdcRegs.INTSEL1N2.bit.INT1SEL = 1; 将ADCINT1映射到EOC1 μ s
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 0x11; //epwm7A 触发
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 0x11; //
AdcRegs.ADCSOC2CTL.bit.TRIGSEL = 0x11; //
AdcRegs.ADCSOC3CTL.bit.TRIGSEL = 0x11;
AdcRegs.ADCSOC4CTL.bit.TRIGSEL = 0x11;
AdcRegs.ADCSOC5CTL.bit.TRIGSEL = 0x11;
AdcRegs.ADCSOC6CTL.bit.TRIGSEL = 0x11;
AdcRegs.ADCSOC7CTL.bit.TRIGSEL = 0x11;
AdcRegs.ADCSOC8CTL.bit.TRIGSEL = 0x11;
AdcRegs.ADCSOC9CTL.bit.TRIGSEL = 0x11;
AdcRegs.ADCSOC10CTL.bit.TRIGSEL = 0x11;
AdcRegs.ADCSOC11CTL.bit.TRIGSEL = 0x11;
AdcRegs.ADCSOC12CTL.bit.TRIGSEL = 0x11;
AdcRegs.ADCSOC13CTL.bit.TRIGSEL = 0x11;
AdcRegs.ADCSOC0CTL.bit.CHSEL = 8; //B0 DC V1
AdcRegs.ADCSOC1CTL.bit.CHSEL = 9; //B1 DC V2
AdcRegs.ADCSOC2CTL.bit.CHSEL = 10; //B2 DC V3
AdcRegs.ADCSOC3CTL.bit.CHSEL = 11; //B3 DC V4
AdcRegs.ADCSOC4CTL.bit.CHSEL = 12; //B4 DC V5
AdcRegs.ADCSOC5CTL.bit.CHSEL = 13; //B5 DC V6
AdcRegs.ADCSOC6CTL.bit.CHSEL = 14; //B6 DC V7
AdcRegs.ADCSOC7CTL.bit.CHSEL = 7; //A7 DC I1
AdcRegs.ADCSOC8CTL.bit.CHSEL = 6; //A6 DC I2
AdcRegs.ADCSOC9CTL.bit.CHSEL = 5; //A5 DC I3
AdcRegs.ADCSOC10CTL.bit.CHSEL = 4; //A4 DC I4
AdcRegs.ADCSOC11CTL.bit.CHSEL = 3; //A3 DC i5
AdcRegs.ADCSOC12CTL.bit.CHSEL = 2; //A2 DC I6
AdcRegs.ADCSOC13CTL.bit.CHSEL = 1; //A1 DC i7
AdcRegs.ADCSOC0CTL.bit.ACQPS = 6; //将 SOC0 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC1CTL.bit.ACQPS = 6; //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC2CTL.bit.ACQPS = 6; //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期、(6个 ACQPS 加1)
AdcRegs.ADCSOC3CTL.bit.ACQPS = 6; //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC4CTL.bit.ACQPS = 6; //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC5CTL.bit.ACQPS = 6; //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC6CTL.bit.ACQPS = 6; //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC7CTL.bit.ACQPS = 6; //将 SOC0 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC8CTL.bit.ACQPS = 6; //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC9CTL.bit.ACQPS = 6; //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC10CTL.bit.ACQPS = 6; //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC11CTL.bit.ACQPS = 6; //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC12CTL.bit.ACQPS = 6; //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期、(6个 ACQPS 加1)
AdcRegs.ADCSOC13CTL.bit.ACQPS = 6; //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
EDIS;
}
ADC中断服务函数 μ s
中断空 ADC_ISR (空)
{
unsigned char chan;
measuring_Vd[0]= AdcResult.ADCRESULT0;//
measuring_Vd[1]= AdcResult.ADCRESULT1;
measuring_Vd[2]= AdcResult.ADCRESULT2;
measuring_Vd[3]= AdcResult.ADCRESULT3;
measuration_Vd[4]= AdcResult.ADCRESULT4;
measuring_Vd[5]= AdcResult.ADCRESULT5;
//Measurement_Vd[6]= AdcResult.ADCRESULT6;
measuration_ID[0]= AdcResult.ADCRESULT7;
测量_ID[1]= AdcResult.ADCRESULT8;
measuration_ID[2]= AdcResult.ADCRESULT9;
measuration_ID[3]= AdcResult.ADCRESULT10;
measuration_ID[4]= AdcResult.ADCRESULT11;
measuration_ID[5]= AdcResult.ADCRESULT12;
// 测量_ID[6]= AdcResult.ADCRESULT13;
////
_asm (" IACK #0x0001");//强制触发CLA1
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; 清除EOC1信号(ADCINT1)
PieCtrlRegs.PIEACK.ALL |= PIEACK_Group1; //写1清0,写0无效
返回;
}
//:
void main (void)
{
//其他配置
(笑声)
ADC_SOC_Init(); //初始化ADC
EPWM7_Config (KSwPrdCnst*10);//初始化EPWM7 KSwPrdCnst = 600
(笑声) 其他函数 μ s
}