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.

[参考译文] MSP432E401Y:引脚 G2/PE3上的低电压/GND 会导致内部温度传感器值不准确

Guru**** 655270 points
Other Parts Discussed in Thread: MSP432E411Y, MSP-EXP432E401Y, SYSCONFIG
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1134505/msp432e401y-low-voltage-gnd-on-pin-g2-pe3-causes-inaccurate-internal-temperature-sensor-values

器件型号:MSP432E401Y
主题中讨论的其他器件:MSP-EXP432E401YMSP432E411YMSP432E411Y-BGAEVMSysConfig

当对引脚 G2/PE3施加低电压时、我会看到奇怪的内部温度传感器值。 我最初在我们的 MSP432E411Y 定制板上观察到异常高的温度值、该定制板使用引脚 G2的 AIN0功能、并且通常对其施加低电压。 我已大力调试这一点、以便使用 MSP-EXP432E401Y 开发 套件红色 PCB (我还使用 MSP432E411Y-BGAEVM 开发套件红色 PCB 生成了这种行为)通过以下配置重现:

-从 adcbuftemperature_MSP_EXP432E401Y_tirtos_ccs 示例项目开始

-使用 SysConfig 添加 名为 CONFIG_GPIO_PE3的 GPIO 配置、使用硬件:无、模式:输出、输出类型:标准、 输出强度:中等、  初始输出状态:低电平、 拉电流:无、 GPIO 引脚:PE3/26 (接头)

-在代码中添加"GPIO_TOGGLE (CONFIG_GPIO_PE3);"行、如下所示

void adcBufCallback(ADCBuf_Handle handle, ADCBuf_Conversion *conversion,
    void *completedADCBuffer, uint32_t completedChannel, int_fast16_t status) {
    uint_fast16_t i;
    uint16_t *rawTemperatureBuf = (uint16_t *) completedADCBuffer;

    avgTemperature = 0;

    /* Calculate average temperature */
    for (i = 0; i < ADCSAMPLESIZE; i++) {
        avgTemperature += rawTemperatureBuf[i];
    }
    avgTemperature = avgTemperature/ADCSAMPLESIZE;

    /* Convert ADC value to Celsius */
    avgTemperature = (1475*4096 - (75 * 33 * avgTemperature))/ 40960;

    GPIO_toggle(CONFIG_GPIO_PE3);  // Add this line
    
    /* post adcbuf semaphore */
    sem_post(&adcbufSem);
}

-按 DEV 套件按钮0并观察 UART 上的结果:

启动 ADCBuf 温度示例
平均温度为37.9981C
平均温度为16.3721C
平均温度为37.8894C
平均温度为16.4114C
平均温度为38.0283C
平均温度为16.0790C
平均温度为37.6718C
平均温度为16.1032C

类似地、在 SysConfig 中不配置引脚 PE3 (即该引脚将处于默认三态)、并将一根导线从 PE3接头连接到 GND 接头引脚:

启动 ADCBuf 温度示例
平均温度为28.6927C
平均温度为28.6474C
平均温度为28.7380C
平均温度为28.5416C
平均温度为28.3271C
平均温度为28.2184C
平均温度为28.2184C
平均温度为38.1643C
平均温度为38.0616C
平均温度为38.0857C
平均温度为38.2761C
平均温度为38.3002C

我已经严格梳理了 ADCBuf 的 SDK 驱动程序代码、但我找不到任何会导致这种情况的东西。 此外、我已在另一个测试中将引脚 G1\PE2、A5\PE4、K1\PK2、A8\PP7和 A7\PE6 (这些引脚也在我们的定制板上配置为 AIN 引脚)配置为 GPIO 输出、这些不会影响温度传感器读数。 此外、我发现 如果引脚上有逻辑高电压、它会报告准确的温度值。

我注意到 SLAZ709的勘误 ADC #13影响引脚 G2\PE3、但没有提到与内部温度传感器的关系。 这可能是未知的芯片勘误表、还是存在软件问题?

感谢您的帮助、

