MSP430F6638用AD10通道采集自身温度为什么采集的每块芯片的温度值相差很大?
Susan Yang:
您在测试时使用的程序是相同的?参考电压等也是一致的?能否给出稍微详细的信息?谢谢
灰小子:
那个mcu内部的温度传感器,误差是比较大的,差一两度很正常。
你测试的误差是多少?
落笔:
回复 Susan Yang:
程序是相同的,参考电压是1.5V,换算公式IntDegC = ((temp – 1855)*667)/4096;
详细程序:
void Init_ADC_0(void)
{REFCTL0 &= ~REFMSTR;ADC12CTL0 = ADC12ON+ADC12SHT1_8+ADC12REFON;// 打开ADC,设置采样时间,参考电压1.5VADC12CTL1 =ADC12CSTARTADD_10+ADC12SHP+ADC12CONSEQ_0;// 选择存储器地址,使用采样定时器 ADC12MCTL10 = ADC12SREF_1 + ADC12INCH_10;// 选择参考电压控制位,选择采样通道10ADC12CTL0 |= ADC12ENC;// 使能转换}
/****************************************************
功能:采集电池电压,结果在全局变量:float :test
通道号0;采用均值滤波法,采集样本数counter (1~256)
****************************************************/
void ADC_SUM(unsigned char counter)
{unsigned long average;//均值滤波总和变量,当counter过大可能导致溢出float testing=0;//滤波后的测试值
average = 0;testing=0;IntDegC =0;for(unsigned char j=0;j<counter;j++)//循环采集三次{ADC12CTL0 |=ADC12SC; // 开始转换delay(10);while (ADC12IFG ==BITA)//等待AD转换结束{average +=ADC12MEM10;//采集值叠加到均值滤波总和变量ADC12IFG&=~BITA;//清 ADC12IFG中断标志位}}testing=average/counter;//滤波后的测试值//IntDegC = ((testing – 1855)*667)/4096*10;//IntDegC = (testing/4096*1500 – 680)*(1/2.25);//放大十倍IntDegC = ((temp – 1855)*667)/4096;LCD_CLEAR(); //清所有显示show_int(IntDegC );//显示 温度值delay(1000);
}
落笔:
回复 灰小子:
测试了几块芯片,误差挺大的,有两块芯片相差十二度左右,有两块相差五六度
程序是这样的:
void Init_ADC_0(void)
{REFCTL0 &= ~REFMSTR;
ADC12CTL0 = ADC12ON+ADC12SHT1_8+ADC12REFON; // 打开ADC,设置采样时间,参考电压1.5V
ADC12CTL1 =ADC12CSTARTADD_10+ADC12SHP+ADC12CONSEQ_0; // 选择存储器地址,使用采样定时器
ADC12MCTL10 = ADC12SREF_1 + ADC12INCH_10; // 选择参考电压控制位,选择采样通道10
ADC12CTL0 |= ADC12ENC; // 使能转换}
/****************************************************
功能:采集电池电压,结果在全局变量:float :test
通道号0;采用均值滤波法,采集样本数counter (1~256)
****************************************************/
void ADC_SUM(unsigned char counter)
{unsigned long average;//均值滤波总和变量,当counter过大可能导致溢出
float testing=0;//滤波后的测试值average = 0;
testing=0;
IntDegC =0;
for(unsigned char j=0;j<counter;j++)//循环采集三次
{ADC12CTL0 |=ADC12SC; // 开始转换
delay(10);
while (ADC12IFG ==BITA)//等待AD转换结束
{average +=ADC12MEM10;//采集值叠加到均值滤波总和变量
ADC12IFG&=~BITA;//清 ADC12IFG中断标志位
}
}
testing=average/counter;//滤波后的测试值//IntDegC = ((testing – 1855)*667)/4096*10;
//IntDegC = (testing/4096*1500 – 680)*(1/2.25);//放大十倍
IntDegC = ((temp – 1855)*667)/4096;
LCD_CLEAR(); //清所有显示
show_int(IntDegC ); //显示 温度值
delay(1000);
}
灰小子:
回复 落笔:
1855和667两个数是怎么来的?
在msp430内的TLV的存储区域,有内部温度传感器的校准数值。请用这些参数进行校准
落笔:
回复 灰小子:
好的