打印

MSP430f5系列,使用ADC12模块测芯片内部温度

[复制链接]
895|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
volatile long temp;
volatile long IntDegF;
volatile long IntDegC;

int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  ADC12CTL0 = ADC12SHT0_8 + ADC12REFON + ADC12ON;
                                            // Internal ref = 1.5V
  ADC12CTL1 = ADC12SHP;                     // enable sample timer
  ADC12MCTL0 = ADC12SREF_1 + ADC12INCH_10;  // ADC i/p ch A10 = temp sense i/p
  ADC12IE = 0x001;                          // ADC_IFG upon conv result-ADCMEMO
  __delay_cycles(37);                       // 35us delay to allow Ref to settle
                                            // based on default DCO frequency.
                                            // See Datasheet for typical settle
                                            // time.
  ADC12CTL0 |= ADC12ENC;

  while(1)
  {
    ADC12CTL0 |= ADC12SC;                   // Sampling and conversion start

    __bis_SR_register(LPM4_bits + GIE);     // LPM0 with interrupts enabled
    __no_operation();

    // Temperature in Celsius
    // ((A10/4096*1500mV) - 894mV)*(1/3.66mV) = (A10/4096*410) - 244
    // = (A10 - 2438) * (410 / 4096)
    IntDegC = ((temp - 2438) * 410) / 4096;

    // Temperature in Fahrenheit
    // ((A10/4096*1500mV) - 829mV)*(1/2.033mV) = (A10/4096*738) - 408
    // = (A10 - 2264) * (738 / 4096)
    IntDegF = ((temp - 2264) * 738) / 4096;
    __no_operation();                       // SET BREAKPOINT HERE
  }
}

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR (void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(ADC12_VECTOR))) ADC12ISR (void)
#else
#error Compiler not supported!
#endif
{
  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:                                  // Vector  6:  ADC12IFG0
    temp = ADC12MEM0;                       // Move results, IFG is cleared
    __bic_SR_register_on_exit(LPM4_bits);   // Exit active CPU
    break;
  case  8: break;                           // Vector  8:  ADC12IFG1
  case 10: break;                           // Vector 10:  ADC12IFG2
  case 12: break;                           // Vector 12:  ADC12IFG3
  case 14: 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;
  }
}

请问:
   // Temperature in Celsius
   1. // ((A10/4096*1500mV) - 894mV)*(1/3.66mV) = (A10/4096*410) - 244   此处的894mv和3.66mv是什么含义?以及后面的410和244是如何得出?
    // Temperature in Fahrenheit
    2.// ((A10/4096*1500mV) - 829mV)*(1/2.033mV) = (A10/4096*738) - 408  同理,此处的829mv和2.033mv是表示什么,等号右边的738和408是什么意思?

相关帖子

沙发
dirtwillfly| | 2016-8-17 16:38 | 只看该作者
这些数据是mcu内部温度传感器的参数,一般可以查看规格书上的说明,或者自己校准

使用特权

评论回复
板凳
闻风小城|  楼主 | 2016-8-17 18:18 | 只看该作者
dirtwillfly 发表于 2016-8-17 16:38
这些数据是mcu内部温度传感器的参数,一般可以查看规格书上的说明,或者自己校准 ...

首先,对你的解答表示感谢,现已在datasheet里已查到摄氏温度参数,只是对((A10/4096*1500mV) - 894mV)*(1/3.66mV)还有疑惑,
根据用户手册里的计算公式,the ADC result N:
N = 4095 ×( Vin -Vr_)/(VR+ - Vr_)
在程序中我可以这样认为吗 --> temp就是公式中的N?

使用特权

