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:ADC 转换时间

Guru**** 2469480 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1053444/tms320f28377s-adc-conversion-time

器件型号:TMS320F28377S

您好!

Sysclk = 50 MHz used, Vref = 3 V

//-------------------------------------------ADC configuration:-------------------------------------------------------------------

    EALLOW;

    AdcaRegs.ADCCTL2.bit.PRESCALE = 1

    AdcSetMode(ADC_ADCA, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);

    AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;

    AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;

    DELAY_US(1000);

    EDIS;

    acqps = 30;

    EALLOW;

    AdcaRegs.ADCSOC0CTL.bit.CHSEL = 2; 

    AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;

    AdcaRegs.ADCSOC1CTL.bit.ACQPS = acqps;

    AdcaRegs.ADCSOC2CTL.bit.CHSEL = 2; 

    AdcaRegs.ADCSOC2CTL.bit.ACQPS = acqps;

    AdcaRegs.ADCSOC3CTL.bit.CHSEL = 2; 

    AdcaRegs.ADCSOC3CTL.bit.ACQPS = acqps;

    AdcaRegs.ADCSOC4CTL.bit.CHSEL = 2; 

    AdcaRegs.ADCSOC4CTL.bit.ACQPS = acqps;

    AdcaRegs.ADCSOC5CTL.bit.CHSEL = 2; 

    AdcaRegs.ADCSOC5CTL.bit.ACQPS = acqps;

    AdcaRegs.ADCSOC6CTL.bit.CHSEL = 2; 

    AdcaRegs.ADCSOC6CTL.bit.ACQPS = acqps;

    AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 6;

    AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;  

    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

    EDIS;

//--------------------------------------------------------------------------------------------------------------

 

Uint16 adc_count = 0, main_count=0;

Main for(;;) loop:

{     

           // when ADC voltage > 1 V at ADC pin is given, below condition executed once using flag variable:

           {

               main_count = 0;

               GpioDataRegs.GPCSET.bit.GPIO67 = 1;

           }

       main_count++; 

       ADC_read();

       if(adc_count > 1100)

       {

        GpioDataRegs.GPCCLEAR.bit.GPIO67 = 1;

        // Observed main_count using breakpoint; value found to be 29

       }     

 

}     

Uint16 ADC_read()

{

       EALLOW;

       AdcaRegs.ADCSOCPRICTL.bit.SOCPRIORITY = 0x01;

       EDIS;

       AdcaRegs.ADCSOCFRC1.all = 0x007F;     

       DELAY_US(10);

       if(AdcaRegs.ADCINTFLG.bit.ADCINT1 == 1)

       {

             AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

             adc_count = ADC_Result();

       }

}

 

Uint16 ADC_Result()

{

       // average of ADCa result 0 to 6

}

//------ 问题----

1:当 ADC 电压从0变为3V 时、引脚切换需要800us (导通至关断脉冲持续时间)。 为什么需要这么多时间以及如何减少这种情况。

ADC_READ() 在观察 ADC 结果与给定电压匹配之前执行两次。 为什么存在延迟? 首次事件时未获取 ADC 结果的原因。

请提供指导

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

    RH、

    对于 ACQPS = 30时的上述设置(SYSCLK = 50MHz 和 ADCCLK = 25MHz)、6次转换应该需要13.02us 才能完成。

    我认为问题是 ADC 读取函数内的 DELAY_US (10)和"if"条件。

     由于在10us 延迟后 ADC 将不会完成、因此它将退出函数并返回主函数、然后重新触发 ADC 并等待另一个10us、然后检查标志是否已设置(它已设置)。

    这说明了增加的时间和双函数调用。

    您应该删除 ADC 读取中的 DELAY_US (10)、并替换

    if (AdcaRegs.ADCINTFlG.bit.ADCINT1 = 1){

    使用

    while (AdcaRegs.ADCINTFlG.bit.ADCINT1 = 0){};

     AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

     ADC_COUNT = ADC_RESULT ();

    这将等到转换完成后再调用取平均值函数。 并节省额外的函数调用和时间。

    最棒的

    Matthew

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

    您好、Matthew、  

    感谢您的参与。 以下是我需要您指导的观察结果:

    [引用 userid="8973" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1053444/tms320f28377s-adc-conversion-time/3898504 #3898504"]对于上述设置(SYSCLK = 50MHz 和 ADCCLK = 25MHz)、ACQPS = 30、6次转换需要13.02us 才能完成。[/quote

    是这样、它是如何计算的? :{[采样时间(30+1)/25M)] 1.24u+[转换时间(13/(25M*2)]1.04u}*6=13.68usec

     //--------------------------------------------------------------

    1、  AdcRegs.ADCCTL2.bit.prescale = 1时 ADC 时钟的状态是什么(TRM 显示无效)

    2. 考虑 到上述 ADC 计算、如建议和以下变化:

    GpioDataRegs.GPCDAT.bit.GPIO67=1;
    AdcaRegs.ADCSOCFRC1.ALL = 0x007F;  
    while (AdcaRegs.ADCINTFlG.bit.ADCINT1 = 0){};

    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

    GpioDataRegs.GPCDAT.bit.GPIO67=0;

    我将低于 GPIO67 pos 准时的时序:

    预分频 GPIO µs 时间(μ s) µs 时间(μ s)
    1 7.2.
    0 6.46. 6.1600
    2. 7.72. 13.68

    这种不匹配的原因。 请提供指导。

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

    RH、

    正如您在答复中所示、ADC 采样保持电路是 CPU 时钟= 50MHz 的时钟、而 ADC 转换时间是 基于系统中的 ADC 时钟= 25MHz。

    我没有注意到原始代码中的 ADC 预分频设置、因为您提到的值1 (ADC 时钟= SYSCLK/1.5)是不允许的。  我假设预分频= 2、在我的上述数学运算中、这将使 ADC 时钟= 50MHz/2 = 25MHz。

    我没有正确考虑到预分频= 2时 ADC 需要转换的周期数。  在此设置下、ADC 每次转换需要10.5个 ADC 时钟。  将其转换回 SYSCLK 域(因为 ACQPS 基于该域)并使用21个 SYSCLK 周期可能更容易。

    因此、对于 ADC 预分频= 2、每个采样和转换将是31 * 1/50MHz + 21 * 1/50MHz = 52 * 1/50MHz = 1.04us * 6 = 6.24us。  我认为、在我给出先前的响应时、我已经将转换器在16位模式下的时序混合在一起。

    对于0的预分频、对于 ADC 预分频= 0、这将是31*1/50MHz + 10.5*1/50MHz = 41.5*1/50MHz = 830ns *6=4.98us

    上述 PS=2和 PS=0的差异=1.26us。  如果您计算测量值的差异、则该值也为1.26us、将实际值与仿真结果匹配。

    这还意味着存在恒定的1.48us 延迟、除了 GPIO 转换的写入和传播延迟外、可能还会轮询 ADC 完成的结果。

    最棒的
    Matthew