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.

[参考译文] MSPM0C1104:内部温度读数的可重复性

Guru**** 2590580 points
Other Parts Discussed in Thread: LP-MSPM0C1104

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1352023/mspm0c1104-repeatability-of-internal-temperature-reading

器件型号:MSPM0C1104

我想充分利用内部温度传感器。 我使用 LP-MSPM0C1104 LaunchPad 测试了传感器。 我‘了 SDK 中的"ADC12_single_conversion"示例作为基准、将 Vref 更改为内部1.4并选择了"Ch11…"

结果不如我预期的好。 我连续进行了100000次测量、我从1848年到1868年从 ADC 获得了广泛的结果。 请参见下图。 我希望结果读数具有更高的可重复性。 为什么如此广泛的结果? 我可以执行任何操作来获得更可重复的结果吗?

Thx, Goran

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

    尊敬的 Goran:

    非常有趣。  我假设这是在室温下、对吧?   让我来看一下。

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

    是的、室温。 液化石油气

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

    尊敬的 Goran:

    我运行相同的测试、Vref = 1.4V。  读数大多为1890年、但有几个较低、还有一些低至1750年。  有趣。

    我假设、方差可能与 ADC 采样/转换期间运行的系统时钟或 CPU 的噪声相关。

    我将重复测试、但让计时器在 CPU 处于睡眠或停止低功耗模式时启动 ADC 转换。  我将由系统和设计团队来证实我的假设。

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

    尊敬的 Goran:

    我怀疑、CPU 运行时似乎存在噪音。

    在和示例中、我将设置更改为使用电源策略 STOP0、并使用从 LFOSC 运行的计时器每20ms 生成一个事件(启动 ADC 采样/转换)。  不要使用计时器中断、因为这会强制唤醒 CPU。 ADC 完成时、它会生成一个中断、以唤醒 CPU 来读取数据、将数据从 UART 发送出去、然后 CPU 返回到 STOP0。

    void send(uint8_t* buffer, uint8_t size)
    {
        uint8_t i;
    
        for (i = 0; i < size; i++)
        {
            DL_UART_Main_transmitDataBlocking(UART_0_INST, buffer[i]);
        }
    }
    
    int main(void)
    {
        SYSCFG_DL_init();
    
        DL_SYSCTL_setPowerPolicyRUN0SLEEP0();
    
        NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN);
        gCheckADC = false;
    
        calibration = (uint16_t)0x41c4003c;
    
        while (1) {
    
            DL_ADC12_enableConversions(ADC12_0_INST);
    
            __WFI();
    
            if(gCheckADC == true)
            {
    
                gAdcResult = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_0);
                sample++;
                len = sprintf((char*)asciiBuffer, "%d, %d\r\n", sample, gAdcResult);
                send(asciiBuffer,len);
                gCheckADC = false;
            }
        }
    }
    
    void ADC12_0_INST_IRQHandler(void)
    {
        switch (DL_ADC12_getPendingInterrupt(ADC12_0_INST)) {
            case DL_ADC12_IIDX_MEM0_RESULT_LOADED:
                gCheckADC = true;
                break;
            default:
                break;
        }
    }