以下程序是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);
}