树莓派通过模数转换芯片ADC0832读取LM35温度传感器数据
树莓派通过模数转换芯片ADC0832读取LM35温度传感器数据
今天和小朋友一起玩树莓派,打算来做一个测量室温的小实验。经过几个小时的研究和测试,终于能够成功读取LM35传感器的温度数据了。本文主要记录一些这个实验的过程。
使用的材料
Raspberry PI 3B
这个就不用多介绍了,超级流行的一块开发版。我安装的操作系统是Ubuntu for Arm Server v19.10
树莓派Raspberry PI 3 引脚编号
ADC0832模数转换芯片
ADC0832 是美国国家半导体公司生产的一种8 位分辨率、双通道A/D转换芯片。由于它体积小,兼容性强,性价比高而深受单片机爱好者及企业欢迎,其目前已经有很高的普及率。ADC083X是市面上常见的串行模—数转换器件系列。ADC0831、ADC0832、ADC0834、ADC0838是具有多路转换开关的8位串行I/O模—数转换器,转换速度较高(转换时间32uS),单电源供电,功耗低(15mW),适用于各种便携式智能仪表。本章以ADC0832为例,介绍其使用方法。
ADC0832是8脚双列直插式双通道A/D转换器,能分别对两路模拟信号实现模—数转换,可以用在单端输入方式和差分方式下工作。ADC0832采用串行通信方式,通过DI 数据输入端进行通道选择、数据采集及数据传送。8位的分辨率(最高分辨可达256级),可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。具有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。
ADC0832 具有以下特点:
- 8位分辨率;
- 双通道A/D转换;
- 输入输出电平与TTL/CMOS相兼容;
- 5V电源供电时输入电压在0~5V之间;
- 工作频率为250KHZ,转换时间为32μS;
- 一般功耗仅为15mW;
- 8P、14P—DIP(双列直插)、PICC 多种封装;
- 商用级芯片温宽为0°C to +70°C,工业级芯片温宽为-40°C to +85°C。
- 在5V电源的情况下,每个梯度19.5mV
上图是芯片引脚的图示。
- VCC是电源供电端口,正常工作使用5V电源,
- CLK为外部时钟引脚
- DO输出端口
- DI控制输入端口
- CS使能端口,低电平芯片使能
- CH0 模拟输入通道0,或作为IN+/-使用
- CH1 模拟输入通道1,或作为IN+/-使用
- GND 芯片参考零电位(地)
LM35模拟量温度传感器
LM35是National SEMIconductor所生产的温度传感器,它具有很高的工作精度和较宽的线性工作范围,LM35比按绝对温标校准的线性温度传感器优越行较好。因而,从使用角度来说,LM35无需外部校准或微调,可以提供±1/4℃的常用温度精度。
- 工作电压:直流4~30 V;
- 工作电流:小于133μA;
- 输出电压:-1.0~+6 V;
- 输出阻抗:1 mA负载时0.1 Ω;
- 精度:0.5℃精度(在+25℃时);
- 漏泄电流:低功耗,小于60μA;
- 比例因数:线性+10.0mV/℃;
- 非线性值:±1/4℃;
- 校准方式:直接用摄氏温度校准;
- 封装:密封TO-46晶体管封装或塑料T0~92晶体管封装;
- 使用温度范围:-55~+150℃额定范围。
树莓派和ADC0832连接
![](http://pic.maienzx.com/qiniuPic/Untitled Sketch_bb.jpg)
实验具体工作原理
正常情况下ADC0832 与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。本实验中用GPIO18作为CLK时钟信号,GPIO23连接ADC0832的输出口DO,GPIO24连接控制信号输入口DI,GPIO25连接CS使能口。
CS作为使能端,在高点平下芯片处于停止状态,在低电平时处于工作状态。
模拟信号取样流程:
CS端口置于低电平,开始工作
向CLK发出第一个时钟脉冲,在脉冲上升沿之前,DI需要得到一个高电平,确认开始工作。
向CLK发出第二个和第三个时钟脉冲,在这个两个脉冲上升沿之前DI需要给出两个控制信号的电位,选取模拟信号输入模式。模式如下图所示。ADC0832不支持负电压读取。
发出第4个脉冲到第18个脉冲,每个脉冲的下降沿读取一个二进制位(0,1)。最后形成这样的序列
[0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0]
总共15个二进制位,前8位是码位从高位到低位排列000010001,后8位是同样的数值从低位到高位反向排列用于校验。
Python源代码
import RPi.GPIO as GPIO #先要导入模块
import time
##BCM 对应 GPIO numbers , BOARD 对应 physical numbers。
GPIO.setmode(GPIO.BCM) #选择 GPIO numbers 编号系统
GPIO.setup(24,GPIO.OUT) #DI
GPIO.setup(23,GPIO.IN) #DO
GPIO.setup(25,GPIO.OUT) #CS
GPIO.setup(18,GPIO.OUT) #时钟GPIO.setup(18,GPIO.OUT) #时钟
#GPIO.setup(18,GPIO.IN)
#GPIO.output(23,True)
GPIO.output(24,True)
GPIO.output(25,True)
GPIO.output(18,True)
data = []
j = 0
#开始工作
GPIO.output(25,False)
GPIO.output(18,False)
time.sleep(0.02)
GPIO.output(24,True)
GPIO.output(18,True) #时钟高电平
time.sleep(0.02)
GPIO.output(18,False)
time.sleep(0.02)
GPIO.output(24,True)
GPIO.output(18,True) #时钟高电平
time.sleep(0.02)
GPIO.output(18,False)
time.sleep(0.02)
GPIO.output(24,True)
GPIO.output(18,True) #时钟高电平
time.sleep(0.02)
GPIO.output(18,False)
time.sleep(0.02)
while j < 15:
GPIO.output(18,True) #时钟高电平
time.sleep(0.02)
GPIO.output(18,False)
time.sleep(0.02)
if GPIO.input(23) == GPIO.HIGH:
data.append(1)
else:
data.append(0)
j +=1
print(data) #打印输出的数据
GPIO.output(25,True) #使能位重置
GPIO.cleanup()
运行这个脚本后,输出的内容如下:
[0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0],总共是15位数值,前八位是从高位到低位输出的二进制数值,后八位从低位到高位再输出一遍,中间八位二进制值是公用的。如这个数值所示中间的1是公用的。其实分成了两个部分:[0, 0, 0, 0, 1, 0, 0, 1]和[1, 0, 0, 1, 0, 0, 0, 0]。这两部分的二进制码顺序互反,用来做校验。
以上基本完成了这个实验,不过只是输出了二进制编码,我们还需要把二进制的数值转换成实际的十进制数✖19.4mV➗10mV,就得到温度值。
不过由于ADC0832只有8位精度,所以其实其每一个单位差不多有20mV,说以最后温度的误差还是比较大的。但是这个实验还是成功的,我们通过AD转换芯片获取到了模拟设备的数值。
后续工作
以上只是完成了初步的工作,如果要做一个完整的IOT温度监控系统,我们还要做成一个实时取样,转化成数值并存入数据库,通过监控系统实时读出并能够显示出来。
树莓派通过模数转换芯片ADC0832读取LM35温度传感器数据的更多相关文章
- 使用 Arduino 和 LM35 温度传感器监测温度
上一篇玩儿了一下Arduino入门,这次再进一步,用一下LM35温度传感器来监测当前温度.LM35温度传感器已经在Arduino入门套件里包含了,就是那个有三个脚的小黑块儿. 我们先把这些东西连起来. ...
- excel to datatable (c#用NPOI将excel文件内容读取到datatable数据表中)
将excel文件内容读取到datatable数据表中,支持97-2003和2007两种版本的excel 1.第一种是根据excel文件路径读取excel并返回datatable /// <sum ...
- 解剖SQLSERVER 第五篇 OrcaMDF里读取Bits类型数据(译)
解剖SQLSERVER 第五篇 OrcaMDF里读取Bits类型数据(译) http://improve.dk/reading-bits-in-orcamdf/ Bits类型的存储跟SQLSERVE ...
- Java读取Execl表格数据
在前面提到用java代码新建一个Execl 表格并添加数据到表格中, 这次写了一个读取Execl表格数据并添加导数据库中的案列 给定对方一个Execl模板表格,如果导入的Execl表格和预订的表格不相 ...
- 上传读取Excel文件数据
/// <summary> /// 上传读取Excel文件数据 /// 来自http://www.cnblogs.com/cielwater /// </summary> // ...
- JAVA TcpServer端使用Scanner读取不到数据的解决办法
在使用JAVA进行Socket通信时,在Server端使用Scanner的nextLine()方法读取数据时,一直读取不到数据是因为Scanner是一个扫描器,它扫描数据都是去内存中一块缓冲区中进行扫 ...
- 我写的一个ExcelHelper通用类,可用于读取或生成数据
读取或生成EXCEL数据的方法有很多,一般常见的有: 1.通过OFFICE EXCEL组件,优点:读取与生成EXCEL文件方便,缺点:服务器上必须安装OFFICE软件,且进程无法及时释放 2.通过第三 ...
- VC6.0读取Excel文件数据
啰嗦一下:本人所在公司从事碟式斯特林太阳能发电设备的研发与销售.单台设备图如下: 工作原理如下:整个设备大致可分为五个部分, 1.服务器,负责气象.发电等数据存取,电.网连接等处理: 2.气象站,通过 ...
- 转: 从Mysql某一表中随机读取n条数据的SQL查询语句
若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)).例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机 ...
随机推荐
- CSS 高度居中方案
实现高度自适应并且上下居中 <div id="wrap"> <div class="box">DemoSeat</div> ...
- bash: : Too many levels of symbolic links
ln -s 时 bash: : Too many levels of symbolic links改为绝对路径,
- 中文javadoc
大量的中文注释,其实最大的目的是想生成中文的Javadoc.但是中文注释实在太不高级了,在各种编码下还会变成乱码.本着高端大气国际化的思路,还是想把它换成英文,但是又不想放弃中文的Javadoc,怎么 ...
- 几个关于2-sat的题
几个关于2-sat的题 HDU3062 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3062 题意: 从2n个人去宴会,有 m条关系 i和j不能同时去 ...
- Android程序分析环境(搭建步骤略)
1:安装JDK JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK).没有JDK的话,无法编译Java程序. 2:安装Android SDK Androi ...
- STM32与STM8操作寄存器的区别
在STM8中,由于STM8寄存器较少,在头文件中定义寄存器的时候不用采取任何形式的封装,所以操作寄存器的时候直接可以用如下方式处理:PB_DDR |=0x20; 但是在STM32中,由于其寄存器实在太 ...
- 分布式大牛详解Zookeeper底层原理
很多学员都在反馈,说zk很难学,学的不是很明白,在这里,我继续带着大家详解一遍Zookeeper 首先zk是什么呢首先肯定是一个个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用 ...
- 小白学 Python 爬虫(30):代理基础
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- ArrayList、LinkedList、Vector、CopyOnWriteArrayList的区别和源码分析
1. ArrayList ArrayList 是一个数组队列,相当于动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractList,实现了List, RandomAccess, ...
- 如何查看linux是否打开虚拟化
[服务器虚拟化] 执行命令: cat /proc/cpuinfo |grep vmx 如果有输出,则说明CPU支持虚拟化技术. --------> svm - Secure virtua ...