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.

[参考译文] TMS320F28388D:更改 ADC 分辨率不会更改处理时间。

Guru**** 2595805 points
Other Parts Discussed in Thread: TMS320F28388D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1103988/tms320f28388d-changing-the-adc-resolution-does-not-change-the-processing-time

器件型号:TMS320F28388D

我正在研究使用 TMS320F28388D 的 ADC。
AD 转换后写入结果寄存器的时间对于12位和16位返回相同的时间。

从触发到中断标志检查的时间
 12位= 1.8us
 16位= 1.8us


ADC 完成后、将根据写入结果寄存器的数据进行处理。
当结果寄存器被写入时、中断被设置为在计时发生。 (INTPULSEPOS = 1)

中断不会被处理、但只有中断标志被用来做出决定。
12位/16位设置的转换时间应该有变化、但是中断时序不会改变。
设置中是否缺少某项内容?

===================================================================================================================================

(设置)

EALLOW;
//写入配置
AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/ 4
ADC_setMode (ADCA_BASE、ADC_Resolution 12位、ADC_MODE_SINGLE_ENDLE);//!!!!!!!!!!!!! 或16位
EDIS;

uint16_t acqps_a;

如果(0 = AdcaRegs.ADCCTL2.bit.resolution){// 0 = 12位,1 = 16位
acqps_a = 19;//裕度(5)+ 14 =(-1)+ 15 = SYSCLK / 75ns (数据表)

否则{//分辨率为16位
acqps_a = 68;//裕度(5)+ 63 =(-1)+ 64 = SYSCLK / 320ns (数据表)

EALLOW;

// ADC-A
AdcaRegs.ADCSOCPRICTL.bit.SOCPRIORITY = 0x2;

AdcaRegs.ADCSOC0CTL.bit.CHSEL = 2;
AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps_A;
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 0x5;
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;
AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 1;
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

AdcaRegs.ADCSOC1CTL.bit.CHSEL = 3;
AdcaRegs.ADCSOC1CTL.bit.ACQPS = acqps_A;
AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 0x5;
AdcaRegs.ADCINTSEL1N2.bit.INT2E = 1;
AdcaRegs.ADCINTSEL1N2.bit.INT2SEL = 1;
AdcaRegs.ADCINTSEL1N2.bit.INT2CONT = 1;
AdcaRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;

AdcaRegs.ADCSOC2CTL.bit.CHSEL = 4;
AdcaRegs.ADCSOC2CTL.bit.ACQPS = acqps_A;
AdcaRegs.ADCSOC2CTL.bit.TRIGSEL = 0x5;

AdcaRegs.ADCSOC3CTL.bit.CHSEL = 5;
AdcaRegs.ADCSOC3CTL.bit.ACQPS = acqps_A;
AdcaRegs.ADCSOC3CTL.bit.TRIGSEL = 0x5;

//将脉冲位置设置为晚期
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;//中断脉冲生成时序。 转换结束时序。
//为 ADC 加电
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;

EDIS;

DEVICE_DELAY_US (1000);
================================================================================================================================================

(处理)

!! 触发器!!
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
AdcaRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;
计时器启动

while (1){if (AdcaRegs.ADCINTFlG.bit.ADCINT2 == 1) break;}

计时器结束

================================================================================================================================================

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

    Guoki 您好、

    您如何精确测量1.8uS?  请参阅 TRM 第20节中的时序图。  ADC 吞吐量计算从何时接收 SOC 触发器开始。  这会将输入通道连接到 ADC 采样电容器、以便在 ACQPS+1 (时序图中的 ADC H+H)期间进行充电 在这个持续时间过后、采样开关被打开、并且采样电容器中的电荷将由 ADC 模块在 tLAT 持续时间内进行量化(在时序图中)。  tLAT 之后、ADC 结果将在 ADC 结果寄存器中提供。  在同一 TRM 部分中有两个时序表、一个用于12位模式、另一个用于16位模式、您可以根据使用的 ADC 预分频器从时序表中获取 tLAT 信息。


    根据您提供的设置(假设 SYSCLK 为200MHz、5nS 周期)并使用时序图和表格、下面给出了结果寄存器中可用结果所需的时间:

    12位:T =((ADC S+H)+ tLAT)* 5nS =(19 + 1 + 44)* 5nS = 330nS

    16位:T =((ADC S+H)+ tLAT)* 5nS =(68 + 1 + 120)* 5nS = 945nS

    如果您没有超过转换时间、请检查您的测量方法是测量从提供触发器到发生转换结束中断(tEOC)的实际时间。  您的例程中可能包含一些开销、这些开销会增加到您测量的转换时间。

    此致、

    Joseph

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

    您好 Joseph。

    我使用示波器进行检查。
    它在主文本中输出(进程)中描述的"定时器启动-定时器结束"时间。
    无论分辨率如何、这里都会输出相同的时间。

    我想当使用12位时、中断标志会在"330ns*2"时间内打开、但是
    它所花费的时间与16位时相同。

    至于触发、它基于 PWM、但其形式是 PWM 中断与触发器同时运行。
    ADC 中断标志清除在其中完成。
    PWM 周期为25us 周期。

    (在12位中、ADCINT1 = 1、在初始化 ADC 标志之前、因此判断仅由 ADCINT2执行。)
    ========================================================================================================================================
    _interrupt void epwm1_isr ()

     GpioDataRegs.GPASET.bit.GPIO21 = 1;//计时器启动

     /* ADC 中断标志清除。 *
     AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
     AdcaRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;

     Flag1 = 1;

     //清除此计时器的 INT 标志
     EPwm1Regs.ETCLR.bit.INT = 1;
     //确认此中断以接收来自组3的更多中断
     PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;

    MAIN ()

     (设置)

     while (1)
     {
      if (Flag1 ==1){
       while (1){if (AdcaRegs.ADCINTFlG.bit.ADCINT2 == 1) break;}//检查 ADCINT2
       GpioDataRegs.GPACLEAR.bit.GPIO21 = 1;//计时器结束
       标志= 0;
      }
     }
    ]
    ================================================================================================================================================

    由于这是中断标志之后的第一个过程、
    由于没有其他中断存在、
    我不希望它受到干扰。

    此致。

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

    您好、Gouki、

    在启动定时器被置位(GPIO21)后、ePWM ISR (清除/确认中断)将会有延迟。  这可能不是放置起始标记的最佳位置。  您也可以尝试使用外部触发器(TRIGSEL = 4)、在该触发器中、您可以使用 GPIO 从外部切换转换并使用它以及计时器标记。

    此致、

    Joseph

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

    您好 Joseph。

    我在 main 中没有中断的情况下检查了 ADC 处理时间。
    我确认 ADC 处理时间在12b/16b 中发生变化。
    恰好是12b/16b 的处理时间完全相同、但实际上它似乎正在发生正确的变化。

    我认为我的代码在 PWM 方面做了一些错误。
    此致。