LM35是美国国家半导体(后被TI收购)推出的精密温度传感IC系列,其信号输出方式为模拟输出,输出电压值与摄氏温度值呈正比,且用户不需额外的校正就能获得较高的测量精度。其主要特性有:

  • 供电电压:4~30V
  • 测量范围:与芯片相关,单个正电源供电时最大+2~+150°C
  • 测量精度:与芯片、测量温度有关,如下图。可见室温附近误差典型值大约在+/-0.5°C,最大值在+/-0.5°C到+/-1.5°C不等。本文中使用的LM35D是精度最差的芯片,误差最大值约+/-1.5°C。

  • 功耗:与测量电路、温度有关,大约在50~100μA范围。
  • Sensor Gain:10mV/°C,电压与温度的关系为 Vout = Temperature × 10mV/°C。
  • 长期稳定性:量程最高温度下1000小时漂移+-0.08°C。
  • 封装:有TO-92、Metal Can、SOIC-8、TO-220。本文使用的LM35D为TO-92封装。

电路连接

LM35D采用Arduino UNO板上的5V电压供电,信号输出端与A0管脚相连。

简单的电压读取和转换

转换采用Arduino的ADC功能实现,测量电压与AD采样值的关系为:

其中,Vin是被测量(输入)电压;Vref是参考电压,若不特殊设置的话即为供电电压,对于UNO板为5V;resolution是ADC的比特数(不含符号位),对于atmega328p为10比特;ADC为读取的转换结果。严格来讲,上式的分母应该再减去1,但是否减1对结果的影响可以忽略不计。实现的代码非常简单:

 /*
Measuring the temperature using the LM35 sensor
Connection:
LM35 UNO
Vs <------> 5V
GND <-----> GND
Vout <----> A0 */ const int PIN_LM35 = A0; //pin connection float sensorVolt; //unit: mV
float temperature; //unit: centigrade void setup()
{
Serial.begin(); //initialize serial communication
} void loop()
{
sensorVolt = analogRead(PIN_LM35)*5000.0/; //do conversion
temperature = sensorVolt/10.0; Serial.print("Temperature: "); //print the result
Serial.print(temperature);
Serial.println(" *C"); delay(); //delay 1s
}

获得更高分辨率

除了采用电源电压作为基准源外,atmega328p提供了1.1V的内部基准源。在室温条件下测量时,LM35的输出电压在几百mV量级,因此可以利用内部基准源获得更高的测量分辨率。

此外,由于板上3.3V是通过稳压芯片获得(精度+/-1%),将Vref管脚与3.3V相连,使用3.3V作为基准电压,亦可以获得较高的分辨率及精度。

  • 若使用5V的电源电压作为基准源时,测量分辨率为5000mV/1023 = ~4.9mV,对应温度0.49°C;
  • 改进方法一. 在5V电压作为基准源基础上,通过测量板上3.3V电源来估算5V电源(仅USB供电时)的误差
  • 改进方法二. 直接使用3.3V的稳压芯片电源输出作为基准源,测量分辨率为3300mV/1023 = ~3.2mV,对应温度0.32°C;
  • 改进方法三. 使用1.1V的内部基准源,测量分辨率为1100mV/1023 = ~1.1mV,对应温度0.11°C,分辨能力有明显的提高。

代码也很简单,只需增加analogReference()语句及更改转换参数即可,以方法三为例:

 /*
Measuring the temperature using the LM35 sensor
Connection:
LM35 UNO
Vs <------> 5V
GND <-----> GND
Vout <----> A0 */ const int PIN_LM35 = A0; //pin connection float sensorVolt; //unit: mV
float temperature; //unit: centigrade void setup()
{
analogReference(INTERNAL); //use internal voltage reference
Serial.begin(); //initialize serial communication
} void loop()
{
sensorVolt = analogRead(PIN_LM35)*1100.0/; //do conversion
temperature = sensorVolt/10.0; Serial.print("Temperature: "); //print the result
Serial.print(temperature);
Serial.println(" `C"); delay(); //delay 1s
}

atmega328p的手册中描述内部基准源本身的误差有+-9%左右。因此,使用内部基准源在提高分辨能力的同时,也引入了额外的测量误差。更好的方法是利用3.3V板上电源,或者采用外部的高精度基准源

参考资料

datasheet: LM35 Precision Centigrade Temperature Sensors - TI
Tutorial: Analog to Digital Conversion - Thanks to SparkFun
How to Build a LM35 Temperature Sensor Circuit
Arduino LM35 Sensor (包含利用Processing实现结果可视化的程序)
TMP36 Temperature Sensor - from Adafruit

