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.

[参考译文] TMS320F28377D:同一 ADC 模块(ADC A)内的顺序转换?

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/607039/tms320f28377d-sequential-conversions-within-the-same-adc-module-adc-a

器件型号:TMS320F28377D

大家好、

在我的软件中、我想实现进入 ADC 模块的信号的顺序转换、这样:

当 EPWM6 CTR = 0时、我开始转换 ADC A2、ADC A3、ADC A4、ADC A5上的信号、并且当所有之前的转换完成时、最后一个转换将生成一个中断。

我已将以下代码用于 EPWM 配置:


EPwm6Regs.ETSEL.bit.SOCAEN = 1; EPwm6Regs.ETSEL.bit.SOCASEL = 1;//在 TBCTR =0 EPwm6Regs.ETPS.BIT.SOCAPRD = 1时生成 SOCA 脉冲;

对于 ADC 配置:

void ConfigureADC_A (void)
{
EALLOW;

//写入配置
AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为输入时钟/4
AdcSetMode (ADC_ADCA、ADC_Resolution_12位、ADC_SIGNALMODE_SINGLE);

//将脉冲位置设置为晚期
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;

//为 ADC
AdcaRegs.ADCCTL1.bit.ADCPWDNZ 加电

;//允许
加电延迟1000 ms


;} 

并将每个通道配置为:

void SetupADC_A ()
{
uint16 acqps;

//根据分辨率(SYSCLK = 200MHz)确定最小采集窗口
(在 SYSCLKS 中) if (adc_resolution_12bit = AdcaRegs.ADCCTL2.bit.resolution){
acqps = 19;//(19+1)/200MHz = 100ns。 最小值为75ns
}
否则{//分辨率为16位
acqps = 63;//320ns ((63+1)*(1/2200MHz)
)}

//选择要转换的通道和转换结束标志
EALLOW;

AdcaRegs.ADCCO2CTL.bit.CHSEL = 2;
AdcRegs.CS2CCS.ADCCPS.ADCTRL = ADCCPS.ADCCPS.ADCCPS.ADCTRL = 15位 ADCCPS.ADCCPS.ADCCPS.ADCCPS.ADCCPS.ADCCPS.ADCCPS.ADCTRL = ADCCPS.ADCCPS.ADCTRS.ADCCPS.ADCCPS.ADCCPS.ADC2000.CL=ADCTRS.ADCCPS.ADCTRS.ADCTRS.ADCTRS.ADCTRS.BOL.



AdacRegs.ADCSOC3CTL.bit.ACQPS = acqps;//sample and hold Window
AdcaRegs.ADCSOC3CTL.bit.TRIGSEL = 15;//0Fh ADCTRIG15 - ePWM6、ADCSOCA AdcaRegs.ADCCO4CTL.bit.CHIGSEL = 15;ADCSOC5ADC40CCRCL.ADCTRS.ADCADCTRS.ADCCPS.ADCTRL






= 15
;ADCSOC.ADCADCADCADCADCADCADCADCADC40CL.ADCTRS.ADCTRS.ADCTRS.ADCCPS.ADCCPS.ADCTRS.ADCCPS.ADCCPS.ADCTRS.ADCCPS.ADCTRS.ADCCPS.ADCCPS.ADCTRL = 15 = 15;ADCADCADCADCCPS.ADCADCADCADCADCADCADCADCADCTRS.ADCADCADCADCADCADCADCADCADCTRS.AD // 0Fh ADCTRIG15 - ePWM6、ADCSOCA

AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 5;// EOC5为 ADCINT1
AdcaRegs.ADCINTSEL1N2.bit.1E = 1触发;//启用 ININT1标志
ADCINT1.FLT1.ADCINT1.FLAG
= 1;确保 ADCINT1.ADCINT1.FLT1.ADCINT1 

现在、在"main.c"中、我启用了中断 ADC A1:

//映射 ISR 函数
EALLOW;

PieVectTable.ADCA1_INT =&adca1_ISR;

EDIS;
//启用全局中断和更高优先级的实时调试事件:

IER |= M_INT1;//启用组1中断
EINT;
//启用全局中断 INTM

ERTM;
//启用全局实时中断 DBGM

/启用表2中断。 PIE 通道映射、页面 90)

PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//启用 ADC_INT_A_1 //中断 ADC A1 

中断如下所示:

中断 void adca1_ISR (void){

//********
//将 ADC 测量值转换为 double
//********




AdcaResults2 = AdcaResultRegs.ADCRESULT2;//

AdcaResults3 = AdcaResultRegs.ADCRESULT3;//

AdcaResults4 = AdcaResults.ADCRESULT5;//

AdcaResults.iResets=




(*)

+偏移

(*)(*)(_iResets+)(*)(*)+ 0.048)(_iResets= 0.048)(iResets+(*)(_iResets= 0.04+)(iResets+)(iResets_iResets= 0.04+)(iResets+)(*)(iResets_iResets= 0.04+)(iResets_iResets_iResetsx (*)(iResetsx (*)(iResets= 0.04+)(iResets= 0.04+)(iResets= 0.04+)(iResets= 0.04+)(iResets_iResets= 0.04+)(iReset


//... PI 控制器代码执行+ PWM CMP 更新
//...

//*********
//清除 ADC 中断
//********

AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志
PieCtrlRegs.PIEACK.ALL = PIEACK_Group1;

} 

这是使 ADC 通道 A2、A3、A4、A5按顺序采样的正确步骤吗? 中断是否确实在所有 ADC 转换完成后"启动"?

我提出这一要求是因为我想确保在中断内部、ADC 采样的所有值都是正确的(并且转换完成)、以便正确执行控制...

您的意见将非常有帮助、  

非常感谢您、

Leo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我写信告诉您、C2000团队成员已被分配到此帖子、应该很快回答。

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

    是的、这在概念上是正确的、应该起作用。 ePWM 触发4个 SOC、然后最后一个 SOC 触发 ISR。

    但是、无需匹配通道编号和 SOC 编号。 相反、您可能应该使用 SOC0 =通道2、SOC1 = CH3、SOC2 = CH4、SOC3 = ch5和由 SOC 3生成的 int。 您还可以根据需要重新排列通道采样顺序(例如、如果您希望先对该通道进行采样、则 SOC0 = ch5)。 如果您只使用 ADCA 并且只执行一组转换、这不会产生太大的影响、但如果您也打算使用其他 ADC 或希望在一个 ADC 上使用多个转换集、这将会大大简化操作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Devin、

    非常感谢您的回答。 很明显、无需将 SOC#与 ADC 通道#关联。

    此致

    Leo