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.

[参考译文] CCS/TMS320F28035:将 ADC SOC 分为两组。

Guru**** 2207170 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/702105/ccs-tms320f28035-splitting-adc-soc-into-two-groups

器件型号:TMS320F28035

工具/软件: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;//在第一个事件上生成脉冲*/

此致  

费尔南多·加托

阿根廷

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    费尔南多

    您可以检查 ADCINTSOCSELn 寄存器吗? 我认为 AdcOffsetSelfCal()函数将为所有16个 SOC 配置这些字段,它们将覆盖您的 TRIGSEL 设置。

    Tommy
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Tommy、

             感谢您的快速响应。 你是对的。 AdcOffsetSelfCal()正在打开 ADCINTSOCSEL 位,这是导致中断问题的原因。

                        此致 Fernando