Arduino ADC + 模拟温度传感器LM35D的更多相关文章

  1. 玩转X-CTR100 l STM32F4 l ADC 模拟数字转换

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器 AD转换接 ...

  2. 集成模拟温度传感器低成本2.4G CC2500RGPR 中文手册

    CC2500是一种低成本真正单片的2.4GHz收发器,为低功耗无线应用而设计.电路定位2400-2483.5MHz的ISM(工业,科学和医学)和SRD(短距离设备)频率波段. RF收发器集成了一个数据 ...

  3. 使用 Arduino 和 LM35 温度传感器监测温度

    上一篇玩儿了一下Arduino入门,这次再进一步,用一下LM35温度传感器来监测当前温度.LM35温度传感器已经在Arduino入门套件里包含了,就是那个有三个脚的小黑块儿. 我们先把这些东西连起来. ...

  4. arduino adc数模放大器

    http://ardui.co/archives/833 http://henrysbench.capnfatz.com/henrys-bench/arduino-voltage-measuremen ...

  5. 「雕爷学编程」Arduino动手做(39)——DS18B20温度传感器

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  6. Arduino 模拟引脚

    Arduino的模拟引脚的引用,网上不错的一篇文章 参考:http://blog.sina.com.cn/s/blog_156e62ef90102xjio.html 模拟引脚 本文是对于Arduino ...

  7. 【嵌入式】Arduino编程基础到应用全解析

    Arduino Author: Andrew.Du 基础 基础语法: setup() loop() pinMode(引脚,模式) pinMode(13,OUTPUT):设置13号引脚为输出 //在使用 ...

  8. 初探物联网 - 基于Arduino的气象站和View and Data API的结合实例

    如果你参加了上个月在北京的Autodesk 开发者日,你应该看到了我做的关于Arduino的物联网实例演示,如果你没看到,欢迎参加14号在上海的开发者日,到时候我会再演(xian)示(bai)一下. ...

  9. 基于Arduino、STM32进行红外遥控信号接收

    catalogue . 遥控器原理简介 . 红外遥控原理 . 常见红外遥控器红外线信号传输协议 . 遙控器的发展 . 实验过程 . 攻击面 . 基于STM32实现红外信号解码 1. 遥控器原理简介 0 ...

随机推荐

  1. JMS可靠性机制

    1. 消息接收确认 JMS消息只有在被确认之后,才认为已经被成功的消费了,消息的成功消费通常包含三个阶段:客户接收消息,客户处理消息和消息被确认 在事务性会话中,当一个事务被提交的时候,确认自动发生. ...

  2. mysql复制(高可用架构方案的基础)

    mysql复制:把一个数据库实例上所有改变复制到另外一个数据库库服务器实例的过程特点:1.没有改变就无所谓复制 ;改变是复制的根本与数据源2.所有的改变:是指可以复制全部改变,也可以复制部分改变 可以 ...

  3. appstore 上传需要的icon

    <key>CFBundleIconFiles</key><array> <string>icon@2x.png</string> <s ...

  4. apache 2 修改虚拟目录

    准备好环境,就要开始进行开发了.这一篇,我们在Ubuntu Apache上配置虚拟目录. 知识准备: 区别于Windows 下apache,配置文件通常只有一个,就是httpd.conf. Linux ...

  5. codeforce 985A Chess Placing(暴力)

    Chess Placing time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  6. Maria数据库

    项目上要进行数据库选型,业务上来讲,数据是非常结构化的数据,使用传统关系数据库更适合:另外项目采用微服务框架,每个服务的数据库应该尽可能轻量级, 最后考虑Maria数据库. MariaDB简介: Ma ...

  7. verilog HDL 编码风格

    1.有意义且有效的名字. 2.同一信号在不同层次应该保持一致. 3.添加有意义的后缀,使信号的有效性更加明确. 4.模块输出寄存器化,使得输出的驱动强度和输入延时是可以预测的. 5.使用括号表明优先级 ...

  8. python's twenty-first day for me 抽象类和接口类以及多态

    归一化设计: 不管是哪一个类的对象,都调用同一个函数去完成相似的功能. class Alipay: def pay(self,money): print('使用支付宝支付了%s' % money) c ...

  9. win7下cygwin 中 root用户的设置

    问题描述: cygwin 在 win10下安装完成后使用当前用户登录后看所在磁盘的文件权限是没有问题的,但在cygwin编译出来的文件的权限为空,这个问题可以使用以下方法来解决: 解决办法: 将cyg ...

  10. Python——Dict

    Python字典(Dictionary) 字典是一种可变容器模型,可存储任意类型对象. 字典的每个键值(key => value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花 ...