Steve

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

    您好、Steve、

     MSP432E MCU 与 TM4C129 MCU 采用相同器件。 对于 TM4C129、对于温度传感器的不准确读数、下面的说明中有一个勘误表。 我不知道为什么没有针对 MSP432E 提及此勘误表。 您能否浏览勘误表并应用解决方法? 我认为它应该解决这个问题。  

    您可以在 https://www.ti.com/lit/pdf/spmz850上找到 TM4C129x 的完整勘误文档。  

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

    您好、Charles、

    感谢您的快速且乐于助人的回答。 我知道这一点、正如 MSP432 TRM SLAU732A 中的内部温度传感器第10.3.6节所述。 我在我的定制板上实施了修复、但没有看到值变化、因此我没有在开发套件设置中尝试过它。 我现在已按如下方式更改了 adcBufTemperature 示例项目:

    -将 SDK 文件 .\simplelink_msp432e4_sdk_4_20_00_12\sources\ti\devices\msp432e4\driverlib\adc.c 复制到项目中
    -对 ADC.c 文件中复制的内容进行以下修改(我确定可以更巧妙地设置 SSTH 寄存器、但这对我所知的测试非常有效;我已验证它是否更改了调试器中的寄存器值)

    /* SteveT edits start */
    #include <ti/devices/msp432e4/inc/msp432e411y.h>
    // #include "types.h"
    #include <stdbool.h>
    #include <stdint.h>
    //#include "inc/hw_adc.h"
    //#include "inc/hw_sysctl.h"
    //#include "adc.h"
    //#include "debug.h"
    //#include "interrupt.h"
    #include <ti/devices/msp432e4/driverlib/types.h>
    #include <ti/devices/msp432e4/driverlib/inc/hw_adc.h>
    #include <ti/devices/msp432e4/driverlib/inc/hw_sysctl.h>
    #include <ti/devices/msp432e4/driverlib/adc.h>
    #include <ti/devices/msp432e4/driverlib/debug.h>
    #include <ti/devices/msp432e4/driverlib/interrupt.h>
    /* SteveT edits end */
    
    ...
    
    (Inside the ADCSequenceStepConfigure function)
        //
        // Set the sample and hold time for this step.
        //
        /* SteveT edits start*/
        if((ui32Config & ADC_CTL_TS) == ADC_CTL_TS)
        {
            HWREG(ui32Base + ADC_SSTSH) = 4;
        }
        else
        {
            HWREG(ui32Base + ADC_SSTSH) = ((HWREG(ui32Base + ADC_SSTSH) &
                                        ~(0x0000000f << ui32Step)) |
                                    (((ui32Config & 0xf00000) >> 20) << ui32Step));
        }
        /* SteveT edits end*/

    -此外、从 adcBufTemperature.c 中 adcBufCallback 函数中的平均值计算循环中删除前两个结果(根据 MSP432勘误 ADC#14和您提供的勘误表)。 添加此更改实际上会导致值出现10摄氏度的差异(在未编辑的情况下大约为30C、在中大约为40C)。  

        /* SteveT edits start */
        /* Calculate average temperature */
        for (i = 2; i < ADCSAMPLESIZE; i++) {
            avgTemperature += rawTemperatureBuf[i];
        }
        /* SteveT edits end */

    我现在确实看到、对于我先前报告的两种情形、值都不会跳转。 但它始终大约为40摄氏度。测试结果如下:

    (切换 GPIO 线路)
    启动 ADCBuf 温度示例
    平均温度为39.3788C
    平均温度为40.1492C
    平均温度为39.7686C
    平均温度为40.4272C
    平均温度为39.5118C
    平均温度为40.4906C
    平均温度为39.8260C
    平均温度为40.5783C
    平均温度为39.7656C
    平均温度为40.3940C
    平均温度为40.4483C
    平均温度为41.5390C

    (将 GND 连接到三态引脚 PE3)
    启动 ADCBuf 温度示例
    平均温度为42.3487C
    平均温度为42.4726C
    平均温度为42.4998C
    平均温度为42.4545C
    平均温度为42.5541C
    平均温度为42.3336C
    平均温度为42.5360C
    平均温度为42.5692C
    平均温度为42.3729C
    平均温度为42.4635C
    平均温度为42.5209C
    平均温度为42.5390C
    平均温度为42.5179C

    (三态配置、风扇通过芯片吹冷空气)
    平均温度为41.1160C
    平均温度为41.1191C
    平均温度为41.1614C
    平均温度为41.0133C
    平均温度为41.1765C
    平均温度为41.1372C
    平均温度为41.0798C
    平均温度为40.2822C
    平均温度为40.2520C
    平均温度为40.1462C
    平均温度为40.2490C
    平均温度为39.9106C
    平均温度为40.1251C
    平均温度为40.1100C
    平均温度为39.8834C

    我将 在大约25°C 的环境温度下进行测试、我使用 IR 温度计测量了 MSP432芯片的外部外壳温度、该温度约为28°C。 内部裸片温度是否真的应该这么高?

    谢谢、

    Steve

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

    您好!

     我认为这很有可能。 我建议您吹一些热气或冷空气、以查看温度传感器值是否发生变化。  

     我们可以对结温有一些了解。 请参见下面的。 TJ = Ta +(P * ThetaJA)。 ThetaJA 为44.2 C/W 假设您在某些外设处于打开状态时以120MHz 运行。 在此工作条件下、您可能会消耗40mA 的电流。  请参阅数据表中的功耗表。 P = V*I = 3.3*40 = 0.13W。 TJ = 25 +(0.13 * 44.2)= 31C。 如果您在运行时一切都处于打开状态、则120MHz 时的电流消耗可能高达100mA。 您将看到25 +(0.33 * 44.2)= 39C。 我不知道您在运行什么外设。 但结温有可能并且预计会高于环境温度。  

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

    您好、Charles、

    我做了更多的测试并意识到由于新的循环值、我的平均计算中有一个错误、因此我在代码中更正了该错误、同时也忽略了前4个样本、以安全地遵循 MSP432E4勘误表 ADC#14:

        /* SteveT edits start */
        /* Calculate average temperature */
        for (i = 4; i < ADCSAMPLESIZE; i++) {
            avgTemperature += rawTemperatureBuf[i];
        }
        avgTemperature = avgTemperature/(ADCSAMPLESIZE-4);
        /* SteveT edits end */

    我将电源连接到  MSP432E411Y-BGAEVM 开发套件上的3.3V 输入、并观察到电路板在运行 adcboftemperature 项目时拉取40mA。 在某种程度上、请注意、这会将温度传感器值降低大约10摄氏度。我不确定为什么会发生这种情况、但我怀疑器件上的任一压降(这将受到平均温度传感器计算\转换的影响) 或者可能是有噪声的电源以及不够去耦。 在这种情况下、当5V 输入与板载3.3V 稳压器一起使用时、似乎可以正常工作。

    我发现 、在 MSP432E4 TRM 的表5.14热阻特性中、Theta-JA 为39.3、因此两个开发套件都报告了使用上述代码变化时的预期值约为30°C。

    我碰巧可以使用热处理室、因此  每3秒修改一次代码以打印当前温度传感器值(即不再需要按下按钮)、然后在25°C 至15°C 的温度范围内运行 MSP-EXP432E401Y 开发套件。 并看到随着环境温度的变化而跟踪的值。

    但是、我的定制板仍在30°C 的温度下开始工作、在一分钟内上升到40°C、并且稍高一些。 因此、我在 MSP432E4的外壳上连接了一个热电偶、发现外壳温度实际上比预期的温度传感器值低1-2摄氏度。 因此、我的红外温度计没有提供准确的读数、MSP432411Y 似乎从电路板吸收了大量热量(使用热电偶测得的热量比外壳温度低大约4度)、但现在提供了准确的热传感器读数。

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

    您好、Steve、

     很高兴看到您解决了这个问题。