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.

[参考译文] TMS320F28377S:多 SOC、通道、中断和触发源问题

Guru**** 2540600 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/598383/tms320f28377s-multiple-soc-channels-interrupts-and-trigger-source-problem

器件型号:TMS320F28377S

大家好、TI 社区、

目前、我能够使用在每个周期上生成 SOCA 的 EPwm1通过 SOC0转换两个不同的 ADC 引脚/通道。 我能够使用基于 SOCA 转换结束的中断来填充两个单独的数组、每个通道一个数组(A2和 B2)。 我目前正在尝试使用自己的触发源和中断例程来实现第三个 ADC 通道。 我尝试使用 EPwm3作为 SOCA 触发源和 SOC1模块。 在尝试调试后、我放弃了位并注释了一些内容。 当我具有以下代码(使用 SOC0)时、我能够获取 EPwm3为引脚 ADCINB0生成 SOCA。

EALLOW;
PieVectTable.ADCB1_INT =&generic_ISR_2;
EDIS;

CONFIG_ADC (ADC[ADC_ADCB]、ADC_ADCB);
CONFIG_EPWM_SOCA (ePWM[3]);
setup_ADC_SOC0 (0、ADC[ADC_ADCB]、9);
setup_ADC_INT_TRIG (ADC[ADC_ADCB]、 0);

IER |= M_INT1;
PieCtrlRegs.PIEIER1.bit.INTx2 = 1;

EINT;
ERTM;

//--interrupts-//

中断 void general_isr_2 (void)
{
ADC_SAMPLE_BUFFER[bufferIndex]= AdcbResultRegs.ADCRESULT0;//测试缓冲器以保持电池的直流值
bufferIndex++;
if (ADC_BUF_LEN <= bufferIndex)
{
bufferIndex = 0;
bufferFull = 1;
}

AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
PieCtrlRegs.PIEACK.all = PIEACK_Group1;
}

//--functions-//// config_ADC

-写入 ADC 配置并为 ADC
空 CONFIG_ADC (volatile struct adc_regs * ADC、uint16 ADC)
{
EALLOW;

//写入配置
(* ADC).ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4 ADCCLK 的最大速度为50MHz = 200MHz/4
AdcSetMode (ADC、ADC_Resolution_16BIT、ADC_SIGNALMODE_differential);

//将脉冲位置设置为晚期
(* ADC).ADCCTL1.bit.INTPULSEPOS = 1;

//为 ADC 加电
(* ADC).ADCCTL1.bit.ADCPWDNZ = 1;

//延迟1ms 以允许 ADC 加电时间
DELAY_US (1000);

EDIS;
}
// CONFIG_EPWM_SOCA 在 SOCA
上生成事件 void CONFIG_EPWM_SOCA (volatile struct ePWM_regs * ePWM)
{
EALLOW;
//计数器时钟 TBCLK 的计算方法如下:"TBCLK = EPWMCLK /(HSPCLKDIV * CLKDIV)"
// EPWMCLK 应等于 SYSCLK/2、即100MHz
(* ePWM).TBCTL.bit.CLKDIV=0; //将分频器配置为/1
(* ePWM).TBCTL.bit.HSPCLKDIV=0; //将高速分频器配置为/1
//假设 ePWM 时钟已启用
(* ePWM).ETSEL.bit.SOCAEN = 0; //禁用组上的 SOC
(* ePWM).ETSEL.bit.SOCASEL = 4; //在向上计数时选择 SOC
(* ePWM).ETPS.bit.SOCAPRD = 1; //在发生第一个事件时生成脉冲
//EPwm1Regs.CMPA.bit.CMPA = 195; //生成 CMPA 值事件 //不需要
(* ePWM).TBPRD = 194; // TBPRD = ePWM 周期值- 1.
(* ePWM).TBCTL.bit.CTRMODE = TB_FREEZE; //冻结计数器
EDIS;
}

void setup_ADC_SOC0 (uint16 adc_channel、volatile struct adc_regs * adc、uint16 trigger)
{
uint16 acqps;

//根据分辨率确定最小采集窗口(在 SYSCLKS 中)
if (adc_resolution_12bit ==(* adc).adCCTL2.bit.resolution)
{
acqps = 14;//75ns
}
否则、//分辨率为16位
{
acqps = 63;//320ns
}

EALLOW;
(* ADC).ADCSOC0CTL.bit.CHSEL = ADC_CHANNEL;//SOCx 将转换所选 ADC 的选定 ADC_CHANNEL
(* ADC).ADCSOC0CTL.bit.ACQPS = acqps; //采样窗口为100个 SYSCLK 周期
(* adc).adcsOC0CTL.bit.TRIGSEL =触发;//5; //触发
EDIS;
}

void setup_ADC_INT_TRIG (volatile struct adc_regs * adc、uint16 end_for_conversion)
{
EALLOW;
(* ADC).ADCINTSEL1N2.bit.INT1SEL = END_OUT_COLUM变换; // EOCx 将设置所选 ADC 的 INT1标志
(* ADC).ADCINTSEL1N2.bit.INT1E = 1; //启用 INT1标志
(* ADC).ADCINTFLGCLR.bit.ADCINT1 = 1; //确保清除 INT1标志
EDIS;
} 

当我将 SOC0更改为 SOC1时、它停止工作-有人知道如何解决此问题、还是我对 SOC0和 SOC1差异的理解不正确?

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

    当您尝试切换到 SOC1时、您会更改什么? 是否有写入 ADCSOC1CTL 的 setup_ADC_SOC1()函数?

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

    我解决了我的错误。 我从不正确的寄存器读取中断结果。 我没有意识到结果寄存器编号对应于 SOC 模块、而不是 ADC 通道本身。

    例如、

    ADCResultsReg2对应于 SOC2、不一定是 ADCIN2。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    啊、是的、结果寄存器编号是 SOC 编号。 很高兴您能找到它。

    我们最近更新了一些示例、以使用不匹配的通道和 SOC 编号、以避免这种混淆、但我想我会再提出一个请求来修复其余的问题。

    惠特尼