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.

[参考译文] LAUNCHXL-CC1310:cc1310如何提高 ADC 的精度并减小误差?μ V

Guru**** 2468460 points
Other Parts Discussed in Thread: CC1310

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1456693/launchxl-cc1310-how-does-the-cc1310-improve-the-accuracy-of-the-adc-and-reduce-the-error

器件型号:LAUNCHXL-CC1310
Thread 中讨论的其他器件:CC1310

工具与软件:

 RES = ADC_CONVERT (ADC、&adcValue0);  

adcValue0MicroVolt = ADC_convertRawToMicroVolts (ADC、adcValue0);

能否使用 ADC 的增益和失调参数来校正误差?

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

    当在 SDK 中使用 ADC 驱动器时、您已经在使用存储在 FCFG1中的增益/偏移补偿因子。

    另请参阅以下文章、了解可能导致阅读错误的内容。

    (+) CC1310:如何校准 ADC 基准电压-低于1GHz 论坛-低于1GHz - TI E2E 支持论坛

    Siri

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

    我想以4*4 1310的 DIO9引脚作为 ADC 输入来测量 VDDS 连接电池电压、该如何设置它? 以下是我的代码。


    /*具有模拟功能的数字音箱*/
    #define CC1310_LAUNCHXL_DIO23_ANALOG IOID_9// IOID_23
    #define CC1310_LAUNCHXL_DIO24_ANALOG IOID_24
    #define CC1310_LAUNCHXL_DIO25_ANALOG IOID_25
    #define CC1310_LAUNCHXL_DIO26_ANALOG IOID_26
    #define CC1310_LAUNCHXL_DIO27_ANALOG IOID_27
    #define CC1310_LAUNCHXL_DIO28_ANALOG IOID_28
    #define CC1310_LAUNCHXL_DIO29_ANALOG IOID_29
    #define CC1310_LAUNCHXL_DIO30_ANALOG IOID_30

    #include "ADC.h"
    #include "GPIO.h"

    /*
    *================== ADCBuf============
    */
    #include
    #include

    ADCBufCC26XX_Object adcBufCC26xxObjects[CC1310_LAUNCHXL_ADCBUFCOUNT];

    /*
    *此表将虚拟 ADC 信道转换为 DIO 和内部模拟
    *输入信号。 该表是 adcBuf 的运行所必需的
    *驱动程序。 注释掉未使用的条目以保存闪存。 DIO 和内部信号
    *对是硬接线的。 请勿在表中重新映射它们。 您可以在整个系列中再次订购
    *条目。 DIO 和内部信号的映射取决于封装。
    */
    const ADCBufCC26XX_AdcChannelLutEntry ADCBufCC26XX_adcChannelLut[CC1310_LAUNCHXL_ADCBUF0CHANNELCOUNT]={
    {CC1310_LAUNCHXL_DIO23_ANALOG、ADC_COMPB_IN_AUXIO3}、//ADC_COMPB_IN_AUXIO7
    {CC1310_LAUNCHXL_DIO24_ANALOG、ADC_COMPB_IN_AUXIO6}、
    {CC1310_LAUNCHXL_DIO25_ANALOG、ADC_COMPB_IN_AUXIO5}、
    {CC1310_LAUNCHXL_DIO26_ANALOG、ADC_COMPB_IN_AUXIO4}、
    {CC1310_LAUNCHXL_DIO27_ANALOG、ADC_COMPB_IN_AUXIO3}、
    {CC1310_LAUNCHXL_DIO28_ANALOG、ADC_COMPB_IN_AUXIO2}、
    {CC1310_LAUNCHXL_DIO29_ANALOG、ADC_COMPB_IN_AUXIO1}、
    {CC1310_LAUNCHXL_DIO30_ANALOG、ADC_COMPB_IN_AUXIO0}、
    {PIN_UNASSIGNED、ADC_COMPB_IN_VDDS}、
    {PIN_UNASSIGNED、ADC_COMPB_IN_DCOUPL}、
    {PIN_UNASSIGNED、ADC_COMPB_IN_VSS}、
    };

    CONST ADCBufCC26XX_HWAttrs adcBufCC26xxHWAttrs[CC1310_LAUNCHXL_ADCBUFCOUNT]={

    .intPriority =~0、
    .swiPriority = 0、
    .adcChannelLut = ADCBufCC26XX_adcChannelLut、
    }
    };

    CONST ADC Buf_Config ADCBuf_CONFIG[CC1310_LAUNCHXL_ADCBUFCOUNT]={

    &ADCBufCC26XX_fxnTable、
    &adcBufCC26xxObjects[CC1310_LAUNCHXL_ADCBUF0]、
    &adcBufCC26xxHWAttrs[CC1310_LAUNCHXL_ADCBUF0]
    }、
    };

    const uint_least8_t ADCBuf_count = CC1310_LAUNCHXL_ADCBUFCOUNT;

    /*
    *================== ADC =为您的客户提供支持
    */
    #include
    #include

    ADCCC26XX_Object adcCC26xxObjects[CC1310_LAUNCHXL_ADCCOUNT];


    CONST ADCCC26XX_HWAttrs adcCC26xxHWAttrs[CC1310_LAUNCHXL_ADCCOUNT]={

    .adcDIO = CC1310_LAUNCHXL_DIO23_ANALOG、
    .adcCompBInput = ADC_COMPB_IN_AUXIO3、//ADC_COMPB_IN_AUXIO7
    .refSource = ADCCC26XX_VDDS_REFERENCE、//ADCCC26XX_FIXED_REFERENCE ADCC26XX_VDDS_REFERENCE
    .samplingDuration = ADCCC26XX_SAMPLING_DURATION_2P7_US、
    .inputScalingEnabled = true、
    .triggerSource = ADCCC26XX_TRIGGER_MANUAL
    .returnAdjustdVal = false
    }、

    .adcDIO = CC1310_LAUNCHXL_DIO24_ANALOG、
    .adcCompBInput = ADC_COMPB_IN_AUXIO6、
    .refSource = ADCCC26XX_FIXED_REFERENCE、
    .samplingDuration = ADCCC26XX_SAMPLING_DURATION_2P7_US、
    .inputScalingEnabled = true、
    .triggerSource = ADCCC26XX_TRIGGER_MANUAL
    .returnAdjustdVal = false
    }、

    .adcDIO = CC1310_LAUNCHXL_DIO25_ANALOG、
    .adcCompBInput = ADC_COMPB_IN_AUXIO5、
    .refSource = ADCCC26XX_FIXED_REFERENCE、
    .samplingDuration = ADCCC26XX_SAMPLING_DURATION_2P7_US、
    .inputScalingEnabled = true、
    .triggerSource = ADCCC26XX_TRIGGER_MANUAL
    .returnAdjustdVal = false
    }、

    .adcDIO = CC1310_LAUNCHXL_DIO26_ANALOG、
    .adcCompBInput = ADC_COMPB_IN_AUXIO4、
    .refSource = ADCCC26XX_FIXED_REFERENCE、
    .samplingDuration = ADCCC26XX_SAMPLING_DURATION_2P7_US、
    .inputScalingEnabled = true、
    .triggerSource = ADCCC26XX_TRIGGER_MANUAL
    .returnAdjustdVal = false
    }、

    .adcDIO = CC1310_LAUNCHXL_DIO27_ANALOG、
    .adcCompBInput = ADC_COMPB_IN_AUXIO3、
    .refSource = ADCCC26XX_FIXED_REFERENCE、
    .samplingDuration = ADCCC26XX_SAMPLING_DURATION_2P7_US、
    .inputScalingEnabled = true、
    .triggerSource = ADCCC26XX_TRIGGER_MANUAL
    .returnAdjustdVal = false
    }、

    .adcDIO = CC1310_LAUNCHXL_DIO28_ANALOG、
    .adcCompBInput = ADC_COMPB_IN_AUXIO2、
    .refSource = ADCCC26XX_FIXED_REFERENCE、
    .samplingDuration = ADCCC26XX_SAMPLING_DURATION_2P7_US、
    .inputScalingEnabled = true、
    .triggerSource = ADCCC26XX_TRIGGER_MANUAL
    .returnAdjustdVal = false
    }、

    .adcDIO = CC1310_LAUNCHXL_DIO29_ANALOG、
    .adcCompBInput = ADC_COMPB_IN_AUXIO1、
    .refSource = ADCCC26XX_FIXED_REFERENCE、
    .samplingDuration = ADCCC26XX_SAMPLING_DURATION_2P7_US、
    .inputScalingEnabled = true、
    .triggerSource = ADCCC26XX_TRIGGER_MANUAL
    .returnAdjustdVal = false
    }、

    .adcDIO = CC1310_LAUNCHXL_DIO30_ANALOG、
    .adcCompBInput = ADC_COMPB_IN_AUXIO0、
    .refSource = ADCCC26XX_FIXED_REFERENCE、
    .samplingDuration = ADCCC26XX_SAMPLING_DURATION_10P9_MS、
    .inputScalingEnabled = true、
    .triggerSource = ADCCC26XX_TRIGGER_MANUAL
    .returnAdjustdVal = false
    }、

    .adcDIO = PIN_UNASSIGNED、
    .adcCompBInput = ADC_COMPB_IN_DCOUPL、
    .refSource = ADCCC26XX_FIXED_REFERENCE、
    .samplingDuration = ADCCC26XX_SAMPLING_DURATION_2P7_US、
    .inputScalingEnabled = true、
    .triggerSource = ADCCC26XX_TRIGGER_MANUAL
    .returnAdjustdVal = false
    }、

    .adcDIO = PIN_UNASSIGNED、
    .adcCompBInput = ADC_COMPB_IN_VSS、
    .refSource = ADCCC26XX_FIXED_REFERENCE、
    .samplingDuration = ADCCC26XX_SAMPLING_DURATION_2P7_US、
    .inputScalingEnabled = true、
    .triggerSource = ADCCC26XX_TRIGGER_MANUAL
    .returnAdjustdVal = false
    }、

    .adcDIO = PIN_UNASSIGNED、
    .adcCompBInput = ADC_COMPB_IN_VDDS、
    .refSource = ADCCC26XX_FIXED_REFERENCE、
    .samplingDuration = ADCCC26XX_SAMPLING_DURATION_2P7_US、
    .inputScalingEnabled = true、
    .triggerSource = ADCCC26XX_TRIGGER_MANUAL
    .returnAdjustdVal = false
    }
    };

    CONST ADC_Config ADC_CONFIG[CC1310_LAUNCHXL_ADCCOUNT]={
    {&ADCC26XX_fxnTable、&adcCC26xxObjects[CC1310_LAUNCHXL_ADC0]、&adcCC26xxHWAttrs[CC1310_LAUNCHXL_ADC0]}、
    {&ADCC26XX_fxnTable、&adcCC26xxObjects[CC1310_LAUNCHXL_ADC1]、&adcCC26xxHWAttrs[CC1310_LAUNCHXL_ADC1]}、
    {&ADCCC26XX_fxnTable、&adcCC26xxObjects[CC1310_LAUNCHXL_ADC2]、&adcCC26xxHWAttrs[CC1310_LAUNCHXL_ADC2]}、
    {&ADCC26XX_fxnTable、&adcCC26xxObjects[CC1310_LAUNCHXL_ADC3]、&adcCC26xxHWAttrs[CC1310_LAUNCHXL_ADC3]}、
    {&ADCCC26XX_fxnTable、&adcCC26xxObjects[CC1310_LAUNCHXL_ADC4]、&adcCC26xxHWAttrs[CC1310_LAUNCHXL_ADC4]}、
    {&ADCC26XX_fxnTable、&adcCC26xxObjects[CC1310_LAUNCHXL_ADC5]、&adcCC26xxHWAttrs[CC1310_LAUNCHXL_ADC5]}、
    {&ADCCC26XX_fxnTable、&adcCC26xxObjects[CC1310_LAUNCHXL_ADC6]、&adcCC26xxHWAttrs[CC1310_LAUNCHXL_ADC6]}、
    {&ADCCC26XX_fxnTable、&adcCC26xxObjects[CC1310_LAUNCHXL_ADC7]、&adcCC26xxHWAttrs[CC1310_LAUNCHXL_ADC7]}、
    {&ADCCC26XX_fxnTable、&adcCC26xxObjects[CC1310_LAUNCHXL_ADCDCOUPL]、&adcCC26xxHWAttrs[CC1310_LAUNCHXL_ADCDCOUPL]}、
    {&ADCC26XX_fxnTable、&adcCC26xxObjects[CC1310_LAUNCHXL_ADCVSS]、&adcCC26xxHWAttrs[CC1310_LAUNCHXL_ADCVSS]}、
    {&ADCC26XX_fxnTable、&adcCC26xxObjects[CC1310_LAUNCHXL_ADCVDDS]、&adcCC26xxHWAttrs[CC1310_LAUNCHXL_ADCVDDS]}、
    };

    const uint_least8_t ADC_count = CC1310_LAUNCHXL_ADCCOUNT;

    uint8_t ADC_GetVol (void)

    #define USE_ADC
    #ifdef USE_ADC
    ADC_Handle ADC;
    ADC_Params 参数;

    uint8_t i=0;
    int_fast16_t res;
    uint32_t adcValue0MicroVolt;
    uint16_t adcValue0=0;
    uint32_t adcValue=0;
    uint8_t bat_vol=0;
    static uint8_t last_batvol=0;记录上次电量档位、防止电量档位跳变 μ s
    悬空 Vbat=0.00;
    浮点 Vbat1=0.00;

    adc_init();
    adc_params_init (&params);
    ADC = ADC_open (0、&params);//DIO7

    if (adc == NULL){
    while (1);
    }

    /*阻塞模式转换*/
    for (i=0;i<5;i++)

    RES = ADC_CONVERT (ADC、&adcValue0);
    vbat += 3.60*adcValue0/4096.0;
    // Vbat1+=(ADC_convertRawToMicroVolts (ADC、adcValue0)/1000000.0);
    }

    // Vbat1 =(float) Vbat1/5.0;
    VBAT=2.0*(float) Vbat/5.0;
    如果(res == ADC_STATUS_SUCCESS){
    // adcValue0MicroVolt = ADC_convertRawToMicroVolts (ADC、adcValue0);
    // Vbat=2.0*(float) adcValue0MicroVolt/1000000.0;换算电池电压 μ s
    ADC_Close (ADC);
    for (i=0;i<5;i++)

    如果(Vbat>= BAT_LEVEL[i])

    bat_vol=5-i;
    if (bat_vol>last_batvol)//防止电量临界值导致档位跳变

    bat_vol=last_batvol;
    }
    last_batvol=bat_vol;
    休息;
    }
    }
    IF (Vbat<2.04) 0格电量 μ V

    bat_vol=0;
    last_batvol=bat_vol;
    }
    返回 bat_vol;
    }
    ADC_Close (ADC);
    返回0;

    }

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

    我使用 ADC_convertRawToMicroVolts (ADC、adcValue0)来获取电压、但它小于实际输入电压、因此我想知道 API 如何计算电压、基准电压是多少?

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

    在这篇文章中有很多事情要做,所以*我有点不确定你实际上需要什么帮助。

    问题是您无法读取  DIO9上的电压、还是能够读取但读出的值不正确?

    如果第二种情况是 DIO0、您输入的电压是多少、您正在测量的值是多少?

    您不必执行任何操作、只需获得电压:

    res = ADC_convert(adc, &adcValue0);
    
    if (res == ADC_STATUS_SUCCESS)
    {
        adcValue0MicroVolt = ADC_convertRawToMicroVolts(adc, adcValue0);
    }
    
    

    关于参考:

    /*!
     *  @brief  Specifies whether the internal reference of the ADC is sourced from the battery voltage or a fixed internal source.
     *
     *  - In practice, using the internal fixed voltage reference sets the upper range of the ADC to a fixed value. That value is 4.3V with
     *  input scaling enabled and ~1.4785V with input scaling disabled. In this mode, the output is a function of the input voltage multiplied
     *  by the resolution in alternatives (not bits) divided by the upper voltage range of the ADC. Output = Input (V) * 2^12 / (ADC range (V))
     *
     *  - Using VDDS as a reference scales the upper range of the ADC with the battery voltage. As the battery depletes and its voltage drops, so does
     *  the range of the ADC. This is helpful when measuring signals that are generated relative to the battery voltage. In this mode, the output is
     *  a function of the input voltage multiplied by the resolution in alternatives (not bits) divided by VDDS multiplied by a scaling factor derived
     *  from the input scaling. Output = Input (V) * 2^12 / (VDDS (V) * Scaling factor), where the scaling factor is ~1.4785/4.3 for input scaling
     *  disabled and 1 for input scaling enabled.
     *
     *  @note   The actual reference values are slightly different for each device and are higher than the values specified above. This gain is saved in
     *          the FCFG. The function ::ADC_convertToMicroVolts() must be used to derive actual voltage values. Do not attempt to compare raw values
     *          between devices or derive a voltage from them yourself. The results of doing so will only be approximately correct.
     *
     *  @warning    Even though the upper voltage range of the ADC is 4.3 volts in fixed mode with input scaling enabled, the input should never exceed
     *              VDDS as per the data sheet.
     */
    typedef enum ADCCC26XX_Reference_Source {
        ADCCC26XX_FIXED_REFERENCE       = AUXADC_REF_FIXED,
        ADCCC26XX_VDDS_REFERENCE        = AUXADC_REF_VDDS_REL
    } ADCCC26XX_Reference_Source;

    Siri

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

    电路板的输入电压范围为0V 至3.6V、在电阻分压器之后 ADC 引脚采集电压的范围为0V 至1.8V、并且选择 VDDS 作为基准电压。
    从引脚测得的电压为1.77V、ADC 值为2070、使用 API 计算2.22V、使用公式计算1.81V

    adc_init();
    adc_params_init (&params);
    ADC = ADC_open (0、&params);//DIO7

    if (adc == NULL){
    while (1);
    }

    /*阻塞模式转换*/
    for (i=0;i<5;i++)

    RES = ADC_CONVERT (ADC、&adcValue0);
    vbat += 3.6*adcValue0/4096.0;
    Vbat1+=(ADC_convertRawToMicroVolts (ADC、adcValue0)/1000000.0);
    }

    Vbat1 =(float) Vbat1/5.0;
    VBAT =(float) Vbat/5.0;

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

    CONST ADCCC26XX_HWAttrs adcCC26xxHWAttrs[CC1310_LAUNCHXL_ADCCOUNT]={

    .adcDIO = CC1310_LAUNCHXL_DIO23_ANALOG、
    .adcCompBInput = ADC_COMPB_IN_AUXIO3、//ADC_COMPB_IN_AUXIO7
    .refSource = ADCCC26XX_VDDS_REFERENCE、//ADCCC26XX_FIXED_REFERENCE ADCC26XX_VDDS_REFERENCE
    .samplingDuration = ADCCC26XX_SAMPLING_DURATION_2P7_US、
    .inputScalingEnabled = true、
    .triggerSource = ADCCC26XX_TRIGGER_MANUAL
    .returnAdjustdVal = false
    }、

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

    您是否有 ACC1310 LP、以便可以尝试在那里实施您确切需要执行的操作?

    这样您就可以共享您的代码、我可以在 LP 上进行测试。 一旦我们能够在可用的硬件上获得所需的结果、我就可以尝试帮助您将其移植到4x4中。

    BR

    Siri

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

    我使用 cc1310 Launchpad 并以 ADCCC26XX_FIXED_REFERENCE 作为参考来测试历史记录、DIO23引脚收集的输入电压非常准确、但现在我更改为4 * 4板、发现 API ADC_convertRawToMicroVoltsc 收集的电压值不准确、我想知道 API 具体转换电压的公式

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

    即使要更改器件、也不必更改 API 中的任何内容。

    您只应进行模拟引脚的重映射、不进行任何其他操作。

    其余代码应保留为您已在 LP 上测试过的代码。

    请查看下列关于应进行哪些更改的历史记录:

    (+) LAUNCHXL-CC1310:将 ADC 从示例代码重新映射到新封装-低于1GHz 论坛-低于1GHz - TI E2E 支持论坛

    完成更改后、按照与 yuo 测试 DIO23完全相同的方式测试其中一个模拟输入、以查看您可以重现结果。

    由于我没有此封装的任何硬件、因此很遗憾我无法为您进行任何测试。

    Siri