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.

[参考译文] MSP432P401R:DriverLib示例:测量内部温度

Guru**** 2534260 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/579103/msp432p401r-driverlib-example-measuring-internal-temperature

部件号:MSP432P401R

我正在使用DriverLib ADC14示例,它测量我正在使用新的红色Launchpad的芯片内部温度:

/*******************************************************************************
* MSP432 ADC14 -单通道重复温度传感器
*
*说明:此示例显示了内部温度传感器的使用。
*使用软件触发器设置简单的连续ADC采样/转换。
*采样时间设置为TBD,如用户指南所示。 所有计算
*都在ISR中进行,ISR利用FPU的堆叠模式。
*温度以摄氏度和华氏度为单位计算。
*
** MSP432P401
* -----------
* /|\\| |
* || |
* --|RST 5.5 |
* | |
* | |
* | |
*
*作者:Timothy Logan
****************************************************************************** /*
DriverLib包括*/
#include "driverlib.h"

/*标准包括*/
#include <stdint.h>

#include <string.h>

volatile float tempC;
volatile float F;

int main(void){

/*正在停止WDT */
WDT_A_HoldTimer();
interrup_enableSleepOnIsrExit();

/*启用FPU并启用堆栈(用于ISR)*/
FPU_enableModule();
FPU_enableLazyStacking();

/*在温度传感器已布设的情况下初始化ADC (MCLK/1/1)*/
ADC14_enableModule();
ADC14_INITModule (ADC_CLOCKSOURCE_MCLK,ADC_PREDIVIDER_1,ADC_DIVIDER_1,
ADC_TEMPSENSEMAP);

/*重复配置ADC内存(ADC_MEM0 A22 (温度传感器)
*模式)。
*/
ADC14_configureSingleSampleMode (ADC_MEM0,TRUE);
ADC14_configureConversionMemory (ADC_MEM0,ADC_VREFPOS_AVCC_VREFNEG_VSS,
ADC_INPUT_A22,FALSE);

/*为TBD */配置采样/保持时间
ADC14_setSampleHoldTime (ADC_PULSE_WIDES_192,ADC_PULSE_WIDES_192);

/*在自动迭代模式下启用采样计时器并中断*/
ADC14_enableSampleTimer(ADC_AUTOMATICATE_IREDATE);
ADC14_enableInterrupt (ADC_INT0);

/*将参考电压设置为2.5 并启用温度传感器*/
ref_a_setReferenceVoltage (REF_A_VREF2_5V);
ref_a_enableReferenceVoltage();
ref_a_enableTempSensor();

/*启用中断*/
interrupT_enableInterrupt (INT_ADC14);
interrup_enableMaster();

/*触发样本开始*/
ADC14_enableConversion();
ADC14_toggleConversionTrigger();

/*进入睡眠状态*/
同时(1)
{
PCM_gotoLPM0();
}
}/*

每次转换完成时都会发生此中断。 由于FPU
*在堆栈模式下启用,我们能够安全地使用FPU来执行
*高效的浮点运算。*/
void ADC14_IRQHandler(void){

UINT64_t状态;
uINT32_t cal30,cal85;

状态= ADC14_getEnabledInterruptStatus();
ADC14_clearInterruptFlag (状态);

IF (状态和ADC_INT0)
{
cal30 = sysctl_getTempCalibrationConstant (sysctl_2_5V_REF,
sysctl_30_degrees_C);
cal85 = sysctl_getTempCalibrationConstant (sysctl_2_5V_REF,
sysctl_85_degrees_C);

tempC =(float)(((UINT32_t) ADC14_getResult (ADC_MEM0)- cal30)*(85 - 30))
/(cal85 - cal30)+ 30.0f;
tempF = tempC * 9.0f / 5.0f + 32.0f;
}

}

运行时,cal30 = 4702,cal85 = 5401,我的ADC读数约为3500。

首先:

如果有人测量的温度低于30 C,我认为您应该对所有int变量进行签名。 当我测量到一个巨大的温度时,我真的很困惑。 8^)

但是,即使在我修复后,我仍测量了大约-60C,这显然是不正确的。 我做错了什么?

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

    Keith

    最近发现此代码存在问题,已实施修复,并将很快发布到TI-Rex (TI资源浏览器)。  请尝试以下代码,如果仍有问题,请告诉我。


    /* -------------------------------------------- * MSP432驱动程序库- v4_00_00_11 *---------------------------------- * **--版权所有--,BSD,BSD *版权所有(c) 2017,Texas Instruments Incorporated *保留所有权利。 * ** 允许以源代码和二进制格式重新发布和使用,无论是否进行*修改,只要 满足以下条件*: * ****重新发布源代码必须保留上述版权 *声明,此条件列表和以下免责声明。 * ***以二进制格式重新分发时,必须在 随分发提供的*文档和/或其他材料中复制上述版权*声明,此条件列表和以下免责声明。 * *** 未经事先书面许可,不得使用德州仪器(TI)公司的名称或*其贡献者的名称来支持或促销由本软件衍生的产品*。 * *本软件由版权所有者和贡献者"按原样"提供 *, 不提供任何明示或暗示的担保,包括但不限于*对适销性和特定*用途适用性的暗示担保。 在任何情况下,版权所有者或 *贡献者均不对任何直接,间接,附带,特殊, *示范, 或后果性损害(包括但不限于 *购买替代商品或服务;使用,数据或利润损失; (*或业务中断),但根据任何责任理论 ,*无论是合同,严格责任还是侵权行为(包括疏忽或 *其他),均因使用本软件而导致* ,即使已被告知此类损害的可能性。 -/copyright--*//******************************************************************************************************* * MSP432 ADC14 -单通道重复温度传感器 * *说明:此示例显示了内部温度传感器的使用。 *使用软件触发器设置简单的连续ADC采样/转换。 *采样时间设置为TBD,如用户指南所示。 所有计算 *都在ISR中进行,ISR利用FPU的堆叠模式。 *温度以摄氏度和华氏度为单位计算。 * ** MSP432P401 * ----------- * /|\\| | * || | * --|RST 5.5 | * | | * | | * | | * *作者:Timothy Logan ****************************************************************************** /* DriverLib包括*/ #include <ti/devices/msp432p4xx/driverlib/driverlib.h>/* Standard包括*/ #include <stdint.h> #include <string.h> volatile UINT32_t cal30; volatile UINT32_t cal85; volatile float calDifference; volatile tempfloat C; int main (void) { /*正在停止WDT */ WDT_A_HoldTimer(); interrup_enableSleepOnIsrExit(); /*启用FPU并启用堆栈(用于ISR)*/ FPU_enableModule(); FPU_enableLazyStacking(); /*在温度传感器已布设的情况下初始化ADC (MCLK/1/1)*/ ADC14_enableModule(); ADC14_INITModule (ADC_CLOCKSOURCE_MCLK,ADC_PREDIVIDER_1,ADC_DIVIDER_1, ADC_TEMPSENSEMAP); /*重复配置ADC内存(ADC_MEM0 A22 (温度传感器) *模式)。 */ ADC14_configureSingleSampleMode (ADC_MEM0,TRUE); ADC14_configureConversionMemory (ADC_MEM0,ADC_VREFPOS_INTBUF_VREFNEG_VSS, ADC_INPUT_A22,FALSE); /*配置192的采样/保持时间*/ ADC14_setSampleHoldTime (ADC_PULSE_WIDES_192,ADC_PULSE_WIDES_192); /*在自动迭代模式下启用采样计时器并中断*/ ADC14_enableSampleTimer(ADC_AUTOMATICATE_IREDATE); ADC14_enableInterrupt (ADC_INT0); /*将参考电压设置为2.5 并启用温度传感器*/ ref_a_enableTempSensor(); ref_a_setReferenceVoltage (REF_A_VREF2_5V); ref_a_enableReferenceVoltage(); cal30 = sysctl_getTempCalibrationConstant (sysctl_2_5V_REF, sysctl_30_degrees_C); cal85 = sysctl_getTempCalibrationConstant (sysctl_2_5V_REF, sysctl_85_degrees_C); CalDifference = cal85 - cal30; /*启用中断*/ interrupT_enableInterrupt (INT_ADC14); interrup_enableMaster(); /*触发样本开始*/ ADC14_enableConversion(); ADC14_toggleConversionTrigger(); /*进入睡眠状态*/ 同时(1) { PCM_gotoLPM0(); } }/* 每次转换完成时都会发生此中断。 由于FPU *在堆栈模式下启用,我们能够安全地使用FPU来执行 *高效的浮点运算。*/ void ADC14_IRQHandler(void){ UINT64_t状态; Int16_t conRes; 状态= ADC14_getEnabledInterruptStatus(); ADC14_clearInterruptFlag (状态); IF (状态和ADC_INT0) { conRes =(ADC14_getResult (ADC_MEM0)- cal30)* 55); tempC =(conRes / calDifference)+ 30.0f; tempF = tempC * 9.0f / 5.0f + 32.0f; } }

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

    由于cal30和ADC14结果是无符号的,因此以下结果:
    conRes =(ADC14_getResult (ADC_MEM0)- cal30)* 55);

    如果ADC结果小于cal30 (如我的情况),则仍将是一个较大的数字。

    据我所了解,唯一的改变是更改REF_A_enableTempSensor()的顺序,并将cal30和cal85从ISR中移出。 如果我仍然获得相同的值,我仍然有相同的问题,我是否可以使用新代码获得不同的值?

    计算30,计算85和ADC读数得到什么值?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Keith

    我看到Tempo C的21.5 和Tempo F的70.7 结果,这在我当前的环境中似乎是准确的(室温约为70 F)。

    使用以前的版本(直接从TI-Rex下载),我得到了非常错误的值,例如TempC的642.9519万.5 和TempF的1157.3167万.0。

    我们看到的是相同的问题还是单独的问题?

    这是您所指的代码,是吗? 代码链接。

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

    是的,这就是代码。

    巨大的数字是使用无符号的Ints进行减影的结果。 我想您通过乘以(带符号的int) 55来解决问题,结果将被签名,而转换为float时输出正常。 您仍然过于依赖C标准,恕我直言。 我认为,每当您使用负数时,您都应该使用签名的输入,这就是它们的目的!

    假设你的cal85和cal30数字接近我的数字,你必须得到大约4594的ADC14读数,这是有意义的。 我得到了大约3500个,或者1000个计数,结果是-64C

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

    感谢您对未签名和已签名int的建议。

    您是否也在室温下进行测试? 你的ADC14读数比我的低得多是对的。

    您能否查看该设备并判断其是否显示为MSP432P401R或XMS432P401R?  我想一下为什么您会得到这些较低的价值。

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

    该芯片标记为:69ALKGW64 MSP432P401R Rev C

    我在室温下。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在上面使用了您的代码,它很有效。 我看不出有什么不同,所以现在它会一直困扰我,直到我找到它。 8^)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    最重要的变化似乎是以下行: ADC14_configureConversionMemory (ADC_MEM0,ADC_VREFPOS_AVCC_VREFNEG_VSS,ADC_INPUT_A22,FALSE);其中,对于VREFPOS,INTBUF已从AVCCC更改为。

    我运行了旧版本,然后只更改了一行(AVCC变为INTBUF),看到了你所说的ADC14MEM0寄存器显示~3600的不同之处,然后在进行更改后跳到~4500。

    此外,还像获取cal30和cal85值的获取指令以及只需一次完成的一些数学运算从ISR中删除;这是减轻ISR内负载的好做法。

    希望这能有所帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您为我做的工作! 现在我可以睡个好觉。