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.

[参考译文] MSP-EXP430FR2311-design-files:温度传感器读数不正确

Guru**** 2782445 points

Other Parts Discussed in Thread: LM35, MSP-EXP430G2ET, MSP430G2553

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1618352/msp-exp430fr2311-design-files-incorrect-reading-of-a-temperature-sensor

器件型号:MSP-EXP430FR2311-design-files
主题中讨论的其他器件: LM35MSP-EXP430G2ETMSP430G2553

 
 
 
您好!
我将使用 MSP-EXP430G2ET 开发板和 M430G2553 微控制器。 我有一个 LM35 温度传感器、我想使用 10 位 ADC 在微控制器的引脚 3 上接收传感器的电压。 然后、我需要将该电压转换为温度并在串行终端(石墨)上显示该数据。 根据传感器的数据表、每个摄氏度对应于 10mV(即 10mV/°C)。 传感器的 VCC 为 3.3V、ADC 的基准电压也为 3.3V。 当我转换温度数据时、值​​约为 3.04、而我要在串行端口上显示温度的格式类似于“20.05"。“。 我已经检查了电缆、连接和传感器、但仍然显示不正确的值。 我甚至检查了转换,但我找不到错误。 您能指导我解决这个问题吗?
 
此致、Mayra
 P.S.抱歉、我的 TI 器件型号不匹配;在列表中找不到开发板。  
#include <msp430.h>

volatile unsigned int VT=0;
float Vin=0.0;

char buffer[20];
unsigned int temp_entera;
unsigned int temp_decimal;
unsigned int temp_x100=0;
//LPM0 = Lower Power Mode 0

//------------------------------------------------------------------------------
//                                  FUNCIONES
//--------------------------------------------------------------------------
void UART_CONFIG(void)
{
 if (CALBC1_1MHZ==0xFF)                 // If calibration constant erased
  {
    while(1);                               // do not load, trap CPU!!
  }
  DCOCTL = 0;                               // Select lowest DCOx and MODx settings, DCOx=0 MODx=0
  BCSCTL1 = CALBC1_1MHZ;                    // Configura el DCO en 1MHz, selecciona el rango de operación del DCO
  DCOCTL = CALDCO_1MHZ;                     // Ajuste fino del DCO para ~1 MHz  DCOx MODx calibrados
  P1SEL = BIT1 + BIT2 ;                     // Configura la funcion especial de UART para P1.1 = RXD y P1.2=TXD
  P1SEL2 = BIT1 + BIT2 ;                    // Configura la funcion especial de UART para P1.1 = RXD y P1.2=TXD
  UCA0CTL1 |= UCSWRST;                      // UCSWRST = 0, UART en reset
  UCA0CTL1 |= UCSSEL_2;                     // usa SMCLK (referencia de los perifericos) (pone en uno el bit de UCSSEL_2)
  UCA0BR0 = 104;                            // 1MHz 9600
  UCA0BR1 = 0;                              // 1MHz 9600
  UCA0MCTL = UCBRS0;                        // Modulation UCBRSx = 1 ajusta el baudrate
  UCA0CTL1 &= ~UCSWRST;                     // UCSWRST = 0 inicializa la maquina de estados para UART en el USCI, UART empieza a funcionar
//  IE2 |= UCA0RXIE;                        // habilita la interrupción de recepción
}

void ADC_CONFIG(void)
{

    ADC10CTL0 &= ~ENC;                 //Deshabilita el ADC para poder cambiar su configuración (ENC = 0)
    ADC10CTL0 = ADC10SHT_2 + ADC10ON;  //Configura el muestreo del ADC a 16 ciclos + enciende el ADC
    ADC10CTL1 = INCH_3;                // Selecciona el canal del ADC a usar, en este caso A3 = P1.3
    ADC10AE0 |= 0x08;                  // habilita el pin como entrada analógica
    ADC10CTL0 |= ENC + ADC10SC;        //Habilita el ADC + empieza una conversión
}


void serial_in(const unsigned char data) //Envia por UART un dato a la vez
{
    while (!(IFG2&UCA0TXIFG));
    UCA0TXBUF = data;
}


