树莓派通过模数转换芯片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连接

实验具体工作原理

正常情况下ADC0832 与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。本实验中用GPIO18作为CLK时钟信号,GPIO23连接ADC0832的输出口DO,GPIO24连接控制信号输入口DI,GPIO25连接CS使能口。

CS作为使能端,在高点平下芯片处于停止状态,在低电平时处于工作状态。

模拟信号取样流程:

  1. CS端口置于低电平,开始工作
  2. 向CLK发出第一个时钟脉冲,在脉冲上升沿之前,DI需要得到一个高电平,确认开始工作。
  3. 向CLK发出第二个和第三个时钟脉冲,在这个两个脉冲上升沿之前DI需要给出两个控制信号的电位,选取模拟信号输入模式。模式如下图所示。ADC0832不支持负电压读取。

  4. 发出第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温度监控系统,我们还要做成一个实时取样,转化成数值并存入数据库,通过监控系统实时读出并能够显示出来。

原文地址:https://www.cnblogs.com/yangjian2006/p/12245093.html

时间: 2024-10-11 11:27:39

树莓派通过模数转换芯片ADC0832读取LM35温度传感器数据的相关文章

java.sql.SQLException: 无法从套接字读取更多的数据(mybatis 插入时)

今天  做mybatis 的批量插入的时候  出现 java.sql.SQLException: 无法从套接字读取更多的数据   的错误 解决方法: 由于批量插入的数据过大,需要分批次的插入. List<IdentificationData> insertList = new ArrayList<IdentificationData>(); for (IdentificationData domain : list) { insertList.add(domain); //批量插入

java通过POI技术操作Excel(2)----模板读取,录入数据

先来回顾下通常把java对Excel的操作分为以下功能:1.生成模板,导出模板:2.填充模板,录入数据:3:读取数据库数据,导出数据:在上一篇博文中,我简单记录了模板生成和导出,在这篇博文中,主要来记录--Excel文件导入,数据录入(仍然是以jsp+servlet为例) 既然要解决这个问题,那首先来分析下我们需要面对的有哪些需求需要实现: 1.Excel文件导入(这是最基础的,巧妇难为无米之炊,导入环节也是查了好久才完成的); 2.Excel文件中数据的格式判定,你要读取文件,如果文件中其实没

c#用NPOI将excel文件内容读取到datatable数据表中

将excel文件内容读取到datatable数据表中,支持97-2003和2007两种版本的excel 1.第一种是根据excel文件路径读取excel并返回datatable 1 /// <summary> 2 /// 将excel文件内容读取到DataTable数据表中 3 /// </summary> 4 /// <param name="fileName">文件完整路径名</param> 5 /// <param name=

读取文档数据的各列的每行中

读取文档数据的各列的每行中 1.该文件的内容被读 [[email protected] leekwen]# cat userpwd 1412230101 ty001 1412230102 ty002 1512430102 ty003 1511230102 ty004 1411230102 ty002 1411240102 yt005 1412290102 yt012 1510230102 yt022 1512231212 yt032 2.脚本命令 [[email protected] leekw

从数据库里随机读取几条数据

从数据库里随机读取几条数据 Access: select top n * from table order by rnd(id)‘id为数据库的自动编号字段 Sql Server: select top n * from table order by newid() MySQL: SELECT * FROM table order by rand() limit  20; Oracle: select * from table order by dbms_random.value()

ACCESS(VBA)上的一个小项目 —— 2、读取ACCESS表数据到TreeView和ListView

有人问我能不能做一个程序的时候,我第一反应都说“能”. --这次在ACCESS中,借助TreeView和ListView做了一个数据联动的模型. 简析过程: 1)从网上找了一份TreeView学习教程<三小时学会树控件>,了解了TreeView的建立以及节点的使用方法: 2)把数据表中的某列按一定规则生成的数据再按一种规则解析成TreeView中的树结构(VPPS): 3)通过遍历TreeView中节点的折叠状态,通过上述一定规则生成的数据(唯一性)把数据表中的内容读取到ListView中:

Unity基础 用C#脚本读取JSON文件数据

读取JSON文件数据网上有很多方法吗,这里采用SimpleJSON,关于SimpleJSON的介绍参考以下链接:http://wiki.unity3d.com/index.php/SimpleJSON,使用之前要先导入SimpleJSON的相关文件. JSON文件名:achieve.json,文件内容: { "30002":{"achieve_id":30002,"achieve_name":"连胜","achiev

网络编程 --- URLConnection --- 读取服务器的数据 --- java

使用URLConnection类获取服务器的数据 抽象类URLConnection表示一个指向指定URL资源的活动连接,它是java协议处理器机制的一部分. URL对象的openConnection()方法就是调用了URLStreamHandler的openConnection()方法. 如有疑问请参考:JAVA网络编程[第三版], 如下图: 怎样获取服务器输出的数据呢?代码如下: import java.io.IOException; import java.io.InputStream; i

使用client对象模型读取SharePoint列表数据

使用client对象模型读取SharePoint列表数据 client对象模型提供了强有力的方式.从远程client应用程序管理列表. 1. 管理员身份打开VS,新建项目Windows窗口应用程序,命名ReadSPListData,确保选择.NET Framework 3.5. 2. 加入控件. 控件类型: 3. 你必须加入一个类ProductInfo. namespace ReadSPListData { class ProductInfo { public string productNam