《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 測(cè)試測(cè)量 > 其他 > 教程:SHT1x系列溫濕度傳感器的驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)

教程:SHT1x系列溫濕度傳感器的驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)

2022-12-24
來源:木南創(chuàng)智

  在我們的產(chǎn)品中,經(jīng)常需要檢測(cè)溫濕度數(shù)據(jù)。有很多檢測(cè)溫濕度的方法和模塊,其中SHT1x系列傳感器" target="_blank">溫濕度傳感器就是一種成本較低使用方便的溫濕度檢測(cè)模塊。下面我們就來說一說如何實(shí)現(xiàn)SHT1x系列溫濕度傳感器的驅(qū)動(dòng)。

  1 、功能概述

  SHT1x包括 SHT10, SHT11 和 SHT15 屬于Sensirion溫濕度傳感器家族中的貼片封裝系列。傳感器將傳感元件和信號(hào)處理電路集成在一塊微型電路板上,輸出完全標(biāo)定的數(shù)字信號(hào)。

  1.1 、硬件描述

  SHT1x傳感器包括一個(gè)電容性聚合體測(cè)濕敏感元件、一個(gè)用能隙材料制成的測(cè)溫元件,并在同一芯片上,與14 位的A/D 轉(zhuǎn)換器以及串行接口電路實(shí)現(xiàn)無縫連接。其引腳定義如下:

193.JPG

  SHT1x溫濕度傳感器使用的2線通訊,類似于I2C總線,但并不相同,使用普通的GPIO就可實(shí)現(xiàn)通訊。此次采用STM32F103VET6來操作SHT15,具體的連接方式如下:

191.JPG

  SCK 用于微處理器與SHT1x 之間的通訊同步。由于接口包含了完全靜態(tài)邏輯,因而不存在最小SCK 頻率。

  DATA 引腳為三態(tài)結(jié)構(gòu),用于讀取傳感器數(shù)據(jù) . 當(dāng)向傳感器發(fā)送命令時(shí), DATA 在 SCK 上升沿有效且在 SCK 高電平時(shí)必須保持穩(wěn)定。 DATA 在 SCK 下降沿之后改變。為避免信號(hào)沖突,微處理器應(yīng)驅(qū)動(dòng)DATA 在低電平。需要一個(gè)外部的上拉電阻(例如:10kΩ)將信號(hào)提拉至高電平。上拉電阻通常已包含在微處理器的I/O 電路中。

  1.2 、數(shù)據(jù)通訊

  選擇供電電壓后將傳感器通電,上電速率不能低于1V/ms。通電后傳感器需要11ms 進(jìn)入休眠狀態(tài),在此之前不允許對(duì)傳感器發(fā)送任何命令。

  SHT1x溫濕度傳感器采用一組“啟動(dòng)傳輸”時(shí)序,來完成數(shù)據(jù)傳輸?shù)某跏蓟?。而后續(xù)命令包含三個(gè)地址位(目前只支持000“),和五個(gè)命令位。SHT1x 會(huì)以下述方式表示已正確地接收到指令:在第8 個(gè)SCK 時(shí)鐘的下降沿之后,將DATA 下拉為低電平(ACK 位)。在第9 個(gè)SCK 時(shí)鐘的下降沿之后,釋放DATA(恢復(fù)高電平)。SHT1x溫濕度傳感器的指令表如下:

190.JPG

  后續(xù)我們開發(fā)SHT1x溫濕度傳感器的驅(qū)動(dòng)時(shí),就是通過這些操作命令來實(shí)現(xiàn)不同的操作。

  1.3 、數(shù)據(jù)計(jì)算

  濕度的測(cè)量數(shù)據(jù)并不是一個(gè)線性變化的過程濕度的非線性,為獲得更為精確的測(cè)量數(shù)據(jù),我們一般要采用非線性補(bǔ)償公式進(jìn)行信號(hào)轉(zhuǎn)換。濕度的非線性補(bǔ)償公式及參數(shù)如下:

189.JPG

  一般來說,傳感器濕度的校準(zhǔn)都是在一定的參考溫度下進(jìn)行的,但在我們的使用過程中,實(shí)際溫度與測(cè)試參考溫度25℃ (~77℉)明顯是不同的,所以我們需要對(duì)實(shí)際的濕度數(shù)據(jù)進(jìn)行補(bǔ)償。濕度的溫度補(bǔ)償公式及系數(shù)如下:

188.JPG

  SHT1x系列溫濕度傳感器的溫度傳感器采用的能隙材料PTAT。而能隙材料PTAT一般與絕對(duì)溫度存在正比關(guān)系,因而溫度傳感器具有極好的線性??捎萌缦鹿綄?shù)字輸出(SOT)轉(zhuǎn)換為溫度值,溫度轉(zhuǎn)換系數(shù)如下:

187.JPG

  SHT1x 并不直接進(jìn)行露點(diǎn)測(cè)量,但露點(diǎn)可以通過溫度和濕度讀數(shù)計(jì)算得到。。由于溫度和濕度在同一塊集成電路上測(cè)量,SHT1x可測(cè)量露點(diǎn)。露點(diǎn)的計(jì)算方法很多,絕大多數(shù)都很復(fù)雜。 對(duì)于-40 – 50°C 溫度范圍的測(cè)量,通過下面的的公式可得到較好的精度。

186.JPG

  通過上述幾個(gè)公式就可以計(jì)算出SHT1x監(jiān)測(cè)的溫度、濕度及露點(diǎn)數(shù)據(jù)。

  2 、驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)

  我們已經(jīng)了解了SHT1x系列溫濕度傳感器基本技術(shù)特性,接下來我們進(jìn)一步考慮如何設(shè)計(jì)并實(shí)現(xiàn)SHT1x系列溫濕度傳感器的驅(qū)動(dòng)。

  2.1 、對(duì)象定義

  在使用一個(gè)對(duì)象之前我們需要獲得一個(gè)對(duì)象。同樣的我們想要SHT1x系列溫濕度傳感器就需要先定義SHT1x系列溫濕度傳感器的對(duì)象。

  2.1.1 、對(duì)象的抽象

  我們要得到SHT1x系列溫濕度傳感器對(duì)象,需要先分析其基本特性。一般來說,一個(gè)對(duì)象至少包含兩方面的特性:屬性與操作。接下來我們就來從這兩個(gè)方面思考一下SHT1x系列溫濕度傳感器的對(duì)象。

  先來考慮屬性,作為屬性肯定是用于標(biāo)識(shí)或記錄對(duì)象特征的東西。我們來考慮SHT1x系列溫濕度傳感器對(duì)象屬性。首先SHT1x系列溫濕度傳感器有一個(gè)狀態(tài)寄存器,用于表示狀態(tài)和配置操作特性,所以我們將讀取的狀態(tài)寄存器的數(shù)據(jù)作為標(biāo)識(shí)SHT1x系列溫濕度傳感器對(duì)象的一個(gè)屬性。我們根據(jù)前面SHT1x系列溫濕度傳感器的數(shù)據(jù)計(jì)算公式可知,溫度單位和工作電壓對(duì)溫度測(cè)量結(jié)果的計(jì)算有直接影響,所以我們將溫度單位和工作電壓也作為SHT1x系列溫濕度傳感器對(duì)象的屬性,用于區(qū)別計(jì)算過程。此外溫度、濕度、露點(diǎn)的數(shù)據(jù)我們將其作為屬性用于記錄當(dāng)前狀態(tài)。

  接著我們還需要考慮SHT1x系列溫濕度傳感器對(duì)象的操作問題。我們是使用GPIO來模擬數(shù)字通訊,所以SCK引腳和DATA引腳都需要控制輸出,而控制函數(shù)的實(shí)現(xiàn)與具體的硬件相關(guān),所以我們將控制這兩個(gè)引腳輸出的函數(shù)作為對(duì)象的操作。對(duì)于DATA引腳還有可能需要控制方向和讀取輸入,同樣的原因我們也將其作為對(duì)象的操作。此外,我們?cè)谂cSHT1X通訊時(shí)需要控制時(shí)鐘,以及操作等待都是與硬件有關(guān)系的時(shí)間操作,所以我們也將其作為對(duì)象的操作。

  根據(jù)上述我們對(duì)SHT1x溫濕度傳感器的分析,我們可以定義SHT1x溫濕度傳感器的對(duì)象類型如下:

