1. 程式人生 > >樹莓派通過模數轉換晶片ADC0832讀取LM35溫度感測器資料

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