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.

[参考译文] TM4C123FH6PM:ADC 数据采集问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/887237/tm4c123fh6pm-adc-data-capture-question

器件型号:TM4C123FH6PM

您好!

至于 ADC、我没有回答上一个问题、所以我创建了一个新的线程。

下面是内容

https://e2e.ti.com/support/microcontrollers/other/f/908/p/878416/3279617#3279617

Q1> ADCSequenceDataGet (ADC1_base、0和 pui32ADC0Value [0])无法正常工作。

    请告诉我。

此致、

Jame、Shin

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

    我的朋友、

    您是否认为您的"将必要的背景数据连接起来"而不是"在这里(立即)展示它"-对您的无经验"帮助者"施加(两者)"额外和不连贯"的压力!   经常-被迫"远离... 然后返回这里"原因、"关键事实丢失-或者(甚至)使其他(强大且有用)方法或想法"变弱和变云"...

    你的“时间很重要”——但不能对你的帮助者说同样的话?   您的"努力减少"(不幸的是、"需要您的帮助者付出更大的努力")是否合理?   明智吗?

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

    您好!

     我不知道为什么要在这里创建新的线程。 如果是新问题、通常会创建一个新主题。 如果这是上一个主题中未回答的问题、则应继续该主题。 当您创建这样的新线程时、我必须花费大量的时间来阅读 您的其他线程、以了解历史和进度。

    [引用 user="Jame shin"] Q1> ADCSequenceDataGet (ADC1_base、0和 pui32ADC0Value [0])无法正常工作。

     这意味着它无法正常工作? 它是在某个时候工作还是根本不工作? 您能总结一下错误吗?

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

    我的正义朋友 CB1

    我不像兔子那么快(TI 和专家)。

    这很难、但它只是像海龟一样晚了。

    我无权强迫他们回答。 我没有理由

    我只是等待温暖的感觉。

    我所能做的就是小走一小段路。 这是明智的选择。

    此致、

    Jame、Shin

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

    Jame、您好!

     我想为您提供帮助。 但您需要首先告诉我 ADCSequenceDataGet 有什么问题(ADC1_base、0和 pui32ADC0Value [0])。 它不读取数据还是数据不正确? 请详细说明问题。  

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

    您好、Charles、

    感谢您的回答。

    我了解再生螺纹注释。

    简要总结问题。

    如何修改源代码?

    Q1>不同 ADC 捕获的值会导致 pui32ADC0Value [0]和 pui32ADC1Value [0]出现问题。

          因此 ADC1无法正常工作。 我不知道为什么。

    ADCSequenceDataGet 之间的延迟条件(ADC0_BASE、…) 和 ADCSequenceDataGet (ADC1_base、…) 功能。

     // PE[3]/AIN0 (CH0),伏特->(ADC0):+5V 测量,       

     // PE[2]/AIN1 (CH1),伏特->(ADC1):+1.5V 测量

    (无延迟)

        pui32ADC0Value[0] ADC 计算值:4.54V

        pui32ADC1Value[0] ADC 计算值:4.54V

    (1的延迟)

        pui32ADC0Value[0] ADC 计算值:4.54V (5V-4.5V=0.5V)

        pui32ADC1Value[0] ADC 计算值:0.26V (1.5-0.26 =1.24V)

    Q2> 64引脚 TQFP MCU 为 ADC VREFP 3.3V 供电。

              DK-EVB 144引脚 MCU 为 VREFP 3.0V。 这种差异会导致 ADC0测量中的0.5V 差异

              如何校准0.5V?

    此致、

    Jame、Shin

    main()
    {char
    pcVoltBuffer1[6];
    char pcCurrBuffer1[6];
    char pcVoltBuffer2[6];
    char pcCurrBuffer2[6]
    ……μ A
    uint32_t pui32ADC0Value[2];
    uint32_t pui32ADC1Value[2];
    ……μ A
    uint32_t ui32V;
    uint32_t ui32V 电流;
    ……μ A
    SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
    SysCtlPeripheralEnable (SYSCTL_Periph_ADC1);
    
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD)
    
    GPIOPinTypeADC (GPIO_3_base);SysCtlPeripheralEnable (SYSCTL_PIN_2_PIN_PIN_PIN_2|GPIO_BASE)
    GPIOPinTypeADC (GPIO_PORTD_base、GPIO_PIN_1_GPIO_PIN_0);
    
    ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_PROCESSORS、 0);
    ADCSequenceConfigure (ADC1_BASE、0、ADC_TRIGGER_PROCESSORT0);
    
    ADCSequenceStepConfigure (ADC0_BASE、 0、2、ADC_CTL_CH0|ADC_CTL_CH6|ADC_CTL_IE|ADC_CTL_END);
    ADCSequenceStepConfigure (ADC1_BASE、0、 2、ADC_CTL_CH1|ADC_CTL_CH7|ADC_CTL_IE|ADC_CTL_END);
    
    ADCSequenceEnable (ADC0_BASE、0);
    ADCSequenceEnable (ADC1_BASE、 0);
    
    IntMasterEnable();
    
    
    while (1)
    {
    ……μ A。
    ADCProcessorTrigger (ADC0_BASE、0);
    ADCProcessorTrigger (ADC1_base、0);
    
    while (!ADCIntStatus (ADC0_BASE、0、false)&&!ADCIntStatus (ADC1_base、0、false))
    {
    }
    ADCIntClear (ADC0_BASE、0);
    ADCIntClear (ADC1_BASE、0)
    
    // PE[3]/AIN0 (CH0),伏特->(ADC0)
    ADCSequenceDataGet (ADC0_BASE、0、&pui32ADC0Value[0]);
    
    ui32Vol=(pui32ADC0Value[0]* 4100)/ 819;
    usnprintf (pcVoltBuffer、5、"%U.%u "、ui32V/1000、ui32Vol%1000);
    
    // PD[1]/AIN6 (CH6)、电流->(ADC0)
    ui32Current =(pui32ADC0Value[1]* 200)/273;
    usnprintf (pcCurrent Buffer、5、"%U.%04u "、ui32Current/1000、ui32Current%1000);
    …
    
    // PE[2]/AIN1 (CH1),伏特->(ADC1)
    ADCSequenceDataGet (ADC1_base、0、&pui32ADC1Value[0]);
    
    ui32Vol=(pui32ADC1Value[0]* 4100)/ 819;
    usnprintf (pcVoltBuffer、5、"%U.%u "、ui32V/1000、ui32Vol%1000);
    
    // PD[0]/AIN7 (CH7),电流->(ADC1)
    ui32Current =(pui32ADC1Value[1]* 200)/273;
    usnprintf (pcCurrent Buffer、5、"%U.%04u "、ui32Current/1000、ui32Current%1000);
    
    
    。}
    }
    

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

    让我们首先看看以下几行代码。 您如何知道 pui32ADC0Value[1]具有正确的数据? 当您调用 ADCSequenceDataGet 时、它将返回到缓冲区中的样本数量。 您需要根据复制到缓冲区的数据数量来确定 pu32ADC0Value[1]甚至 pu32ADC0Value[0]中是否存在有效数据。  

    // PE[3]/AIN0(CH0), Volt -> ( ADC0 )
           ADCSequenceDataGet(ADC0_BASE, 0, &pui32ADC0Value[0]);
           ui32Volt=(pui32ADC0Value[0]* 4100) / 819;
           usnprintf(pcVoltBuffer, 5, "%u.%u ", ui32Volt/1000,ui32Volt%1000);
           // PD[1]/AIN6(CH6), Curr -> (ADC0)
           ui32Current = (pui32ADC0Value[1] * 200) / 273;
           usnprintf(pcCurrBuffer, 5, "%u.%04u ", ui32Current/1000,ui32Current%1000);

    4.2.2.28 ADCSequenceDataGet


    获取采样序列的捕获数据。


    原型:
    内部32_t
    ADCSequenceDataGet (uint32_t ui32Base、
    uint32_t ui32SequenceNum、
    uint32_t * pui32缓冲器)


    参数:
    ui32Base 是 ADC 模块的基址。
    ui32SequenceNum 是采样序列编号。
    pui32Buffer 是存储数据的地址。


    描述:
    此函数将数据从指定的采样序列发生器输出 FIFO 复制到存储器驻留
    缓冲器。 硬件 FIFO 中可用的采样数被复制到缓冲区中、
    该值被认为足够大、足以容纳这么多样本。 此函数仅返回

    当前可用的样本、如果可用、可能不是整个采样序列
    在执行过程中。


    返回:
    返回复制到缓冲区的样本数。

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

    您好、Charles、

    很好的展示-年轻的员工、我很感谢您的分析。

    几个月过去-这张(经常)海报似乎"购买"了 Kiss 及其"高度关注和简化保障措施"。   现在、两者似乎都有、"离开大楼..."

    正如您所说-让我们(进一步)看看以下几行海报代码:

    // PE[3]/AIN0(CH0), Volt -> ( ADC0 )
           ADCSequenceDataGet(ADC0_BASE, 0, &pui32ADC0Value[0]);
           ui32Volt=(pui32ADC0Value[0]* 4100) / 819;
           usnprintf(pcVoltBuffer, 5, "%u.%u ", ui32Volt/1000,ui32Volt%1000);
           // PD[1]/AIN6(CH6), Curr -> (ADC0)
           ui32Current = (pui32ADC0Value[1] * 200) / 273;
           usnprintf(pcCurrBuffer, 5, "%u.%04u ", ui32Current/1000,ui32Current%1000);
     
    请注意、存在(仅)一行"重点、ADC 模块代码!"   (亮点中的所有代码-与海报中的"中央 ADC 模块焦点"相关-因此分散了海报的注意力!)
     
    难道不可能、在海报的"非直接 ADC 代码"中、"超越这种巨大的转移"(4:1代码行)可能会有"错误"吗?    这对您或他(他)的帮助者来说是不公平的!
     
    如果 不注意、"海报尝试解决一切问题"-经常会导致"解决一切问题!"   人们相信、更高(即正确)的关注重点将加强海报的 MCU 编程能力...
     
    海报(正确)指出"获得的原始 ADC 值"(不是其"修改/缩放/处理的值")将降低(外部)"非 ADC"编码错误的可能性、同时"减少(多余)对帮助者的需求"。   协助"帮助者"应"成为首要考虑因素"-由"寻求帮助者"提供。