185.JPG

  2.1.2 、對(duì)象初始化

  我們知道,一個(gè)對(duì)象僅作聲明是不能使用的,我們需要先對(duì)其進(jìn)行初始化,所以這里我們來考慮SHT1x系列溫濕度傳感器對(duì)象的初始化函數(shù)。一般來說,初始化函數(shù)需要處理幾個(gè)方面的問題。一是檢查輸入?yún)?shù)是否合理;二是為對(duì)象的屬性賦初值;三是對(duì)對(duì)象作必要的初始化配置。據(jù)此我們?cè)O(shè)計(jì)SHT1x系列溫濕度傳感器對(duì)象的初始化函數(shù)如下:

183.JPG

 184.JPG


  2.2 、對(duì)象操作

  我們已經(jīng)完成了SHT1x系列溫濕度傳感器對(duì)象類型的定義和對(duì)象初始化函數(shù)的設(shè)計(jì)。但我們的主要目標(biāo)是獲取對(duì)象的信息,接下來我們還要實(shí)現(xiàn)面向SHT1x溫濕度傳感器的各類操作。

  2.2.1 、啟動(dòng)通訊

  每次發(fā)起與SHT1x溫濕度傳感器的通訊都需要用一組”啟動(dòng)傳輸“時(shí)序,來完成數(shù)據(jù)傳輸?shù)某跏蓟?。它包括:?dāng)SCK時(shí)鐘高電平時(shí)DATA翻轉(zhuǎn)為低電平,緊接著SCK變?yōu)榈碗娖?,隨后是在SCK時(shí)鐘高電平時(shí)DATA翻轉(zhuǎn)為高電平。啟動(dòng)通訊時(shí)序如下圖:

182.JPG

  根據(jù)上述時(shí)序圖我們可以實(shí)現(xiàn)啟動(dòng)通訊的操作函數(shù)如下:

  181.JPG

  2.2.2 、復(fù)位通訊

  如果與SHT1x通訊中斷,可通過下列信號(hào)時(shí)序復(fù)位:當(dāng)DATA保持高電平時(shí),觸發(fā)SCK時(shí)鐘9 次或更多。接著發(fā)送一個(gè)”傳輸啟動(dòng)“時(shí)序。這些時(shí)序只復(fù)位串口,狀態(tài)寄存器內(nèi)容仍然保留。具體的時(shí)序圖如下:

