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.
当在由 ePWM2触发的33khz 上使用 ADC ISR 时、ISR 代码所花费的时间超过中断时间、因此部分代码我已经移至 ePWM1 ISR。 现在、ADC ISR 时序减少了、但发生它的频率与以前不一致(可能是 PWM ISR 影响它、PWM ISR 以100kHz 的频率运行)。
请建议我如何克服这一问题。
ADC ISR 是否可以优先于其它 ISR?
请指导我。
主席先生,
感谢您的回答。 我有:
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;// pwm1
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//在 PIE 组1中启用 ADCINT1
PieCtrlRegs.PIEIER9.bit.INTx1 = 1;// PIE 组9,INT1 //sci Rx
PieCtrlRegs.PIEIER9.bit.INTx2 = 1;// PIE 组9、int2 //sci TX
PieCtrlRegs.PIEIER9.bit.INTx3=1;// PIE 组9,INT1 //sci Rx
PieCtrlRegs.PIEIER9.bit.INTx4 = 1;// PIE 组9、int2 //sci TX
ADC 初始化为:
///-------------------------------------------------------
// ADC 初始化
///-------------------------------------------------------
EALLOW;
AdcRegs.ADCCTL1.bit.ADCBGPWD=1;
AdcRegs.ADCCTL1.bit.ADCREFPWD=1;
AdcRegs.ADCCTL1.bit.ADCPWDN = 1;
AdcRegs.ADCCTL1.bit.ADCENABLE = 1;
asm (" RPT#100 || NOP");
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;
AdcRegs.ADCCTL1.bit.TEMPCONV = 0;
AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 1;
///-------------------------------------------------------
//配置 ADC
///-------------------------------------------------------
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC2CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC3CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC4CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC5CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC6CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC7CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC8CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC9CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC10CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC11CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC12CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC13CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC14CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC15CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC0CTL.bit.CHSEL = 0x0;//转换通道
AdcRegs.ADCSOC1CTL.bit.CHSEL = 0x1;//转换通道
AdcRegs.ADCSOC2CTL.bit.CHSEL = 0x2;//转换通道
AdcRegs.ADCSOC3CTL.bit.CHSEL = 0x3;//转换通道
AdcRegs.ADCSOC4CTL.bit.CHSEL = 0x4;//转换通道
AdcRegs.ADCSOC5CTL.bit.CHSEL = 0x5;//转换通道
AdcRegs.ADCSOC6CTL.bit.CHSEL = 0x6;//转换通道
AdcRegs.ADCSOC7CTL.bit.CHSEL = 0x7;//转换通道
AdcRegs.ADCSOC8CTL.bit.CHSEL = 0x8;//转换通道
AdcRegs.ADCSOC9CTL.bit.CHSEL = 0x9;//转换通道
AdcRegs.ADCSOC10CTL.bit.CHSEL = 0xA;//转换通道
AdcRegs.ADCSOC11CTL.bit.CHSEL = 0xB;//转换通道
AdcRegs.ADCSOC12CTL.bit.CHSEL = 0xC;//转换通道
AdcRegs.ADCSOC13CTL.bit.CHSEL = 0xD;//转换通道
AdcRegs.ADCSOC14CTL.bit.CHSEL = 0xE;//转换通道
AdcRegs.ADCSOC15CTL.bit.CHSEL = 0xF;//转换通道
AdcRegs.ADCSOC0CTL.bit.ACQPS =采样;//采集窗口
AdcRegs.ADCSOC1CTL.bit.ACQPS =采样;//采集窗口
AdcRegs.ADCSOC2CTL.bit.ACQPS =采样;//采集窗口
AdcRegs.ADCSOC3CTL.bit.ACQPS =采样;//采集窗口
AdcRegs.ADCSOC4CTL.bit.ACQPS =采样;//采集窗口
AdcRegs.ADCSOC5CTL.bit.ACQPS =采样;//采集窗口
AdcRegs.ADCSOC6CTL.bit.ACQPS =采样;//采集窗口
AdcRegs.ADCSOC7CTL.bit.ACQPS =采样;//采集窗口
AdcRegs.ADCSOC8CTL.bit.ACQPS =采样;//采集窗口
AdcRegs.ADCSOC9CTL.bit.ACQPS =采样;//采集窗口
AdcRegs.ADCSOC10CTL.bit.ACQPS =采样;//采集窗口
AdcRegs.ADCSOC11CTL.bit.ACQPS =采样;//采集窗口
AdcRegs.ADCSOC12CTL.bit.ACQPS =采样;//采集窗口
AdcRegs.ADCSOC13CTL.bit.ACQPS =采样;//采集窗口
AdcRegs.ADCSOC14CTL.bit.ACQPS =采样;//采集窗口
AdcRegs.ADCSOC15CTL.bit.ACQPS =采样;//采集窗口
///-------------------------------------------------------
// ADCINT0配置
///-------------------------------------------------------
AdcRegs.INTSEL1N2.bit.INT1CONT = 0;
AdcRegs.INTSEL1N2.bit.INT1E = 1;
AdcRegs.INTSEL1N2.bit.INT1SEL = 15;
///-------------------------------------------------------
EDIS;
///-----------------------------------------------------
我收到不规则的 ADC ISR 时序、请参阅所附图片。 请向我推荐要做的事情。
作为客户、我可以期待得到任何答案吗?
女士:
我正在通过 ADC ISR 中的交流信号打开/关闭受控开关、我正在计算 ePWM ISR 中的三相电压/电流 RMS。
ADC 中断在 ADC ISR 中被清除、如下所示:
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;
返回;
我想知道如何避免不规则的 ADC ISR 调用、因为这会由于时序变化而影响开关开/关操作。 PL 帮助。
尊敬的 Ravi:
您如何捕获上述时序? 您是否还可以按照与 ADC ISR 相同的方式检查 PWM ISR? 这是为了检查 PWM ISR 是否干扰 ADC ISR。
您能否检查您的应用中是否配置了同步模式? 除上述共享的代码外、是否还完成了任何其他 ADC 配置?
谢谢
Vasudha
女士:
唯一的 ADC 配置初始化是:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
EALLOW;
AdcRegs.ADCCTL1.bit.ADCBGPWD=1;
AdcRegs.ADCCTL1.bit.ADCREFPWD=1;
AdcRegs.ADCCTL1.bit.ADCPWDN = 1;
AdcRegs.ADCCTL1.bit.ADCENABLE = 1;
asm (" RPT#100 || NOP");
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;
AdcRegs.ADCCTL1.bit.TEMPCONV = 0;
AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 1;
///-------------------------------------------------------
//配置 ADC
///-------------------------------------------------------
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC2CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC3CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC4CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC5CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC6CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC7CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC8CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC9CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC10CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC11CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC12CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC13CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC14CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC15CTL.bit.TRIGSEL = 7;
AdcRegs.ADCSOC0CTL.bit.CHSEL = 0x0;
AdcRegs.ADCSOC1CTL.bit.CHSEL = 0x1;
AdcRegs.ADCSOC2CTL.bit.CHSEL = 0x2;
AdcRegs.ADCSOC3CTL.bit.CHSEL = 0x3;
AdcRegs.ADCSOC4CTL.bit.CHSEL = 0x4;
AdcRegs.ADCSOC5CTL.bit.CHSEL = 0x5;
AdcRegs.ADCSOC6CTL.bit.CHSEL = 0x6;
AdcRegs.ADCSOC7CTL.bit.CHSEL = 0x7;
AdcRegs.ADCSOC8CTL.bit.CHSEL = 0x8;
AdcRegs.ADCSOC9CTL.bit.CHSEL = 0x9;
AdcRegs.ADCSOC10CTL.bit.CHSEL = 0xA;
AdcRegs.ADCSOC11CTL.bit.CHSEL = 0xB;
AdcRegs.ADCSOC12CTL.bit.CHSEL = 0xC;
AdcRegs.ADCSOC13CTL.bit.CHSEL = 0xD;
AdcRegs.ADCSOC14CTL.bit.CHSEL = 0xE;
AdcRegs.ADCSOC15CTL.bit.CHSEL = 0xF;
AdcRegs.ADCSOC0CTL.bit.ACQPS =采样;
AdcRegs.ADCSOC1CTL.bit.ACQPS =采样;
AdcRegs.ADCSOC2CTL.bit.ACQPS =采样;
AdcRegs.ADCSOC3CTL.bit.ACQPS =采样;
AdcRegs.ADCSOC4CTL.bit.ACQPS =采样;
AdcRegs.ADCSOC5CTL.bit.ACQPS =采样;
AdcRegs.ADCSOC6CTL.bit.ACQPS =采样;
AdcRegs.ADCSOC7CTL.bit.ACQPS =采样;
AdcRegs.ADCSOC8CTL.bit.ACQPS =采样;
AdcRegs.ADCSOC9CTL.bit.ACQPS =采样;
AdcRegs.ADCSOC10CTL.bit.ACQPS =采样;
AdcRegs.ADCSOC11CTL.bit.ACQPS =采样;
AdcRegs.ADCSOC12CTL.bit.ACQPS =采样;
AdcRegs.ADCSOC13CTL.bit.ACQPS =采样;
AdcRegs.ADCSOC14CTL.bit.ACQPS =采样;
AdcRegs.ADCSOC15CTL.bit.ACQPS =采样;
AdcRegs.INTSEL1N2.bit.INT1CONT = 0;
AdcRegs.INTSEL1N2.bit.INT1E = 1;
AdcRegs.INTSEL1N2.bit.INT1SEL = 15;
///-------------------------------------------------------
EDIS;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
我认为 PWM ISR 影响 ADC ISR 的原因是:
通过禁用 PWM ISR 或减少在 PWM ISR 中完成的计算、可以观察到 ADC ISR 的正确调用。
PL 专家应该来解决这个问题、因为我们在产品中使用这个问题、应该得到解决。
女士:
ePWM1和2不同步。 ePWM1配置:
//------------------ 初始化 EPWM1 -------------------------------------------------------
EALLOW;
EPwm1Regs.TBPRD = ADC_ISR_F;// ADC_ISR_F = 2500
EPwm1Regs.TBPHS.Half.TBPHS = 0x0000;
EPwm1Regs.TBCTR = 0x0000;
EPwm1Regs.CMPA.half.CMPA = ADC_ISR_F / 2;
EPwm1Regs.CMPB = ADC_ISR_F / 2;
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm1Regs.AQCTLA.bit.ZRO = AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.CAU = AQ_SET;
EPwm1Regs.AQCTLB.bit.ZRO = AQ_CLEAR;
//为 PWM1设置死区
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_DISABLE;
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
//设置隐藏
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
//跳闸区域设置
EPwm1Regs.TZSEL.bit.CBC1 = 1;
EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
EPwm1Regs.TZCTL.bit.TSB = TZ_FORCE_LO;
EPwm1Regs.TZEINT.BIT.CBC = 1;
//中断,我们将在其中更改死区
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;
EPwm1Regs.ETSEL.bit.INTEN = 1;
EPwm1Regs.ETPS.bit.INTPRD = et_3rd;
EDIS;
///////////////////////////////////
ePWM2配置:
EALLOW;
EPwm2Regs.TBPRD = ADC_ISR_F;
EPwm2Regs.TBPHS.ALL = 0;
EPwm2Regs.TBCTR = 0;
EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TBH_DIV1;
EPwm2Regs.TBCTL.bit.CLKDIV = TBH_DIV1;
//将影子寄存器加载设置为零
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
/SOC 生成设置
EPwm2Regs.ETSEL.bit.SOCAEN = 1;
EPwm2Regs.ETSEL.bit.SOCASEL = ET_CTR_PRD;
EPwm2Regs.ETPS.bit.SOCAPRD = ET_1ST;
EPwm2Regs.CMPA.half.CMPA = ADC_ISR_F / 2;//1666;
EPwm2Regs.CMPB = ADC_ISR_F / 2;//1666;
EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;
EPwm2Regs.AQCTLB.bit.CBU = AQ_SET;
EPwm2Regs.AQCTLB.bit.CBD = AQ_CLEAR;
EDIS;
////////////////////////////////////////
epwm1_ISR、用于电压和电流的 RMS 计算。
尊敬的 Ravi:
我认为问题是因为 SOC 触发器和中断触发器几乎相同。PFB 我认为正在发生的情况的描述:
[引述]
//中断,我们将在其中更改死区
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;
EPwm1Regs.ETSEL.bit.INTEN = 1;
EPwm1Regs.ETPS.bit.INTPRD = et_3rd;[/quot]
[引用 user="Ravi"/SOC 生成设置
EPwm2Regs.ETSEL.bit.SOCAEN = 1;
EPwm2Regs.ETSEL.bit.SOCASEL = ET_CTR_PRD;
EPwm2Regs.ETPS.bit.SOCAPRD = et_1st;[/quot]
在 thirt cnt =零事件发生时、PWM ISR 被命中、并且 ADC 已在第2个 cntr = prd (1个周期的差异)上被触发。 因此、在计算 ADC 结果之前、PWM ISR 已经开始执行、因此就在 ISR 完成后、挂起的 ADC 中断就会执行。 下一个 ADC 转换已在平均时间的第3个 cntr = prd 事件上触发、因此您会看到2个连续的 ADC 中断。 第三个 ADC 中断是不间断的、按预期执行。
我认为您需要绕过 ADC SOC 触发器和 ePWM 中断触发时序、以避免冲突。 您可以尝试将触发器更改为任何其他事件、如 CMPA/CMPB 等
此外、让我知道 ePWM ISR 和 ADC ISR 所需的时间吗?
请告诉我这是否解决了您的问题。