[讨论] 关于MSP430内部温度传感器误差巨大的问题

helloxieyu   2015-8-21 09:57 楼主
MSP430内部温度传感器误差巨大的问题: 看手册,ADC电压等同于3.55mV/°C, 拿0°C做例子,可能的读数是895mV-1095mV,相差200mV,换算成温度是200/3.55=56.3°C,这误差也太吓人了吧? 我在27°C室温用几块430的板子读ADC10MEM的值,读数基本都在722左右,当然用热风吹430读数会往上升,证明采样应该是没问题的。0.995V是pdf上0°C的典型值,那么计算如下: ((722/1024)*1.5V -0.995V)/0.00355V=17.6C; 与室温27°C相差挺大的! 用官方的《Launchpad+(指导书).pdf》上的例子得到的ADC10MEM读数也是722左右,之后用 《Launchpad+(指导书).pdf》上的算法(我不知 道这个算法怎么来的), ((722 - 673) * 423) / 1024=20.2C 也是一样与室温27°C相差挺大的! 问题: 1. 每个MSP430的0°C对应的电压值都要自己手动去修正吗?不修正就会误差大得无法使用吗? 2. 我上述方式会不会存在问题。 《Launchpad+(指导书).pdf》的例子代码如下: ADC10_init(); _EINT(); while(1) { ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start __bis_SR_register(CPUOFF + GIE); // LPM0 with interrupts enabled temp = ADC10MEM; IntDegC = ((temp - 673) * 423) / 1024; __no_operation(); // SET BREAKPOINT HERE } #pragma vector=ADC10_VECTOR __interrupt void ADC10_ISR_HOOK(void) { __bic_SR_register_on_exit(LPM4_bits); } void ADC10_init(void) { ADC10CTL0 &= ~ENC; ADC10CTL0 = ADC10IE + ADC10ON + REFON + ADC10SHT_3 + SREF_1; //默认是1.5V参考 ADC10CTL1 = CONSEQ_0 + ADC10SSEL_0 + ADC10DIV_3 + SHS_0 + INCH_10; __delay_cycles(30000); ADC10CTL0 |= ENC; } 本帖最后由 helloxieyu 于 2015-8-21 10:03 编辑
  • 430内部温度传感器误差巨大的问题j.JPG

回复评论 (6)

你的电路里的电源电压、参考电压这些是多少? 0度下的电压的最大值和最小值应该是对应着每摄氏度电压值的最大值和最小值,并不是简单地说可能是在这个范围里随机变化 我是这么理解的,不知道对不对 本帖最后由 anqi90 于 2015-8-21 10:27 编辑
点赞  2015-8-21 10:24
你有没有注意过infoA里有关于温度传感器的校准数据?
30℃和85摄氏度的校准数据。可以用这个数据来计算。
点赞  2015-8-21 10:56
"qiushenghua"版大厉害,这都知道。
我看了一下手册,确实有这么一个“30℃和85摄氏度的校准数据”,但是是ADC12的,不是ADC10的,感觉用起来很复杂啊,我连怎么读取都不知道,有没有带430内部温度传感器修正的例子可以参考一下啊?满大街的例子都是不修正直接用的。
点赞  2015-8-21 14:09
之前“infoA里有关于温度传感器的校准数据”是我胡诌的,虽然我知道里面确实有校准数据,但是实际上不管使用或者不使用这个校准数据,在室温范围内对测量的结果影响不大(所以你看到满大街的例子都是不修正直接使用的)。

这个数字ADC12里有,ADC10里也有。看UG(slau144j),582页Table 24-1. Example SegmentA Structure
留意到你的参考电压是1.5V,那么我们需要获知CAL_ADC_15T85和CAL_ADC_15T30这两个量的值
从表格中可以看到它们的地址分别是0x10E4 和0x10E2。
进入CCS的调试模式,打开Memory Browser,可以直接阅读寄存器的数据。我的手头有一片G2452,刚刚尝试读取了一下,这两个数值分别是0x0368和0x02E2。

也就是85℃的ADC读数是0x368=872,30摄氏度的度数0x2E2=738。

刚刚我从G2452中读了一次温度数据,感觉是你看错了数字才导致计算结果不正确的
我读出的ADC数据是742(不是722),带入公式计算,得到温度(742-738)*(85-30)/(872-738)+30=31.64℃,与室温相差无几。
如果使用满大街不修正的计算公式:

((742 - 673) * 423) / 1024≈28.5℃。
这与室温同样相当接近。固然,使用校准后的数据与不校准的数据来测量温度必然会有差异,但是这个差值不应该那么大。

如果用UG上的参数来计算,VTEMP=0.00355(TEMPC)+0.986(slau144j第550页Figure 22-13)
((722/1024)*1.5V -0.986V)/0.00355V=20.17℃;
((722 - 673) * 423) / 1024=20.2℃
这两个结果相差并不大。
点赞  2015-8-22 20:50
我用过内部的温度传感器,测试过程中发现单片机运行越快越耗电,发热越大温度越高的。
点赞  2015-10-10 14:19
我用过内部的温度传感器,测试过程中发现单片机运行越快越耗电,发热越大温度越高的。
点赞  2015-10-10 14:25
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复