180.JPG

  根據(jù)上述的時(shí)序圖,我們?cè)O(shè)計(jì)通訊復(fù)位操作函數(shù)如下:

  179.JPG

  2.2.3 、數(shù)據(jù)獲取

  在前面我們已經(jīng)了解了SHT1x通訊命令,根據(jù)命令定義,我們發(fā)送命令”00000101“就表示相對(duì)濕度RH測(cè)量,發(fā)送命令”00000011“就表示溫度T的測(cè)量。測(cè)量過程需要大約20/80/320ms,分別對(duì)應(yīng)8/12/14bit分辨率。SHT1x通過下拉DATA至低電平并進(jìn)入空閑模式,表示測(cè)量的結(jié)束??刂破髟谠俅斡|發(fā)SCK時(shí)鐘前,必須等待這個(gè)”數(shù)據(jù)備妥“信號(hào)來讀出數(shù)據(jù)。檢測(cè)數(shù)據(jù)可以先被存儲(chǔ),這樣控制器可以繼續(xù)執(zhí)行其它任務(wù)在需要時(shí)再讀出數(shù)據(jù)。

  接著傳輸2個(gè)字節(jié)的測(cè)量數(shù)據(jù)和1個(gè)字節(jié)的CRC奇偶校驗(yàn)(可選擇讀?。???刂破餍枰ㄟ^下拉DATA為低電平,以確認(rèn)每個(gè)字節(jié)。所有的數(shù)據(jù)從MSB 開,右值有效(例如:對(duì)于12bit 數(shù)據(jù),從第5個(gè)SCK時(shí)鐘起算作MSB;而對(duì)于8bit 數(shù)據(jù),首字節(jié)則無意始義)。

  在收到CRC的確認(rèn)位之后,表明通訊結(jié)束。如果不使用CRC-8 校驗(yàn),控制器可以在測(cè)量值LSB后,通過保持ACK高電平終止通訊。在測(cè)量和通訊完成后,SHT1x自動(dòng)轉(zhuǎn)入休眠模式。數(shù)據(jù)測(cè)量時(shí)序圖如下所示:

178.JPG

  根據(jù)上述描述和時(shí)序圖,我們可以實(shí)現(xiàn)溫濕度數(shù)據(jù)的獲取函數(shù)如下:

 177.JPG

  2.2.4 、狀態(tài)寄存器操作

  SHT1x的某些高級(jí)功能可以通過給狀態(tài)寄存器發(fā)送指令來實(shí)現(xiàn),如選擇測(cè)量分辨率,電量不足提醒,使用OTP加載或啟動(dòng)加熱功能等。SHT1x的狀態(tài)寄存器可以讀或者寫。其實(shí)寫狀態(tài)寄存器就是配置設(shè)備的一些特性,一般情況下在初始化時(shí)完成即可。讀寫狀態(tài)寄存器的格式如下:

176.JPG

  175.JPG

  3 、驅(qū)動(dòng)的使用

  我們已經(jīng)設(shè)計(jì)并實(shí)現(xiàn)了SHT1x溫濕度傳感器驅(qū)動(dòng),接下來我們還需要對(duì)這一驅(qū)動(dòng)進(jìn)行驗(yàn)證,所以我們要基于此驅(qū)動(dòng)設(shè)計(jì)一個(gè)簡(jiǎn)單的應(yīng)用。

  3.1 、聲明并初始化對(duì)象

  使用基于對(duì)象的操作我們需要先得到這個(gè)對(duì)象,所以我們先要使用前面定義的SHT1x溫濕度傳感器對(duì)象類型聲明一個(gè)SHT1x溫濕度傳感器對(duì)象變量,具體操作格式如下:

  Sht1xObjectType sht1x;

  聲明了這個(gè)對(duì)象變量并不能立即使用,我們還需要使用驅(qū)動(dòng)中定義的初始化函數(shù)對(duì)這個(gè)變量進(jìn)行初始化。這個(gè)初始化函數(shù)所需要的輸入?yún)?shù)如下:

  Sht1xObjectType *sht,SHT1X對(duì)象變量

  uint32_t sck,SCK時(shí)鐘頻率

  float vdd,工作電壓

  SHT1xTempUnitType uint,溫度單位

  SHT1xHeaterType heater,是否啟用加熱器設(shè)置

  SHT1xOTPType otp,是否加在OTP設(shè)置

  SHT1xResolutionType resolution,測(cè)量分辨率設(shè)置

  SHT1xSetBusPin setSckPin,SCK引腳操作函數(shù)

  SHT1xSetBusPin setDataPin,DATA引腳操作函數(shù)

  SHT1xReadSDABit readSDA,讀DATA引腳函數(shù)

  SHT1xSDADirection direction,DATA引腳方向配置函數(shù)

  SHT1xDelay delayus,微秒延時(shí)函數(shù)

  SHT1xDelay delayms,毫秒延時(shí)函數(shù)

  對(duì)于這些參數(shù),對(duì)象變量我們已經(jīng)定義了。時(shí)鐘頻率根據(jù)實(shí)際輸入,以k為單位,默認(rèn)為100k。工作電壓根據(jù)實(shí)際情況輸入。溫度單位、加熱設(shè)置、OTP配置、分辨率配置均為枚舉,根據(jù)實(shí)際情況選擇就好了。主要的是我們需要定義幾個(gè)函數(shù),并將函數(shù)指針作為參數(shù)。這幾個(gè)函數(shù)的類型如下:

  174.JPG

  對(duì)于這幾個(gè)函數(shù)我們根據(jù)樣式定義就可以了,具體的操作可能與使用的硬件平臺(tái)有關(guān)系。片選操作函數(shù)用于多設(shè)備需要軟件操作時(shí),如采用硬件片選可以傳入NULL即可。具體函數(shù)定義如下:

  173.JPG

  對(duì)于延時(shí)函數(shù)我們可以采用各種方法實(shí)現(xiàn)。我們采用的STM32平臺(tái)和HAL庫則可以直接使用HAL_Delay()函數(shù)。于是我們可以調(diào)用初始化函數(shù)如下:

  SHT1xInitialization(&sht1x,100,3.3,DegreeCentigrade,SHT1xHeaterDisable,SHT1xOTPEbable,SHT1xHighResolution,OperationSckPin,OperationDataPin,ReadDataPinBit,SetDataPineDirection,Delayus,HAL_Delay);

  這里我們將SHT1x對(duì)象初始化為速度100k,3.3伏工作電壓,采用攝氏溫度單位,禁用片上加熱器,加載OTP并使用高分辨率。

  3.2 、基于對(duì)象進(jìn)行操作

  我們定義了對(duì)象變量并使用初始化函數(shù)給其作了初始化。接著我們就來考慮操作這一對(duì)象獲取我們想要的數(shù)據(jù)。我們?cè)隍?qū)動(dòng)中已經(jīng)將獲取數(shù)據(jù)并轉(zhuǎn)換為轉(zhuǎn)換值的比例值,接下來我們使用這一驅(qū)動(dòng)開發(fā)我們的應(yīng)用實(shí)例。

  這里我們?cè)O(shè)計(jì)一個(gè)簡(jiǎn)單應(yīng)用,使用SHT1X溫濕度傳感器獲取溫度、濕度及露點(diǎn)數(shù)據(jù),具體實(shí)現(xiàn)如下:

  172.JPG

  4 、應(yīng)用總結(jié)

  我們實(shí)現(xiàn)了SHT1X溫濕度傳感器的驅(qū)動(dòng),并使用這一驅(qū)動(dòng)開發(fā)了簡(jiǎn)單的驗(yàn)證應(yīng)用。所得到的結(jié)果與我們預(yù)期的結(jié)果是一致的,這說明我們的驅(qū)動(dòng)開發(fā)沒有問題。

  在使用驅(qū)動(dòng)程序時(shí)需要注意一點(diǎn),對(duì)象有一個(gè)控制DATA總線引腳輸入輸出方向的操作。對(duì)于一般情況下我們編寫引腳的輸入輸出方向控制函數(shù),在初始化函數(shù)中將函數(shù)指針作為參數(shù)傳入即可。如果硬件上可以配置為開漏輸出,則可以不用單獨(dú)控制引腳的輸入輸出方向。在初始化函數(shù)中以NULL作為參數(shù)輸入。

  關(guān)于通訊速率問題需要注意。在不同工作電壓時(shí)所支持的最大通訊速率是不同的,但不論如何我都能支持到1MHz,所以沒有特殊要求,電壓的影響可以不用考慮。在我們的驅(qū)動(dòng)中,最多能支持到500kHz,這主要是考慮到SHT1X的典型速度只有100k,而且大多數(shù)應(yīng)用中不會(huì)有高速要求。

  完整的源代碼可在GitHub下載:https://github.com/foxclever/ExPeriphDriver



更多信息可以來這里獲取==>>電子技術(shù)應(yīng)用-AET<<

mmexport1621241704608.jpg

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請(qǐng)及時(shí)通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。