评论回复
地板
闻风小城|  楼主 | 2016-8-17 18:33 | 只看该作者
本帖最后由 闻风小城 于 2016-8-17 18:47 编辑
闻风小城 发表于 2016-8-17 18:18
首先,对你的解答表示感谢,现已在datasheet里已查到摄氏温度参数,只是对((A10/4096*1500mV) - 894mV)*( ...

如果temp就是公式中的N,公式可写为
temp =4095*(Vin - Vr_)/(VR+  -  Vr_)   在下面VR+参考电压就简写为VR,同样Vr_也简写为Vr
计算Vin = temp/4095*VR - temp/4095*Vr +Vr            =  temp/4096*(VR - Vr) + Vr
如果将相关参数带入,会有
      Vin = temp/4096*(1500mv - 894mv)  + 894mv
转换为温度时:
IntDegC = ( temp/4096*(1500mv - 894mv) + 894mv) *(1/3.66mV)
即IntDegC = (A10/4096*(1500mv - 894mv) + 894mv) *(1/3.66mV)
而示例代码为
IntDegC =  ((A10/4096*1500mV) - 894mV)*(1/3.66mV)
请问:
在此我对温度公式的推导的思路有没有理解错?


使用特权

评论回复
5
闻风小城|  楼主 | 2016-8-17 18:45 | 只看该作者
dirtwillfly 发表于 2016-8-17 16:38
这些数据是mcu内部温度传感器的参数,一般可以查看规格书上的说明,或者自己校准 ...

如果temp就是公式中的N,公式可写为
temp =4095*(Vin - Vr_)/(VR+  -  Vr_)   在下面VR+参考电压就简写为VR,同样Vr_也简写为Vr
计算Vin = temp/4095*VR - temp/4095*Vr +Vr            =  temp/4096*(VR - Vr) + Vr
如果将相关参数带入,会有
      Vin = temp/4096*(1500mv - 894mv)  + 894mv
转换为温度时:
IntDegC = ( temp/4096*(1500mv - 894mv) + 894mv) *(1/3.66mV)
即IntDegC = (A10/4096*(1500mv - 894mv) + 894mv) *(1/3.66mV)
而示例代码为
IntDegC =  ((A10/4096*1500mV) - 894mV)*(1/3.66mV)
请问:
在此我对温度公式的推导的思路有没有理解错?
希望可以早点看到答案,对您的解答再次表示感谢

使用特权

评论回复
6
dirtwillfly| | 2016-8-17 20:50 | 只看该作者
实际的温度和采样值的关系,大概像下图这个样子:
其中a和b是根据校准数据,拟合出来的。

使用特权

评论回复
7
xiaoyaozt| | 2016-8-17 22:30 | 只看该作者
怎么不用18b20的产品呢。

使用特权

评论回复
8
xiaoyaozt| | 2016-8-17 22:34 | 只看该作者
数字测温的产品很多。

使用特权

评论回复
9
闻风小城|  楼主 | 2016-8-18 08:42 | 只看该作者
xiaoyaozt 发表于 2016-8-17 22:30
怎么不用18b20的产品呢。

只是想测量芯片内部温度,刚好430内部带了温度传感器,故此想学习写内部温度传感器的使用

使用特权

评论回复
10
闻风小城|  楼主 | 2016-8-18 08:43 | 只看该作者
xiaoyaozt 发表于 2016-8-17 22:34
数字测温的产品很多。

谢谢,除了常使用18b20还有哪些?

使用特权

评论回复
11
闻风小城|  楼主 | 2016-8-18 08:45 | 只看该作者
dirtwillfly 发表于 2016-8-17 20:50
实际的温度和采样值的关系,大概像下图这个样子:
其中a和b是根据校准数据,拟合出来的。
...

校准数据时如何取得的?

使用特权

评论回复
12
dirtwillfly| | 2016-8-18 09:43 | 只看该作者
闻风小城 发表于 2016-8-18 08:45
校准数据时如何取得的?

mcu的规格书上可能有。也可以自己用更精确的温度计校准。

使用特权

评论回复
13
闻风小城|  楼主 | 2016-8-18 10:01 | 只看该作者
dirtwillfly 发表于 2016-8-18 09:43
mcu的规格书上可能有。也可以自己用更精确的温度计校准。

如果使用更精确温度计校准原理,是不是测出一系列值,使430测得温度通过软件设置接近正确温度?
谢谢!

使用特权

评论回复
14
dirtwillfly| | 2016-8-18 10:24 | 只看该作者
闻风小城 发表于 2016-8-18 10:01
如果使用更精确温度计校准原理,是不是测出一系列值,使430测得温度通过软件设置接近正确温度?
谢谢! ...

自带的温度传感器有误差的,误差说明可以看datasheet。
根据你的需要进行校准就可以。
一般校准两三个点,然后拟合出线性关系就可以。

自带的这个温度传感器只适用于不太精确的温度测量,更精确的测量还是用专用温度传感ic吧

使用特权

评论回复
15
闻风小城|  楼主 | 2016-8-20 09:55 | 只看该作者
dirtwillfly 发表于 2016-8-18 10:24
自带的温度传感器有误差的,误差说明可以看datasheet。
根据你的需要进行校准就可以。
一般校准两三个点 ...

谢谢!

使用特权

评论回复
16
闻风小城|  楼主 | 2016-8-20 10:10 | 只看该作者
dirtwillfly 发表于 2016-8-18 10:24
自带的温度传感器有误差的,误差说明可以看datasheet。
根据你的需要进行校准就可以。
一般校准两三个点 ...

分数都已分配且分配完,结帖时却提示错作失败,这是为何?

使用特权

评论回复
17
dirtwillfly| | 2016-8-20 19:51 | 只看该作者
闻风小城 发表于 2016-8-20 10:10
分数都已分配且分配完,结帖时却提示错作失败,这是为何?

如果第一次分配错误,第二次重新分配正确也会有错误提示。
可以把浏览器完全关闭,然后重新打开,一般这样就可以重新结帖了。如果还不行,可以尝试清空缓存

使用特权

评论回复
18
baimiaocun2015| | 2016-8-21 14:00 | 只看该作者
这个一般在采集通道15还是14实现的。。

使用特权

评论回复
19
闻风小城|  楼主 | 2016-8-21 18:18 | 只看该作者
baimiaocun2015 发表于 2016-8-21 14:00
这个一般在采集通道15还是14实现的。。

谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

20

帖子

0

粉丝