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-EXPCC430RFX: The temperature is measured 64c by internal temperature sensor of cc430f5137!

Part Number: MSP-EXPCC430RFX

  The CAL_ADC_20T30=1029 ,CAL_ADC_20T85=1896. The temperature is calculated by the formula provided in datasheet IntDegC =(SavedADC12MEM0-CAL_ADC_20T30)*((85-30)/(float)(CAL_ADC_20T85-CAL_ADC_20T30))+30; The IntDegC=64 when running the program.

#include "msp430.h"
#include "hal_adc.h" 

volatile signed int SavedADC12MEM0 = 0;
volatile unsigned long  SavedADC12MEM1 = 0;

volatile signed int IntDegC, IntDegF;
volatile unsigned long Vcc = 0;

unsigned char exit_active_from_ADC12 = 0;
int CAL_ADC_20T30, CAL_ADC_20T85;
float m = 0, c = 0;


// Workaround for ADC29 erratum. Manual 25C [RoomTemp] calibration for 
// temp sensor to replace faulty 30C Cal value.
//--ADC software temperature calibration constant, workaround for ADC27 erratum 
//  regarding faulty temperature calibration constant, is stored in INFOB

// Perform manual SW calibration if the default cal value is faulty

#ifdef __TI_COMPILER_VERSION__
// If CCS compiler is used
#pragma DATA_SECTION(adcTemp25Calibration, ".infoB");
int adcTemp25Calibration;

#elif __IAR_SYSTEMS_ICC__
// If IAR compiler is used
#define INFOB _Pragma("location=\"INFOB\"")
INFOB __no_init int adcTemp25Calibration;
#endif

/**********************************************************************//**
 * @brief  Turns on and initializes ADC12 in order to 
 *         sample temperature, Vcc
 * 
 * @param  none
 * 
 * @return none
 *************************************************************************/
void HalAdcInit(void)
{  
  //Sequence of channels, once, ADC12CLK=MODOSC    
  UCSCTL8 |= MODOSCREQEN;
  REFCTL0 &= ~REFVSEL_3;
  REFCTL0 |= REFVSEL_1 + REFON;                  // Configure internal 2.5V reference
  __delay_cycles(1900);                          // delay for reference to settle                      

  ADC12CTL0 &= ~ADC12ENC;                        // Ensure ENC is clear
  ADC12CTL0 = ADC12ON + ADC12SHT0_15 + ADC12MSC;  
  ADC12CTL1 = ADC12SHP + ADC12CONSEQ_1 + ADC12SSEL_0;  
  ADC12CTL2 = ADC12RES_2;
  ADC12MCTL0 = ADC12SREF_1 + TEMP_CHANNEL;
  ADC12MCTL1 = ADC12SREF_1 + VCC_CHANNEL + ADC12EOS;
  ADC12IE = 0x00;    
 
  CAL_ADC_20T30 = (*(int *)0x01A1E); //ADC temp calibration consts for 2.0V ref
  CAL_ADC_20T85 = (*(int *)0x01A20); 
     
  if ( ((unsigned int)adcTemp25Calibration) == 0xFFFF  )
  {
    m = (85-30)/(float)(CAL_ADC_20T85 - CAL_ADC_20T30); //calculate the slope
    c = 85 - m*CAL_ADC_20T85;
  }
  else
  {
    // Calculate slope for 25C room temp 
    //CAL_ADC_20T30 = adcTemp25Calibration;
    m = (85-25)/(float)(CAL_ADC_20T85 - adcTemp25Calibration); //calculate the slope
    c = 85 - m*CAL_ADC_20T85;  
  }                 
}



/**********************************************************************//**
 * @brief  Return light sensor sampled value in degree Celsius 
 * 
 * @param  none
 * 
 * @return lightSensorValue     light sensor ADC sampled value
 *************************************************************************/
 
int HalAdcGetTempRaw(void)
{
  return SavedADC12MEM0;   
} 

/**********************************************************************//**
 * @brief  Return light sensor sampled value in degree Celsius 
 * 
 * @param  none
 * 
 * @return lightSensorValue     light sensor ADC sampled value
 *************************************************************************/
unsigned long HalAdcGetTempDegC(void)
{
  return IntDegC;  
}

/**********************************************************************//**
 * @brief  Return light sensor sampled value in degree Fahrenheit
 * 
 * @param  none
 * 
 * @return lightSensorValue     light sensor ADC sampled value
 *************************************************************************/
unsigned long HalAdcGetTempDegF(void)
{
  return IntDegF;  
}
/**********************************************************************//**
 * @brief  Return light sensor sampled value 
 * 
 * @param  none
 * 
 * @return lightSensorValue     light sensor ADC sampled value
 *************************************************************************/
unsigned long HalAdcGetVcc(void)
{
  return Vcc;  
}
/**********************************************************************//**
 * @brief  Turns off / disable the ADC12. 
 * 
 * @param  none
 * 
 * @return none
 *************************************************************************/
void HalAdcShutDown(void)
{
  //Turn off ADC module and internal reference
  ADC12CTL0 &= ~ADC12ENC;
  ADC12CTL0 = 0x00;
  ADC12IE = 0x00;
  REFCTL0 &= ~REFON;        
}



/**********************************************************************//**
 * @brief  Converts the ADC readings into Vcc & Temp. 
 * 
 * @param  none
 * 
 * @return none
 *************************************************************************/
void HalAdcConvertTempVcc(void)
{
  IntDegF = 10*(SavedADC12MEM0*m + c) *((float)9/5) + 320;
  IntDegC = 10*(SavedADC12MEM0*m + c);  
  Vcc = (SavedADC12MEM1 * 40) >> 12;  
}

/*----------------------------------------------------------------------------*/
/**********************************************************************//**
 * @brief  Starts the ADC conversion.
 * 
 * @param  none
 * 
 * @return none
 *************************************************************************/
void HalAdcStartRead(void)
{
  ADC12IFG = 0x00;                          // Clear all ADC12 channel int flags 
  REFCTL0 |= REFON;               // Turn on ADC12 reference         
  __delay_cycles(1900);                   // delay for reference to settle
  ADC12IE = BIT1;                         // Enable memory 1 interrupt
  ADC12CTL0 |= ADC12ENC | ADC12SC ;       // Start conversion  
}
/**********************************************************************//**
 * @brief  Sets the flag that causes an exit into active CPU mode from 
 *         the ADC12 ISR.
 * 
 * @param  quit 
 * 
 * - 1 - Exit active from ADC12 ISR
 * - 0 - Remain in LPMx on exit from ADC12ISR
 * 
 * @return none
 *************************************************************************/
void HalAdcSetQuitFromISR(unsigned char quit)
{
  exit_active_from_ADC12 = quit;  
}

/*----------------------------------------------------------------------------*/
#pragma vector=ADC12_VECTOR
__interrupt void ADC12_ISR(void)
{


  ADC12CTL0 &= ~ADC12ENC;                 // Disable ADC12 conversions
  REFCTL0 &= ~REFON;                      // Disable reference (if enabled)     
    
  SavedADC12MEM0 = ADC12MEM0;             // Store the sampled data 
  SavedADC12MEM1 = ADC12MEM1;  
  
    if (exit_active_from_ADC12) 
      __bic_SR_register_on_exit(LPM3_bits);

   
}