樹莓派通過模數轉換芯片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作為使能端,在高點平下芯片處於停止狀態,在低電平時處於工作狀態。

模擬信號取樣流程:

  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溫度監控系統,我們還要做成一個實時取樣,轉化成數值並存入數據庫,通過監控系統實時讀出並能夠顯示出來。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM