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.

[参考译文] MSP430FR2355:温度传感器不可靠

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1321901/msp430fr2355-temperature-sensor-unreliable

器件型号:MSP430FR2355

我的温度传感器值非常不可靠(这些是我得到的温度值):
温度:30.0
温度:30.21
温度:32.59
温度:32.16
温度:27.83
温度:28.48
温度:31.72
温度:28.91
温度:32.59
温度:28.91
温度:32.8
温度:28.48
温度:30.0
温度:28.05
温度:28.05
温度:30.21
温度:27.83
温度:30.86
温度:29.78
温度:33.02
温度:31.29
温度:30.43
温度:32.8
温度:28.48
温度:29.78
温度:32.37
温度:28.27
温度:30.86
温度:31.29
温度:30.43
温度:30.64
温度:30.21
温度:29.56
温度:29.13
温度:28.7
温度:27.83
温度:28.05
温度:33.24
温度:30.64
温度:30.0
温度:32.59
温度:27.62
温度:29.56
温度:29.13
温度:31.51
温度:28.05
温度:27.83
温度:29.13
温度:29.56
温度:27.62

您可以看到、温度传感器的值会像疯狂的一样跳动。 我已经尝试了很多解决方案、包括增加采样保持时间、改变时钟、减少采样保持时间、始终保持唤醒状态而不是进入 LPM3模式。 我看了所有的示例代码、但仍然没有运气。 使用相同的确切代码、由于温度传感器精度低于1°C、开发板的性能提高了10倍。 温度传感器如此不可靠是有原因吗? 以下是我使用的代码。

//将温度转换为摄氏度
空转换 TempToDegC()
{
DEG =(CurrentTemperature -((float)(CALADC_25V_30C))* CAL_TEMP_BITS_PER_C + 30;
I2C.Temp = degC * 100;

//如果启用,则根据温度调整偏置
空可调温度偏置()
{
ConvertTempToDegC();

if (I2C.Control.TemperatureEnable){
SetTempBiasAdjustment();


//软启动模拟引脚配置
void SoftStartInit (void)
{
P1SEL0 |= BIT1;
P1SEL1 |= BIT1;

SAC0DAC = DACSREF_1;//选择 int Vref 作为 DAC 基准
SAC0DAT = 0x00;
SAC0DAC |= DACEN;//启用 DAC
SAC0OA = NMUXEN + PMUXEN + PSEL_1 + NSEL_1;//选择正负引脚输入
SAC0OA |= OAPM;//选择低速和低功耗模式
SAC0PGA = MSEL_1;//将 OA 设置为缓冲模式
SAC0OA |= SACEN + OAEN;//启用 SAC 和 OA

//计时器配置
空 TimerInit (空)
{
TB0CCTL0 |= CCIE;// TBCCR0中断已启用
TB0CCR0 = 539/20;
TB0CTL = TBSSEL__ACLK | MC__UP;// ACLK、向上计数模式

//温度/ADC 配置
空 TemperatureInit (void)
{
//配置 ADC -脉冲采样模式;ADCSC 触发器
ADCCTL0 |= ADCSHT_8 | ADCON;// ADC 开启,温度采样周期>30us
ADCCTL1 |= ADCSHP | ADCSSEL0;// s/w 触发、单通道/转换、MODOSC
ADCCTL2 &=~ADCRES;//清除 ADCCTL 中的 ADCRES
ADCCTL2 |= ADCRES_2;// 12位转换结果
ADCMCTL0 |= ADCSREF_1 | ADCINCH_12;// ADC 输入通道 A12 =>温度感应
ADCIE |=ADCIE0;//启用完成 ADC_B 转换的中断请求

CAL_TEMP_BITS_PER_C =((float)(105 - 30))/((float)(CALADC_25V_105C - CALADC_25V_30C));


int main (空)
{

WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

//根据 MCLK 的器件数据表需要配置一个 FRAM 等待状态
//在配置时钟系统之前8MHz 之外的操作。
FRCTL0 = FRCTLPW | NWAITS_1;

__ bis_SR_register (SCG0);//禁用 FLL
CSCTL3 |= SELREF__REFOCLK;//将 REFO 设置为 FLL 基准源
CSCTL1 = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_5;// DCOFTRIM = 5、DCO 范围= 16MHz
CSCTL2 = FLLD_0 + 121;// DCOCLKDIV = 4MHz
__delay_cycles (3);
__BIC_SR_register (SCG0);//启用 FLL

CSCTL4 = SELMS__DCOCLKDIV | SELM__REFOCLK;//将默认 REFO (~32768Hz)设置为 ACLK 源、ACLK = 32768Hz
//默认的 DCOCLKDIV 作为 MCLK 和 SMCLK 源
SoftStartInit ();
TimerInit();
TemperatureInit();

PMMCTL0_H = PMMPW_H;//解锁 PMM 寄存器
PMMCTL2 = INTREFEN | REFVSEL_2 | TSENSOREN;//启用内部2.5V 基准
while (! (PMMCTL2 & REFGENRDY){};//轮询至内部基准电压稳定

TI_USCI_I2C_slaveinit (START_CB、TRANSMIT_CB、RECEIVE_CB、0x48);//初始化从器件

PM5CTL0 &=~μ A LOCKLPM5;

_ bis_SR_register (LPM3_bits | GIE);//进入低功耗模式

while (1){

IF (WakeReason. TimerB){
可调温度偏置();
WakeReason。 TimerB = 0;

_bis_SR_register (LPM0_bits);//进入低功耗模式

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

    进行这些测量的时间段内?

    使用"dev board"时、您是指 LaunchPad 吗?

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

    这些测量是每秒进行一次的、是的、我的意思是、

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

    有一些问题、对于我的代码、我知道 LPM3应该是 LPM0、但我只是尝试不同的方式来解决问题、但它们无法正常工作。 因此、某些注释可能不准确,

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

    内部温度传感器的精度不高。 建议为结果或外部 NTC 添加一些数字滤波器。

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

    这不是 LaunchPad、那么电路板上是否有其他器件可能会引起偶尔的温度摆动?

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

    这里不谈精度、而谈可重复性。

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

    我实际上解决了这个问题、实际上是我是如何为电路板供电的、我把它连接到台式电源上、它现在可以正常工作、很可能是因为其他器件、偶尔会出现温度摆动。