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
您好!
我n´t 对两组中的六个通道进行采样、这两组通道由 ePWM 触发、它们之间有一个相位、但我无法进行采样。
我一定会做错或不明白。 如果我将它们全部组合在同一触发源内、一切都可以正常工作。 这是正常工作的代码
/*********
* ADC 初始化
秘书长的报告 /
空 InitAdcManager (空)
{
memset (&ControlAdc、0、sizeof (sControlAdc));
EALLOW;
PieVectTable.ADCINT2 =&ADC_ISR_GRupo_2;
EDIS;
InitAdc();
AdcOffsetSelfCal();
//启用连接到 ADCINT1的 CPU INT1:
IER |= M_INT1;
//在 PIE 中启用 ADCINT2
PieCtrlRegs.PIEIER1.bit.INTx2 = 1;//在 PIE 中启用 INT 1.2
EALLOW;
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;//ADCINT1在 AdcResults 锁存后跳闸
AdcRegs.INTSEL1N2.bit.INT2E = 1;//启用 ADCINT2
AdcRegs.INTSEL1N2.bit.INT2CONT = 0;//禁用 ADCINT2连续模式
AdcRegs.INTSEL1N2.bit.INT2SEL = 5;//设置 EOC5以触发 ADCINT2
AdcRegs.ADCSOC0CTL.bit.CHSEL = 0;// A0 Nueva Placa set SOC0 grid.V 1.
AdcRegs.ADCSOC1CTL.bit.CHSEL = 9;// B1设置 SOC1 grid.I 2.
AdcRegs.ADCSOC2CTL.bit.CHSEL = 0xA;// B2 set SOC2 bus.V 8.
AdcRegs.ADCSOC3CTL.bit.CHSEL = 1;// A1设置 SOC3逆变器.V 9.
AdcRegs.ADCSOC4CTL.bit.CHSEL = 8;// B2设置 SOC4逆变器.I A
AdcRegs.ADCSOC5CTL.bit.CHSEL = 2;// A2设置 SOC5 I.INV 0
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = ADCTRIG_EPWM6_SOCA;//设置 SOC0在 TINT0上启动触发,因为轮询 SOC0先转换 SOC1,然后转换 SOC2
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = ADCTRIG_EPWM6_SOCA;//设置 TINT0上的 SOC1启动触发器,因为轮询 SOC0先转换 SOC1,然后转换 SOC2
AdcRegs.ADCSOC2CTL.bit.TRIGSEL = ADCTRIG_EPWM6_SOCA;//设置 SOC2在 TINT0上启动触发,因为轮询 SOC0先转换 SOC1,然后转换 SOC2
AdcRegs.ADCSOC3CTL.bit.TRIGSEL = ADCTRIG_EPWM6_SOCA;//设置 SOC2在 TINT0上启动触发,因为轮询 SOC0先转换 SOC1,然后转换 SOC2
AdcRegs.ADCSOC4CTL.bit.TRIGSEL = ADCTRIG_EPWM6_SOCA;//设置 SOC2在 TINT0上启动触发,因为轮询 SOC0先转换 SOC1,然后转换 SOC2
AdcRegs.ADCSOC5CTL.bit.TRIGSEL = ADCTRIG_EPWM6_SOCA;//设置 SOC2在 TINT0上启动触发,因为轮询 SOC0先转换 SOC1,然后转换 SOC2
AdcRegs.ADCSOC0CTL.bit.ACQPS = 8;//将 SOC0 S/H 窗口设置为9个 ADC 时钟周期(8个 ACQPS 加1)
AdcRegs.ADCSOC1CTL.bit.ACQPS = 8;//将 SOC1 S/H 窗口设置为9个 ADC 时钟周期、(8个 ACQPS 加1)
AdcRegs.ADCSOC2CTL.bit.ACQPS = 8;//将 SOC2 S/H 窗口设置为9个 ADC 时钟周期、(6个 ACQPS 加1)
AdcRegs.ADCSOC3CTL.bit.ACQPS = 8;//将 SOC3 S/H 窗口设置为9个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC4CTL.bit.ACQPS = 8;//将 SOC4 S/H 窗口设置为9个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC5CTL.bit.ACQPS = 8;//将 SOC5 S/H 窗口设置为9个 ADC 时钟周期、(6个 ACQPS 加1)
EDIS;
}
/*********
* ADC 中断
秘书长的报告 /
_interrupt void ADC_ISR_grupo_2 (void)
{
//GpioDataRegs.GPASET.bit.GPIO7=1;
EALLOW;
SysCtrlRegs.WDKEY = 0x00AA;
EDIS;
ControlAdc.Lectura.Canal_0 = AdcResult.ADCRESULT0;
ControlAdc.Lectura.Canal_1 = AdcResult.ADCRESULT1;
ControlAdc.Lectura.Canal_2 = AdcResult.ADCRESULT2;
ControlAdc.Lectura.Canal_3 = AdcResult.ADCRESULT3;
ControlAdc.Lectura.Canal_4 = AdcResult.ADCRESULT4;
ControlAdc.Lectura.Canal_5 = AdcResult.ADCRESULT5;
AdcRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;//清除 ADCINT1标志为下一个 SOC 重新初始化
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//确认 PIE 中断
GpioDataRegs.GPACLEAR.bit.GPIO7=1;
返回;
}
// PWM 配置
EPwm6Regs.TBCTR = 0;
EPwm6Regs.TBPRD =定时器_PERIOD;
EPwm6Regs.CMPA.half.CMPA = TIMER_PERIOD / 4;// USO Comparador a para dimar antes del 0 y centrar el muestro para la mínima potencia
EPwm6Regs.TBPHS.Half.TBPHS = 0;
EPwm6Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
EPwm6Regs.TBCTL.bit.PHSEN = TB_ENABLE;
EPwm6Regs.TBCTL.bit.PRDLD = TB_SHADOW;//同步下流模块
EPwm6Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm6Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm6Regs.TBCTL.bit.PHSDIR = TB_UP;
EPwm6Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//同步"下流"
EPwm6Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm6Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm6Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm6Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
//为 ADC 配置转换开始。 ePWM5是触发器。
//在 TBCNT1 = CMPA 时开始转换所有通道
EPwm6Regs.ETSEL.bit.SOCAEN = 1;
EPwm6Regs.ETSEL.bit.SOCASEL = ET_CTRD_CMPA;//比较器 A en Descendente
EPwm6Regs.ETPS.bit.SOCAPRD = et_1st;//在第一个事件上生成脉冲*/
但是、如果我想将它们分成两组、由不同的 EPWM 触发、导致组之间出现延迟、那么 ADC 中断的行为会不稳定。 我不n´t 发生了什么。 我´s ADC 的中断在时间上不稳定。 并不总是同时中断。 我出了什么问题?
代码就是这样
/*********
* ADC 初始化
秘书长的报告 /
空 InitAdcManager (空)
{
memset (&ControlAdc、0、sizeof (sControlAdc));
EALLOW;
PieVectTable.ADCINT1 =&ADC_ISR_GRupo_1;
PieVectTable.ADCINT2 =&ADC_ISR_GRupo_2;
EDIS;
InitAdc();
AdcOffsetSelfCal();
//启用连接到 ADCINT1的 CPU INT1:
IER |= M_INT1;
//在 PIE 中启用 ADCINT1
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//在 PIE 中启用 INT 1.1
//在 PIE 中启用 ADCINT2
PieCtrlRegs.PIEIER1.bit.INTx2 = 1;//在 PIE 中启用 INT 1.2
EALLOW;
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;//ADCINT1在 AdcResults 锁存后跳闸
AdcRegs.INTSEL1N2.bit.INT1E = 1;//启用 ADCINT1
AdcRegs.INTSEL1N2.bit.INT1CONT = 0;//禁用 ADCINT1连续模式
AdcRegs.INTSEL1N2.bit.INT1SEL = 2;//设置 EOC2以触发 ADCINT1触发
AdcRegs.INTSEL1N2.bit.INT2E = 1;//启用 ADCINT2
AdcRegs.INTSEL1N2.bit.INT2CONT = 0;//禁用 ADCINT2连续模式
AdcRegs.INTSEL1N2.bit.INT2SEL = 5;//设置 EOC5以触发 ADCINT2
AdcRegs.ADCSOC0CTL.bit.CHSEL = 0;// A0 Nueva Placa set SOC0 grid.V 1.
AdcRegs.ADCSOC1CTL.bit.CHSEL = 9;// B1设置 SOC1 grid.I 2.
AdcRegs.ADCSOC2CTL.bit.CHSEL = 0xA;// B2 set SOC2 bus.V 8.
AdcRegs.ADCSOC3CTL.bit.CHSEL = 1;// A1设置 SOC3逆变器.V 9.
AdcRegs.ADCSOC4CTL.bit.CHSEL = 8;// B2设置 SOC4逆变器.I A
AdcRegs.ADCSOC5CTL.bit.CHSEL = 2;// A2设置 SOC5 I.INV 0
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = ADCTRIG_EPWM5_SOCA;//设置 SOC0上的启动触发器、因为轮询 SOC0先转换 SOC1、然后转换 SOC2
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = ADCTRIG_EPWM5_SOCA;//设置 TINT0上的 SOC1启动触发器,因为轮询 SOC0先转换 SOC1,然后转换 SOC2
AdcRegs.ADCSOC2CTL.bit.TRIGSEL = ADCTRIG_EPWM5_SOCA;//设置 SOC2在 TINT0上启动触发,因为轮询 SOC0先转换 SOC1,然后转换 SOC2
AdcRegs.ADCSOC3CTL.bit.TRIGSEL = ADCTRIG_EPWM6_SOCA;//设置 SOC2在 TINT0上启动触发,因为轮询 SOC0先转换 SOC1,然后转换 SOC2
AdcRegs.ADCSOC4CTL.bit.TRIGSEL = ADCTRIG_EPWM6_SOCA;//设置 SOC2在 TINT0上启动触发,因为轮询 SOC0先转换 SOC1,然后转换 SOC2
AdcRegs.ADCSOC5CTL.bit.TRIGSEL = ADCTRIG_EPWM6_SOCA;//设置 SOC2在 TINT0上启动触发,因为轮询 SOC0先转换 SOC1,然后转换 SOC2
AdcRegs.ADCSOC0CTL.bit.ACQPS = 8;//将 SOC0 S/H 窗口设置为9个 ADC 时钟周期(8个 ACQPS 加1)
AdcRegs.ADCSOC1CTL.bit.ACQPS = 8;//将 SOC1 S/H 窗口设置为9个 ADC 时钟周期、(8个 ACQPS 加1)
AdcRegs.ADCSOC2CTL.bit.ACQPS = 8;//将 SOC2 S/H 窗口设置为9个 ADC 时钟周期、(6个 ACQPS 加1)
AdcRegs.ADCSOC3CTL.bit.ACQPS = 8;//将 SOC3 S/H 窗口设置为9个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC4CTL.bit.ACQPS = 8;//将 SOC4 S/H 窗口设置为9个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC5CTL.bit.ACQPS = 8;//将 SOC5 S/H 窗口设置为9个 ADC 时钟周期、(6个 ACQPS 加1)
EDIS;
}
/*********
* Interrupción ADC
秘书长的报告 /
_interrupt void ADC_ISR_grupo_1 (void)
{
//GpioDataRegs.GPASET.bit.GPIO7=1;
EALLOW;
SysCtrlRegs.WDKEY = 0x00AA;
EDIS;
ControlAdc.Lectura.Canal_0 = AdcResult.ADCRESULT0;
ControlAdc.Lectura.Canal_1 = AdcResult.ADCRESULT1;
ControlAdc.Lectura.Canal_2 = AdcResult.ADCRESULT2;
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 ADCINT1标志为下一个 SOC 重新初始化
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//确认 PIE 中断
GpioDataRegs.GPACLEAR.bit.GPIO7=1;
返回;
}
/*********
* Interrupción ADC
秘书长的报告 /
_interrupt void ADC_ISR_grupo_2 (void)
{
//GpioDataRegs.GPASET.bit.GPIO7=1;
EALLOW;
SysCtrlRegs.WDKEY = 0x00AA;
EDIS;
ControlAdc.Lectura.Canal_3 = AdcResult.ADCRESULT3;
ControlAdc.Lectura.Canal_4 = AdcResult.ADCRESULT4;
ControlAdc.Lectura.Canal_5 = AdcResult.ADCRESULT5;
AdcRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;//清除 ADCINT1标志为下一个 SOC 重新初始化
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//确认 PIE 中断
GpioDataRegs.GPACLEAR.bit.GPIO7=1;
返回;
}
PWM 配置
EPwm5Regs.TBCTR = 0;
EPwm5Regs.TBPRD =定时器周期;
EPwm5Regs.CMPA.half.CMPA =定时器_PERIOD -(TOTAL_COREM1/2);// USO Comparador A para dimar antes del 0 y centrar el muestro para la mínima potencia
EPwm5Regs.TBPHS.Half.TBPHS = 0;
EPwm5Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
EPwm5Regs.TBCTL.bit.PHSEN = TB_ENABLE;
EPwm5Regs.TBCTL.bit.PRDLD = TB_SHADOW;//同步下流模块
EPwm5Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm5Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm5Regs.TBCTL.bit.PHSDIR = TB_UP;
EPwm5Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//同步"下流"
EPwm5Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm5Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm5Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm5Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
//为 ADC 配置转换开始。 ePWM5是触发器。
//在 TBCNT1 = CMPA 时开始转换所有通道
EPwm5Regs.ETSEL.bit.SOCAEN = 1;
EPwm5Regs.ETSEL.bit.SOCASEL = ET_CTRL_CMPA;//比较器 A como Evento
EPwm5Regs.ETPS.bit.SOCAPRD = et_1st;//在第一个事件上生成脉冲*/
EPwm6Regs.TBCTR = 0;
EPwm6Regs.TBPRD =定时器_PERIOD;
EPwm6Regs.CMPA.half.CMPA = TIMER_PERIOD / 4;// USO Comparador a para dimar antes del 0 y centrar el muestro para la mínima potencia
EPwm6Regs.TBPHS.Half.TBPHS = 0;
EPwm6Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
EPwm6Regs.TBCTL.bit.PHSEN = TB_ENABLE;
EPwm6Regs.TBCTL.bit.PRDLD = TB_SHADOW;//同步下流模块
EPwm6Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm6Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm6Regs.TBCTL.bit.PHSDIR = TB_UP;
EPwm6Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//同步"下流"
EPwm6Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm6Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm6Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm6Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
//为 ADC 配置转换开始。 ePWM5是触发器。
//在 TBCNT1 = CMPA 时开始转换所有通道
EPwm6Regs.ETSEL.bit.SOCAEN = 1;
EPwm6Regs.ETSEL.bit.SOCASEL = ET_CTRD_CMPA;//比较器 A en Descendente
EPwm6Regs.ETPS.bit.SOCAPRD = et_1st;//在第一个事件上生成脉冲*/
此致
费尔南多·加托
阿根廷
嗨、Tommy、
感谢您的快速响应。 你是对的。 AdcOffsetSelfCal()正在打开 ADCINTSOCSEL 位,这是导致中断问题的原因。
此致 Fernando