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.

[参考译文] TIVAC - ADC 值问题(12位)

Guru**** 2589280 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/990939/tivac---adc-value-issue-12-bit

各位专家:

目前我正在使用 ADC 的 TIVAC、我知道 ADC 为12位、因此我们得到0-4098值、但得到49005000、我不知道产生该误差值的原因、ADC 输入电压为0-3V、但为什么该值将大于12位值、 我已共享了我的串行日志和代码供您参考、请检查并指出错误

#include
#include
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/adc.h"
#include "driverlib/rom.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
#include "inc/hw_ints.h"
#include "inc/hw_NVIC.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/fpu.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/SysTick .h"

空配置 UART (空)

ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
ROM_GPIOPinConfigure (GPIO_PA0_U0RX);
ROM_GPIOPinConfigure (GPIO_PA1_U0TX);
ROM_GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
UARTClockSourceSet (UART0_BASE、UART_CLOCK_PIOSC);
UARTStdioConfig (0、115200、16000000);

int main (空)

int ulADC0Value[4];
volatile unsigned long ulTempAvg;

SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
ADCHardwareOversampleConfigure (ADC0_BASE、64);
ADCSequenceDisable (ADC0_BASE、1);

SysCtlClockSet (SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);

SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);

while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOE))

while (!SysCtlPeripheralReady (SYSCTL_Periph_ADC0))


GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3 | GPIO_PIN_2);


ADCSequenceConfigure (ADC0_BASE、1、ADC_TRIGGER_PROCESSOR、0);
ADCSequenceStepConfigure (ADC0_BASE,1,0,ADC_CTL_CH0);
ADCSequenceStepConfigure (ADC0_BASE、1、1、ADC_CTL_CH1 | ADC_CTL_IE | ADC_CTL_END);
ADCSequenceEnable (ADC0_BASE、1);
ADCIntClear (ADC0_BASE、1);
ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PIOSC | ADC_CLOCK_RATE_FULL、1);

ConfigureUART();

UARTprintf ("Hello、world!\n");

while (1)

ADCProcessorTrigger (ADC0_BASE、1);

while (!ADCIntStatus (ADC0_BASE、1、false))

ADCIntClear (ADC0_BASE、1);

ADCSequenceDataGet (ADC0_BASE、1、ulADC0Value);

ulTempAvg =(ulADC0Value[0]+ ulADC0Value[1]+ ulADC0Value[2]+ ulADC0Value[3]);
UARTprintf ("adc=%d\n"、ulTempAvg);
SysCtlDelay (SysCtlClockGet ()/ 5 / 3);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="387319" URL"~/support/tools/ccs/f/code-composer-studio-forum/990939/tivac---adc-value-issue-12-bit ]ulTempAvg =(ulADC0Value[0]+ ulADC0Value[1]+ ulADC0Value[2]+ ulADC0Value[3]);
    UARTprintf ("adc=%d\n"、ulTempAvg);

    代码有一个名为  ulTempAvg 的变量、这表明它应该包含一些 ADC 采样的平均值。 然而、代码报告的是4个 ADC 采样的总和、而不是平均值。

    尝试使用4分频得到平均值:

    ulTempAvg = (ulADC0Value[0] + ulADC0Value[1] + ulADC0Value[2] + ulADC0Value[3]) / 4;
    UARTprintf("ADC=%d\n",ulTempAvg);

    此外,代码会忽略 ADCSequenceDataGet ()的返回值,该值是复制到缓冲区的样本数。 即、并非 ulADC0Value 数组中的所有4个条目都可以填充、从而可能会根据未定义的数据计算 ulTempAvg。

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

    您好@Chester Gillon

    感谢您的回复、我已经按如下方式更改了代码、但我对 TI 不熟悉、因此该 ADC 有一点困惑、该 ADC 读取有四种类型的序列用于什么?我无法理解该 ADC 配置、  现在、我尝试通过150欧姆电阻器读取4-20mA 输入、我已经使用万用表检查了它在600mA 至3V 范围内的完美变化、但我不知道如何根据 ADC 值显示 UART 中的电压、  

    int main (空)

    uint32_t pui32ADC0Value[1];
    SysCtlClockSet (SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
    SYSCTL_XTAL_16MHz);
    InitConsole();
    UARTprintf ("ADC ->\n");
    UARTprintf ("类型:单端\n");
    UARTprintf ("示例:一个\n");
    UARTprintf ("更新速率:250ms\n");
    UARTprintf ("输入引脚:AIN0/PE3\n\n");
    SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
    GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3);
    ADCSequenceConfigure (ADC0_BASE、3、ADC_TRIGGER_PROCESSOR、0);
    ADCSequenceStepConfigure (ADC0_BASE、3、0、ADC_CTL_CH0 | ADC_CTL_IE |
    ADC_CTL_END);
    ADCSequenceEnable (ADC0_BASE、3);
    ADCIntClear (ADC0_BASE、3);
    while (1)

    ADCProcessorTrigger (ADC0_BASE、3);
    while (!ADCIntStatus (ADC0_BASE、3、false))

    ADCIntClear (ADC0_BASE、3);
    ADCSequenceDataGet (ADC0_BASE、3、pui32ADC0Value);

    UARTprintf ("AIN0 =%4D\r\n"、pui32ADC0Value[0]/7);
    SysCtlDelay (SysCtlClockGet ()/12);

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

    简化函数 UARTprintf()不支持打印浮点数,但使用浮点数是将 ADC 读数缩放到电压的最简单方法。 下面是将浮点值拆分为两个整数的简单技巧、然后可以将这两个整数打印出来、使其看起来像浮点值。

    void
    main(void)
    {
        unsigned int adcValue;
        unsigned int fracPart;
        unsigned int intPart;
        float fAdcValue;
    
        MAP_FPULazyStackingEnable();
        MAP_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |
                           SYSCTL_OSC_MAIN);
        ConfigureUART();
        UARTprintf("Print floating point using UARTprintf()\n");
        adcValue = 3300; // Example value from ADC
        fAdcValue = (float)adcValue * 3.3 / 4095.0;
        intPart = (int)fAdcValue;
        fracPart = (int)((fAdcValue - intPart) * 100.0);
        UARTprintf(" Voltage = %d.%02dV\n", intPart, fracPart);
    }