Quantcast
Channel: MSP 低功耗微控制器论坛 - 最近的话题
Viewing all articles
Browse latest Browse all 3634

MSP430F5438A ADC片内温度读取设置及转化公式

$
0
0

以下程序是MSP430F5438A ADC片内温度传感器的配置及读取函数,不知道读取的ADC_CH10数值误差大不大,想知道片内温度转化公式,希望有知道的大神帮忙解决一下,谢谢!!!附上以下代码,代码中的公式用在149是可以的,5438A应该是其他公式??

#include "Adc12_Temp.h"

u16 results[5]={0};
/********************************************
函数名称:ADC12初始化函数
功能:    
输入:    无
输出:    无
备注:    REFCTL0 |= REFMSTR+REFVSEL_2+REFON+REFTCOFF必须要加
********************************************/
void Adc12_Init()
{
  u8 i;
  P6SEL |= BIT0+BIT1+BIT2+BIT3;                    // 使能ADC功能
  ADC12CTL0 &= ~ADC12ENC;                          // 使能转换
  REFCTL0 |= REFMSTR+REFVSEL_2+REFON;              //使能REF管理,内部参考电压选择2.5v、打开内部参考电压
  ADC12CTL0 = ADC12SHT0_8+ADC12MSC+ADC12REF2_5V+ADC12REFON+ADC12ON;
                                                   //ADC12SHT0_8:采样周期256(2的8次方)
                                                   //ADC12MSC:首次转换需要SHI信号的上升沿出发采样定时器,
                                                   //以后每次转换在前一次转换结束后立即进行
                                                   //ADC12REF2_5V:选择2.5V内部参考电压
                                                   //ADC12REFON:开启内部参考电压
                                                   //ADC12ON:开启ADC12内核 
  ADC12CTL1 = ADC12CSTARTADD_0+ADC12SHP+ADC12CONSEQ_3;   
                                                   //CSTARTADD_0:单次转换起始地址或序列转换的首地址
                                                   //ADC12CSTARTADD_x表示把转换结果存储在ADC12MEMx中
                                                   //转换地址为ADC12MCTLx,转换使能为ADC12IE = BITx
                                                   //ADC12SHP:SAMPCON信号来自采样定时器,由采样输入信号的上升沿触发
                                                   //ADC12CONSEQ_3:序列通道重复转换模式
  ADC12CTL2 &= ~ADC12TCOFF;  
  ADC12MCTL0 = ADC12SREF_1+ADC12INCH_0;            //ADC12SREF_1;基准源选择Vref+,模拟电压输入通道选择
                                                   //ADC12INCH1:端口对应的通道号
  ADC12MCTL1 = ADC12SREF_1+ADC12INCH_1; 
  ADC12MCTL2 = ADC12SREF_1+ADC12INCH_2;
  ADC12MCTL3 = ADC12SREF_1+ADC12INCH_3;
  ADC12MCTL4 = ADC12SREF_1+ADC12INCH_10+ADC12EOS;  //INCH_10:片内温度传感器对应的通道号
                                                   //EOS:停止通道转换
  ADC12IE = BIT4;                                  //使能ADC中断 Enable ADC12IFG.4
   for ( i=0; i<0x30; i++);                       
  ADC12CTL0 |= ADC12ENC;                  // 使能转换
  ADC12CTL0 |= ADC12SC;                  // 开始转换
}
/*******************************************
函数名称:ADC12ISR
功    能:ADC中断服务函数,在这里用多次平均的
          计算P6.1口的模拟电压数值
参    数:无       
返回值  :无
********************************************/
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR (void)
{
  switch(__even_in_range(ADC12IV,34))
  {
  case  0: break;                           // Vector  0:  No interrupt
  case  2: break;                           // Vector  2:  ADC overflow
  case  4: break;                           // Vector  4:  ADC timing overflow
  case  6: break;                           // Vector  6:  ADC12IFG0
  case  8: break;                           // Vector  8:  ADC12IFG1
  case 10: break;                           // Vector 10:  ADC12IFG2
  case 12: break;                           // Vector 12:  ADC12IFG3
  case 14: 
           results[0] = ADC12MEM0;          //读取后中断标志位自动清除
           results[1] = ADC12MEM1;          
           results[2] = ADC12MEM2;          
           results[3] = ADC12MEM3;          
           results[4] = ADC12MEM4;   
           break;                           // Vector 14:  ADC12IFG4
           
  case 16: break;                           // Vector 16:  ADC12IFG5
  case 18: break;                           // Vector 18:  ADC12IFG6
  case 20: break;                           // Vector 20:  ADC12IFG7
  case 22: break;                           // Vector 22:  ADC12IFG8
  case 24: break;                           // Vector 24:  ADC12IFG9
  case 26: break;                           // Vector 26:  ADC12IFG10
  case 28: break;                           // Vector 28:  ADC12IFG11
  case 30: break;                           // Vector 30:  ADC12IFG12
  case 32: break;                           // Vector 32:  ADC12IFG13
  case 34: break;                           // Vector 34:  ADC12IFG14
  default: break; 
  }
}

/*********************************************
   温度计算公式为
   Adc_Temp = ((((Adc_Num/4096)*Vref)-986mv)/3.55mv)
   当Vref=1.5V时
            Adc_Temp=(Adc_Num-2692)*423/4096;
   当Vref=2.5V时
            Adc_Temp=(Adc_Num-1617)*704/4096;
**********************************************/
u32 MCU_Tenp(u16 Temp_Value)
{
   u32 MCU_Temp =0;  
   Temp_Value = Temp_Value*2500/4096;
   MCU_Temp = (Temp_Value-1617)*704;    
   MCU_Temp = MCU_Temp/4096;
   return MCU_Temp;
//   Printf("read the ADC_Volt is %d mv\n",Volt_Average);
//   Printf("read the MCU_Temp is %d C\n",MCU_Temp);
//   Printf("\r\n");  Printf("\r\n");  
//   Delay_MS(1000);
}

Viewing all articles
Browse latest Browse all 3634

Trending Articles