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.

[参考译文] MSP432 - ADC 值过低

Guru**** 2595800 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/625931/msp432---adc-value-too-low

您好!

我刚才下载了实时操作系统的 MSP432F401R-ADC 例程、并尝试了 ADC 驱动程序。 我尝试使用示例并编译所有内容。 但是、ADC 读取的值低于实际值(通过万用表)。
电压等于万用表的1.73V、ADC 驱动器返回1.0V 的张力(使用函数 ADC_convertRawToMicroVolts)。


下面是 ADC 的配置:

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

    您能否提供您使用的代码的完整.zip 或示例的完整路径、以及您使用的 IDE、以便我了解一下?

    我希望您使用"adcsinglechanel"项目作为入门示例、该项目可从 Resource Explorer 中找到。

    此致、

     Bob

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

     Bob

    这是我的"adcsinglechane.c"文件源代码、非常感谢!

    /* ADC 转换结果变量*/
    uint16_t adcValue0;
    uint32_t adcValue0MicroVolt;
    uint16_t adcValue1[ADC_SAMPLE_COUNT];
    双精度 RC = 0;
    双 RT = 0;
    双电压= 0;
    /*
     * ==== taskFxn0 ===
     * 打开 ADC 实例并从单次转换中获取采样结果。
     *
    空 taskFxn0 (UARg arg0、UARg arg1)
      INT8_t I = 0;
      ADC_Handle ADC;
      ADC_Params 参数;
      int_fast16_t res;
      GPIO_WRITE (Board_ADC、0);
      while (1)
      {
        double voltage1 = 0、voltage2 = 0;
        ADC_PARAMS_INIT (params);
        ADC = ADC_open (Board_ADC0、params);
        如果(ADC ==空)
        {
          System_abort ("初始化 ADC 通道0\n"时出错);
        }
        其他
        {
          system_printf ("ADC 通道0已初始化\n"\});
        }
        Task_sleep (1000 * 1000 / Clock_tickPeriod);
        /*阻塞模式转换*/
        对于(I = 0;I < 5;I++)
        {
          RES = ADC_convert (ADC、&adcValue0);
          adcValue0MicroVolt = adc_convertRawToMicroVolts (adc、adcValue0);
          电压=(双倍) adcValue0 * 2.5f/16383.0f;
          voltage1 = voltage1 +电压;
        }
        voltage2 = voltage1 /I;
        if (res == ADC_STATUS_SUCCESS)
        {
          system_printf ("ADC 通道0转换结果:0x%x\n"、adcValue0);
        }
        其他
        {
          System_printf ("ADC 通道0转换失败\n"\n);
        }
        ADC_Close (ADC);
        Task_sleep (1000 * 1000 / Clock_tickPeriod);
      }
      system_flush();
    /*
     * ==== taskFxn1 ===
     * 打开一个 ADC 句柄,然后获取一组采样结果
     * 调用多个转换。
     *
    空 taskFxn1 (UARg arg0、UARg arg1)
      uint16_t i;
      ADC_Handle ADC;
      ADC_Params 参数;
      int_fast16_t res;
      ADC_PARAMS_INIT (params);
      ADC = ADC_open (Board_ADC1、params);
      如果(ADC ==空)
      {
        System_abort ("初始化 ADC 通道1\n"\n 时出错);
      }
      其他
      {
        system_printf ("ADC 通道1已初始化\n"\});
      }
      对于(I = 0;I < ADC_SAMPLE_COUNT;I++)
      {
        RES = ADC_convert (ADC、&adcValue1[i]);
        if (res == ADC_STATUS_SUCCESS)
        {
          system_printf ("ADC 通道1转换结果(%d):0x%x\n"、i、
                 adcValue1[i]);
        }
        其他
        {
          system_printf ("ADC 通道1转换失败(%d)\n"、i);
        }
        system_flush();
      }
      ADC_Close (ADC);
    /*
     * ==== main ====
     *
    int main (空)
      Task_Params taskParams;
      /*呼叫板初始化函数*/
      Board_initGeneral();
      Board_initadc();
      Board_initGPIO();
      /*创建任务*/
      Task_Params_init (&taskParams);
      taskParams.STACKSIZE = TASKSTACKSIZE;
      taskParams.stack =_task0Stack;
      Task_construct(&task0Struct,(Task_FuncPtr) taskFxn0、&taskParams、NULL);
      Task_Params_init (&taskParams);
      taskParams.STACKSIZE = TASKSTACKSIZE;
      taskParams.stack =_task1Stack;
      Task_construct(&task1Struct、(Task_FuncPtr) taskFxn1、&taskParams、NULL);
      System_printf (
          "启动 ADC 单通道示例\n 系统提供程序为"
          "设为 SysMin。  停止目标以查看 ROV 中的任何 SysMin 内容。\n");
      /* SysMin 仅在您调用 flush 或 exit 时才会打印到控制台*/
      system_flush();
      BIOS_start();
      返回(0);

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

    Bob

    下面是我的原理、我连接了两个电阻器、分压器的输入电压、目前的情况是电压输入连接到我的4V、成千上万的电压表读取值1.6V、通用电压表读取值0.8V。

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

    如果我理解正确、您的仪表读数为0.8V、软件报告的是1.6V。

    假设 P5.7上的输出较低、并且假设电阻器上的容差为典型值5-10%、则1.6V 值看起来是合理的。

    我确实注意到上述代码在第一个 while 循环中出现了一些奇怪的情况。 也就是说、您似乎要对 ADC 结果进行双转换:

          RES = ADC_convert (ADC、&adcValue0);
          adcValue0MicroVolt = adc_convertRawToMicroVolts (adc、adcValue0);
          电压=(双倍) adcValue0 * 2.5f/16383.0f;
          voltage1 = voltage1 +电压;
    函数 ADC_convertRawToMicroVolts ()接受输入并已将其转换为电压值。 您不需要突出显示的行、该行通常用于将二进制值转换为实际的电压值(此处、用于2.5V 基准和14位 ADC 读取)。
    您能否确认此序列中每个步骤的读数是多少? (即:
    1、每次读取时 adcValue0的值是多少?
    P5.7上的电压是多少? 还是将其配置为输入?
    3、您的仪表在 P5.5上读数是否为0.8V?