void send_uint(unsigned int n) //convierte un dato en caracter y lo envía por UART
{
    char buf[6];
    int i = 0;

    if (n == 0)
    {
        serial_in('0');
        return;
    }

    while (n > 0)
    {
        buf[i++] = (n % 10) + '0';
        n /= 10;
    }

    while (i--)
        serial_in(buf[i]);
}

//------------------------------------------------------------------------------
//                          MAIN
//---------------------------------------------------------------------------



int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  UART_CONFIG();
  ADC_CONFIG();
  unsigned long aux;

  while(1)
  {
           ADC10CTL0 |= ADC10SC;            // inicia conversión
      while (ADC10CTL1 & ADC10BUSY);   // espera a que termine
      VT = ADC10MEM;                   //el valor del ADC se guarda en la variable VT

      Vin=(VT/1023)*(3.3);

      temp_entera  = Vin / 10;       //divide el valor de VT entre 10 para obtener la      parte entera de la temperatura
      temp_decimal = Vin % 10; // obtiene el residuo de la división entera de VT entre 10

      send_uint(temp_entera);
      serial_in('.');
      if (temp_decimal < 10) serial_in('0');
      send_uint(temp_decimal);
      serial_in('\r');              //retorno de carro
      serial_in('\n');              //salto de linea


   }

}


//------------------------------------------------------------------------------
//                          ISR
//---------------------------------------------------------------------------

/*
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
    __bic_SR_register_on_exit(LPM0_bits);
}
*/
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    >   Vin=(VT/1023)*(3.3);

    1) VT is always <= 1023, so integer arithmetic says VT/1023=0.

    2) You're computing volts, but your later arithmetic assumes millivolts.

    Try instead:

     Vin=(VT/1023.0)*(3300.0); // millivolts

    ----- 

     if (temp_decimal < 10) serial_in('0');

    temp_decimal is always <10, so this incorrectly inserts a spurious '0'. You can just remove this line.

    -----

    [Your part number is MSP430G2553; the marking on the chip leaves out a few of the characters.]

    [编辑: 尝试解决论坛“错误“。]

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

    你好

    我测试了变化,现在温度读数为 43.00 度,我甚至尝试在它附近保持一个较轻的约 20 秒,但没有变化。

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

    您是否阅读过 LM35 的数据表? 最低电源电压为 4V。您应该在 LaunchPad 上提供 5V 电压来为其供电。

    在任何情况下、解决此类问题的方法都是“引导 MCU“ 、首先假设 LM35 具有正确的电压、逐步浏览程序中的每条语句、并确定 MCU 将执行的操作。使用调试器逐步执行、并验证是否正确。

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

    无需在浮点库中拖动。 整数就能发挥作用。

    (VT *330L)/1023 将以摄氏度为单位提供一个整数。如果要添加一个小数位、请使:

    (VT *3300L)/1023

    现在除以 10 和 mod (10) 位将起作用。

    需要一个 32 位 (long) 中间指令、但结果以 int 的形式表示。

    如果出现这种情况、则使用“*/"。“。  

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

    尊敬的 Mayra:

    Bruce、Keith 和 David 似乎提供了一些富有洞察力的建议。 我不熟悉 LM35、但 Keith 认为最低电源电压应为 4V 是正确的。

    调试时收到的 VT 的原始值是多少? 当您引入可变温度时、该值是否会发生变化?

    此致、

    Owen

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

    你好

    感谢您的建议。 我尝试将传感器的电源电压更改为 5V、并在 Vin 线路上添加一个小数点。 现在记录的温度是一个更合乎逻辑的值。 关于传感器的温度变化率、我仍然需要考虑一些细节、但就目前而言、​​我获得的值符合预期。

    此致

    Mayra

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

    关于 LM35 还需要注意的一点是、如果要测量低于 0°C 的温度、则需要提供负电压和 ADC 来测量负电压、而 MSP 则无法测量负电压。

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

    不需要负电压、只需将 LM35 的接地引脚偏移即可。 如数据表的图 18 中所示、它使用了两个二极管来解决这个问题。

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

    但您将需要超过 5V 的电压来为其供电。