国产精品久久久久久亚洲影视,插我舔内射18免费视频,国产+精品+在线观看,国产精品18久久久久久麻辣,丰满少妇69激情啪啪无

0 賣盤信息
BOM詢價(jià)
您現(xiàn)在的位置: 首頁(yè) > 技術(shù)方案 >工業(yè)控制 > 基于Linux操作系統(tǒng)的數(shù)字溫度傳感器DS18B20驅(qū)動(dòng)程序設(shè)計(jì)方案

基于Linux操作系統(tǒng)的數(shù)字溫度傳感器DS18B20驅(qū)動(dòng)程序設(shè)計(jì)方案

來源: elecfans
2021-11-17
類別:工業(yè)控制
eye 27
文章創(chuàng)建人 拍明

原標(biāo)題:采用Linux的溫度傳感器DS18B20驅(qū)動(dòng)程序設(shè)計(jì)方案

基于Linux操作系統(tǒng)的DS18B20數(shù)字溫度傳感器驅(qū)動(dòng)程序設(shè)計(jì)方案

在當(dāng)今物聯(lián)網(wǎng)和嵌入式系統(tǒng)日益普及的時(shí)代,溫度測(cè)量作為環(huán)境監(jiān)測(cè)和控制的關(guān)鍵參數(shù),扮演著至關(guān)重要的角色。數(shù)字溫度傳感器,尤其是基于1-Wire總線的DS18B20,因其高精度、寬測(cè)量范圍、低功耗以及獨(dú)特的單總線通信方式,成為眾多應(yīng)用場(chǎng)景中的優(yōu)選。本設(shè)計(jì)方案將深入探討如何在Linux操作系統(tǒng)環(huán)境下,從硬件選型到軟件驅(qū)動(dòng)實(shí)現(xiàn),構(gòu)建一套穩(wěn)定可靠的DS18B20溫度采集系統(tǒng)。

image.png

1. DS18B20數(shù)字溫度傳感器概述

DS18B20是Maxim Integrated公司生產(chǎn)的一款可編程分辨率的數(shù)字溫度計(jì),能夠直接輸出9到12位的數(shù)字溫度值。其最大的特點(diǎn)是采用Dallas半導(dǎo)體獨(dú)特的單總線(1-Wire)通信接口,僅需一根信號(hào)線(DQ)即可與微控制器進(jìn)行雙向通信,極大地簡(jiǎn)化了硬件連接。此外,DS18B20還支持寄生電源模式,即在沒有單獨(dú)電源線的情況下,通過數(shù)據(jù)線竊取電源,這在遠(yuǎn)程或電源受限的應(yīng)用中尤為有利。其測(cè)量范圍通常為-55°C至+125°C,精度在-10°C至+85°C范圍內(nèi)可達(dá)$pm0.5^circ C$。每個(gè)DS18B20都具有一個(gè)唯一的64位ROM序列號(hào),這使得在同一總線上可以連接多個(gè)DS18B20而不發(fā)生地址沖突,實(shí)現(xiàn)多點(diǎn)溫度監(jiān)測(cè)。

2. 系統(tǒng)架構(gòu)設(shè)計(jì)

基于Linux的DS18B20驅(qū)動(dòng)系統(tǒng)通常采用分層設(shè)計(jì),以提高模塊化、可移植性和可維護(hù)性。其核心思想是將硬件操作與上層應(yīng)用邏輯分離。

  • 應(yīng)用層 (User Space Application): 負(fù)責(zé)數(shù)據(jù)的讀取、處理、顯示、存儲(chǔ)以及與用戶交互??梢酝ㄟ^標(biāo)準(zhǔn)文件操作接口(open、read、close)與驅(qū)動(dòng)程序進(jìn)行通信。

  • 內(nèi)核層 (Kernel Space Driver): 負(fù)責(zé)與DS18B20傳感器進(jìn)行直接通信,包括1-Wire協(xié)議的實(shí)現(xiàn)、溫度數(shù)據(jù)的讀取和轉(zhuǎn)換、錯(cuò)誤處理等。通常以字符設(shè)備驅(qū)動(dòng)或平臺(tái)設(shè)備驅(qū)動(dòng)的形式存在。

  • 硬件層 (Hardware Interface): 包含DS18B20傳感器本身以及與Linux開發(fā)板GPIO引腳的連接。

3. 硬件選型與接口設(shè)計(jì)

成功的驅(qū)動(dòng)程序離不開穩(wěn)定可靠的硬件基礎(chǔ)。本節(jié)將詳細(xì)闡述DS18B20系統(tǒng)中的關(guān)鍵元器件選擇及其作用。

3.1 Linux開發(fā)板/微控制器

優(yōu)選元器件型號(hào): Raspberry Pi 4 Model B / BeagleBone Black / STM32MP1系列開發(fā)板

器件作用: 作為整個(gè)系統(tǒng)的核心控制器,提供運(yùn)行Linux操作系統(tǒng)所需的計(jì)算能力、存儲(chǔ)和豐富的GPIO接口,用于與DS18B20傳感器進(jìn)行通信。

選擇理由:

  • Raspberry Pi 4 Model B: 因其強(qiáng)大的計(jì)算能力、豐富的社區(qū)支持、易于獲取以及大量的GPIO引腳而廣受歡迎。其基于ARM Cortex-A72處理器,足以運(yùn)行完整的Linux發(fā)行版,如Raspbian。內(nèi)置Wi-Fi和藍(lán)牙也為數(shù)據(jù)上傳和遠(yuǎn)程監(jiān)控提供了便利。

  • BeagleBone Black: 另一個(gè)流行的開源嵌入式平臺(tái),具有ARM Cortex-A8處理器和豐富的擴(kuò)展接口。其優(yōu)勢(shì)在于更低的功耗和更緊湊的尺寸,適合對(duì)功耗和尺寸有要求的應(yīng)用。

  • STM32MP1系列開發(fā)板: 對(duì)于更專業(yè)的嵌入式應(yīng)用,STMicroelectronics的STM32MP1系列微處理器提供了更強(qiáng)大的性能和更豐富的工業(yè)級(jí)接口。它們集成了ARM Cortex-A7和Cortex-M4雙核架構(gòu),可以在一個(gè)芯片上同時(shí)運(yùn)行Linux和實(shí)時(shí)操作系統(tǒng),適合復(fù)雜的溫度控制和數(shù)據(jù)采集系統(tǒng)。

功能:

  • 處理器: 執(zhí)行Linux內(nèi)核和用戶應(yīng)用程序代碼。

  • RAM: 提供程序運(yùn)行所需的內(nèi)存空間。

  • 存儲(chǔ): 用于存儲(chǔ)Linux操作系統(tǒng)、驅(qū)動(dòng)程序和應(yīng)用程序。

  • GPIO(通用輸入/輸出): 提供可編程的數(shù)字I/O引腳,用于模擬1-Wire總線協(xié)議,與DS18B20進(jìn)行數(shù)據(jù)交換。

  • 外設(shè)接口: 例如USB、Ethernet等,可用于調(diào)試、數(shù)據(jù)傳輸和網(wǎng)絡(luò)連接。

3.2 DS18B20數(shù)字溫度傳感器

優(yōu)選元器件型號(hào): Maxim Integrated DS18B20 (TO-92封裝或防水封裝)

器件作用: 核心的溫度測(cè)量單元,將模擬溫度值轉(zhuǎn)換為數(shù)字信號(hào)。

選擇理由:

  • 高精度: 在工業(yè)和消費(fèi)級(jí)應(yīng)用中,其$pm0.5^circ C$的精度通常能夠滿足要求。

  • 單總線(1-Wire)通信: 極大地簡(jiǎn)化了布線,只需一根數(shù)據(jù)線(DQ)、一根地線(GND),如果使用外部供電模式還需要一根電源線(VDD)。這種簡(jiǎn)潔性在多點(diǎn)溫度測(cè)量時(shí)尤其有優(yōu)勢(shì)。

  • 寬溫度范圍: -55°C至+125°C的測(cè)量范圍使其適用于各種惡劣環(huán)境。

  • 可編程分辨率: 用戶可以根據(jù)應(yīng)用需求選擇9位到12位的分辨率,在測(cè)量速度和精度之間取得平衡。

  • 唯一64位序列號(hào): 允許多個(gè)DS18B20掛載在同一條總線上,通過ROM命令實(shí)現(xiàn)尋址。

  • 寄生電源模式: 在某些應(yīng)用中,可以僅通過數(shù)據(jù)線供電,進(jìn)一步簡(jiǎn)化了布線。

  • 封裝多樣性: TO-92封裝適用于PCB焊接,而防水探頭封裝(如不銹鋼封裝)則適用于液體或潮濕環(huán)境的溫度測(cè)量。

功能:

  • 溫度測(cè)量: 內(nèi)置溫度傳感器和ADC,將環(huán)境溫度轉(zhuǎn)換為數(shù)字信號(hào)。

  • 1-Wire接口: 支持單總線協(xié)議,實(shí)現(xiàn)與主控器的數(shù)據(jù)通信。

  • ROM: 存儲(chǔ)唯一的64位序列號(hào)和配置寄存器。

  • EEPROM: 存儲(chǔ)用戶配置數(shù)據(jù),如高/低報(bào)警觸發(fā)點(diǎn)和分辨率設(shè)置。

  • 存儲(chǔ)器: 包含溫度寄存器、配置寄存器、高/低溫度觸發(fā)寄存器和循環(huán)冗余校驗(yàn)(CRC)寄存器。

3.3 上拉電阻

優(yōu)選元器件型號(hào): 4.7k$Omega$金屬膜電阻

器件作用: 在1-Wire總線上,上拉電阻是必不可少的。它將數(shù)據(jù)線(DQ)在空閑時(shí)拉高到電源電壓,確??偩€的默認(rèn)狀態(tài)為高電平。DS18B20和主控器通過拉低數(shù)據(jù)線來實(shí)現(xiàn)通信。

選擇理由:

  • 協(xié)議要求: 1-Wire協(xié)議規(guī)定在通信期間,主設(shè)備或從設(shè)備通過將數(shù)據(jù)線拉低來實(shí)現(xiàn)信號(hào)傳輸,當(dāng)總線空閑時(shí),數(shù)據(jù)線必須由上拉電阻拉高。

  • 阻值選擇: 4.7k$Omega$是一個(gè)經(jīng)驗(yàn)值,在大多數(shù)應(yīng)用中表現(xiàn)良好。如果總線較長(zhǎng)或連接的DS18B20數(shù)量較多,可能需要適當(dāng)減小電阻值,以保證信號(hào)的上升時(shí)間足夠快,但同時(shí)也要避免過大的電流消耗。

  • 材質(zhì): 金屬膜電阻具有更好的穩(wěn)定性和精度。

功能:

  • 總線空閑狀態(tài)保持: 確保1-Wire總線在沒有設(shè)備通信時(shí)處于高電平狀態(tài)。

  • 信號(hào)完整性: 協(xié)助信號(hào)的上升沿,保證數(shù)據(jù)傳輸?shù)目煽啃浴?/span>

  • 電源供給 (寄生模式): 在寄生電源模式下,DS18B20在總線空閑時(shí)通過上拉電阻從數(shù)據(jù)線獲取能量。

3.4 電源濾波電容 (可選但推薦)

優(yōu)選元器件型號(hào): 100nF陶瓷電容 (并聯(lián)在DS18B20的VDD和GND之間)

器件作用: 濾除電源線上的高頻噪聲,為DS18B20提供更穩(wěn)定的電源。尤其在寄生電源模式下,DS18B20在進(jìn)行溫度轉(zhuǎn)換時(shí)需要較大的瞬時(shí)電流,一個(gè)合適的電容可以提供額外的能量緩沖,確保轉(zhuǎn)換成功。

選擇理由:

  • 穩(wěn)定性: 減少電源紋波和噪聲,提高DS18B20測(cè)量的準(zhǔn)確性和穩(wěn)定性。

  • 瞬態(tài)電流支持: 在寄生電源模式下,DS18B20在溫度轉(zhuǎn)換時(shí)會(huì)消耗較大的瞬時(shí)電流。100nF的陶瓷電容可以提供快速的能量補(bǔ)充,防止因供電不足導(dǎo)致的測(cè)量失敗或錯(cuò)誤。

  • 可靠性: 良好的電源濾波能夠延長(zhǎng)DS18B20的使用壽命。

功能:

  • 高頻噪聲旁路: 提供低阻抗通路,將高頻噪聲引入地。

  • 能量?jī)?chǔ)存: 短暫儲(chǔ)存能量,在DS18B20需要大電流時(shí)迅速釋放。

4. 硬件連接

DS18B20與Linux開發(fā)板的連接非常簡(jiǎn)單。以下以Raspberry Pi為例:

  1. DS18B20 VDD (如果使用外部供電): 連接到Raspberry Pi的3.3V或5V引腳(取決于DS18B20的額定電壓,DS18B20通常支持3.0V-5.5V)。

  2. DS18B20 GND: 連接到Raspberry Pi的GND引腳。

  3. DS18B20 DQ (數(shù)據(jù)線): 連接到Raspberry Pi的一個(gè)GPIO引腳(例如GPIO4,這是Raspberry Pi上1-Wire驅(qū)動(dòng)默認(rèn)使用的引腳)。

  4. 上拉電阻: 一個(gè)4.7k$Omega$電阻連接在DS18B20的DQ引腳和VCC(3.3V或5V)之間。

寄生電源模式下,DS18B20的VDD引腳需要連接到GND,數(shù)據(jù)線DQ通過上拉電阻連接到電源,同時(shí)DQ也連接到Raspberry Pi的GPIO。

5. Linux內(nèi)核驅(qū)動(dòng)程序設(shè)計(jì)

在Linux內(nèi)核中實(shí)現(xiàn)DS18B20驅(qū)動(dòng)程序主要有兩種方式:使用現(xiàn)有的1-Wire子系統(tǒng)或編寫?yīng)毩⒌淖址O(shè)備驅(qū)動(dòng)??紤]到DS18B20的特殊性以及Linux內(nèi)核對(duì)1-Wire設(shè)備的支持,使用1-Wire子系統(tǒng)是更優(yōu)的選擇,因?yàn)樗峁┝艘惶讟?biāo)準(zhǔn)的API和數(shù)據(jù)結(jié)構(gòu),簡(jiǎn)化了開發(fā)。

5.1 Linux 1-Wire子系統(tǒng)概述

Linux內(nèi)核提供了一個(gè)專門的1-Wire子系統(tǒng)(drivers/w1),用于管理1-Wire總線和連接在其上的設(shè)備。該子系統(tǒng)抽象了底層的1-Wire協(xié)議細(xì)節(jié),為上層驅(qū)動(dòng)程序提供了統(tǒng)一的接口。其核心組成部分包括:

  • 1-Wire總線主控制器驅(qū)動(dòng) (Bus Master Driver): 負(fù)責(zé)實(shí)現(xiàn)特定硬件平臺(tái)(如GPIO、SPI、I2C轉(zhuǎn)1-Wire等)上的1-Wire時(shí)序和通信協(xié)議。例如,對(duì)于基于GPIO實(shí)現(xiàn)的1-Wire,需要一個(gè)GPIO 1-Wire總線主控制器驅(qū)動(dòng)。

  • 1-Wire從設(shè)備驅(qū)動(dòng) (Slave Device Driver): 負(fù)責(zé)解析特定1-Wire設(shè)備的協(xié)議(如DS18B20的溫度讀取協(xié)議),并將數(shù)據(jù)暴露給用戶空間。

當(dāng)1-Wire總線主控制器驅(qū)動(dòng)加載并發(fā)現(xiàn)1-Wire總線上的設(shè)備時(shí),它會(huì)通知1-Wire子系統(tǒng)。子系統(tǒng)會(huì)嘗試匹配相應(yīng)的從設(shè)備驅(qū)動(dòng),如果匹配成功,則會(huì)創(chuàng)建設(shè)備節(jié)點(diǎn)(通常在/sys/bus/w1/devices/下)。

5.2 啟用1-Wire支持 (樹莓派為例)

在Raspberry Pi上,首先需要確保內(nèi)核支持1-Wire總線。這通常通過修改/boot/config.txt文件來實(shí)現(xiàn):

dtoverlay=w1-gpio

如果需要指定不同的GPIO引腳,可以添加gpiopin參數(shù),例如:

dtoverlay=w1-gpio,gpiopin=4

保存并重啟Raspberry Pi后,內(nèi)核應(yīng)該會(huì)自動(dòng)加載1-Wire總線主控制器驅(qū)動(dòng),并在/sys/bus/w1/devices/目錄下創(chuàng)建相應(yīng)的設(shè)備目錄,其名稱通常是DS18B20的64位ROM序列號(hào)(例如28-00000xxxxxxx)。

5.3 DS18B20內(nèi)核驅(qū)動(dòng) (w1_therm)

幸運(yùn)的是,Linux內(nèi)核已經(jīng)內(nèi)置了針對(duì)DS18B20的從設(shè)備驅(qū)動(dòng) w1_therm。這個(gè)驅(qū)動(dòng)程序會(huì)自動(dòng)識(shí)別DS18B20設(shè)備,并在其設(shè)備目錄下創(chuàng)建一個(gè)名為w1_slave的文件。用戶空間程序只需讀取這個(gè)文件即可獲取溫度數(shù)據(jù)。

驅(qū)動(dòng)加載流程:

  1. 系統(tǒng)啟動(dòng)或模塊加載: 1-Wire GPIO總線主控制器驅(qū)動(dòng)(例如w1-gpiow1_gpio_master)被加載。

  2. 總線掃描: 總線主控制器驅(qū)動(dòng)執(zhí)行總線復(fù)位和ROM搜索命令,發(fā)現(xiàn)連接到總線上的所有DS18B20設(shè)備。

  3. 設(shè)備注冊(cè): 對(duì)于每個(gè)發(fā)現(xiàn)的DS18B20,總線主控制器驅(qū)動(dòng)會(huì)向1-Wire子系統(tǒng)注冊(cè)一個(gè)新的從設(shè)備。

  4. 從設(shè)備驅(qū)動(dòng)匹配: 1-Wire子系統(tǒng)會(huì)遍歷其已注冊(cè)的所有從設(shè)備驅(qū)動(dòng),嘗試與新注冊(cè)的DS18B20進(jìn)行匹配。w1_therm驅(qū)動(dòng)的ID表包含了DS18B20的家族碼(0x28),因此會(huì)成功匹配。

  5. 設(shè)備文件創(chuàng)建: 一旦w1_therm驅(qū)動(dòng)與DS18B20匹配成功,它會(huì)在/sys/bus/w1/devices/目錄下創(chuàng)建一個(gè)以DS18B20的64位ROM序列號(hào)命名的子目錄,并在該子目錄下創(chuàng)建w1_slave文件。

5.4 DS18B20驅(qū)動(dòng)的內(nèi)部機(jī)制 (w1_therm)

w1_therm驅(qū)動(dòng)的核心是實(shí)現(xiàn)DS18B20的通信協(xié)議來讀取溫度。當(dāng)用戶讀取/sys/bus/w1/devices/XXXX/w1_slave文件時(shí),w1_therm驅(qū)動(dòng)會(huì)執(zhí)行以下步驟:

  1. 發(fā)送“跳過ROM”命令 (0xCC) 或“匹配ROM”命令 (0x55 + 64位ROM地址): 通常使用“跳過ROM”命令,除非總線上有多個(gè)DS18B20需要單獨(dú)尋址。

  2. 發(fā)送“溫度轉(zhuǎn)換”命令 (0x44): 啟動(dòng)DS18B20內(nèi)部的溫度測(cè)量和ADC轉(zhuǎn)換過程。

  3. 延時(shí)等待轉(zhuǎn)換完成: DS18B20的溫度轉(zhuǎn)換需要一定時(shí)間,具體取決于分辨率(例如,12位分辨率需要約750ms)。驅(qū)動(dòng)程序會(huì)通過適當(dāng)?shù)难訒r(shí)或輪詢DS18B20的狀態(tài)來等待轉(zhuǎn)換完成。

  4. 發(fā)送“讀暫存器”命令 (0xBE): 從DS18B20的暫存器中讀取9個(gè)字節(jié)的數(shù)據(jù)。這些數(shù)據(jù)包含了溫度值、配置字節(jié)、高/低報(bào)警觸發(fā)值以及CRC校驗(yàn)和。

  5. CRC校驗(yàn): 驅(qū)動(dòng)程序會(huì)計(jì)算接收到的數(shù)據(jù)的CRC校驗(yàn)和,并與DS18B20提供的CRC值進(jìn)行比較。如果校驗(yàn)失敗,則說明數(shù)據(jù)傳輸有誤,驅(qū)動(dòng)程序會(huì)返回錯(cuò)誤或無效數(shù)據(jù)。

  6. 解析溫度值: 如果CRC校驗(yàn)通過,驅(qū)動(dòng)程序會(huì)從接收到的數(shù)據(jù)中提取出原始溫度值(16位有符號(hào)整數(shù))。

  7. 溫度單位轉(zhuǎn)換和格式化: 將原始溫度值根據(jù)DS18B20的數(shù)據(jù)格式進(jìn)行轉(zhuǎn)換(通常是16位補(bǔ)碼形式,最低有效位代表0.0625攝氏度),并將其格式化為可讀的字符串(例如“t=25125”表示25.125攝氏度),最后輸出到w1_slave文件。

5.5 自定義內(nèi)核模塊 (如果w1_therm不滿足需求)

在極少數(shù)情況下,如果w1_therm驅(qū)動(dòng)無法滿足特定需求(例如需要更精細(xì)的控制,或者在不支持設(shè)備樹的舊內(nèi)核版本上),開發(fā)者可能需要編寫自己的DS18B20字符設(shè)備驅(qū)動(dòng)。

驅(qū)動(dòng)程序結(jié)構(gòu):

  1. 模塊初始化與退出: module_init()module_exit() 函數(shù)。

  2. 字符設(shè)備注冊(cè): 使用cdev_init()、cdev_add()注冊(cè)字符設(shè)備。

  3. 文件操作集: 實(shí)現(xiàn)file_operations結(jié)構(gòu)體,包括open、release、read、write等函數(shù)。

  4. 1-Wire總線操作:read函數(shù)中實(shí)現(xiàn)1-Wire時(shí)序的位操作,包括復(fù)位脈沖、存在脈沖、讀寫位等。這需要直接操作GPIO引腳,設(shè)置為輸入/輸出模式并控制高低電平。

  5. DS18B20命令實(shí)現(xiàn): 封裝DS18B20的命令序列(如溫度轉(zhuǎn)換、讀暫存器)。

  6. 數(shù)據(jù)解析與CRC校驗(yàn): 解析讀取到的原始數(shù)據(jù)并進(jìn)行CRC校驗(yàn)。

  7. 錯(cuò)誤處理: 完善的錯(cuò)誤處理機(jī)制。

實(shí)現(xiàn)GPIO 1-Wire總線操作的關(guān)鍵函數(shù)(偽代碼):

// 初始化GPIO引腳
void gpio_init_1wire(int gpio_pin) {
   // 設(shè)置GPIO為輸出模式
   // 設(shè)置GPIO為高電平
}

// 1-Wire復(fù)位和存在脈沖
int w1_reset_and_presence(int gpio_pin) {
   // 拉低GPIO 480us
   // 拉高GPIO 60us (釋放總線)
   // 讀GPIO,如果檢測(cè)到低電平則有設(shè)備響應(yīng)
   // 延時(shí)420us
   return presence_detected;
}

// 1-Wire寫位
void w1_write_bit(int gpio_pin, int bit) {
   if (bit) {
       // 拉低GPIO 1us
       // 拉高GPIO 60us
   } else {
       // 拉低GPIO 60us
       // 拉高GPIO 1us
   }
   // 延時(shí)以滿足時(shí)序要求
}

// 1-Wire讀位
int w1_read_bit(int gpio_pin) {
   int bit_value;
   // 拉低GPIO 1us
   // 拉高GPIO
   // 延時(shí)15us
   // 讀GPIO
   // 延時(shí)45us
   return bit_value;
}

// 1-Wire寫字節(jié)
void w1_write_byte(int gpio_pin, unsigned char byte) {
   for (int i = 0; i < 8; i++) {
       w1_write_bit(gpio_pin, (byte >> i) & 0x01);
   }
}

// 1-Wire讀字節(jié)
unsigned char w1_read_byte(int gpio_pin) {
   unsigned char byte = 0;
   for (int i = 0; i < 8; i++) {
       if (w1_read_bit(gpio_pin)) {
           byte |= (1 << i);
       }
   }
   return byte;
}

這些底層的位操作需要精確的時(shí)序控制,通常會(huì)使用內(nèi)核提供的udelay()ndelay()函數(shù)來實(shí)現(xiàn)微秒級(jí)的延時(shí)。同時(shí),需要禁用中斷以確保時(shí)序的準(zhǔn)確性。

6. 用戶空間應(yīng)用程序設(shè)計(jì)

用戶空間應(yīng)用程序負(fù)責(zé)與內(nèi)核驅(qū)動(dòng)程序交互,獲取溫度數(shù)據(jù),并進(jìn)行后續(xù)處理。

6.1 讀取DS18B20溫度 (使用sysfs)

當(dāng)1-Wire子系統(tǒng)和w1_therm驅(qū)動(dòng)正確加載后,DS18B20的溫度數(shù)據(jù)可以通過讀取/sys/bus/w1/devices/XXXX/w1_slave文件來獲取。

C語(yǔ)言示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>

#define MAX_BUF_SIZE 256

int main() {
   char w1_device_path[MAX_BUF_SIZE];
   char buf[MAX_BUF_SIZE];
   ssize_t bytes_read;
   FILE *fp;
   long temperature_raw;
   float temperature_celsius;

   // 查找DS18B20設(shè)備,通常以"28-"開頭
   // 實(shí)際應(yīng)用中可能需要更健壯的設(shè)備查找邏輯
   // 這里假設(shè)只有一個(gè)DS18B20,并且其設(shè)備目錄已經(jīng)存在
   // 建議:可以使用opendir和readdir遍歷/sys/bus/w1/devices/目錄
   snprintf(w1_device_path, sizeof(w1_device_path), "/sys/bus/w1/devices/%s/
   w1_slave", "28-00000xxxxxxx"); // 替換為你的DS18B20實(shí)際ROM ID

   fp = fopen(w1_device_path, "r");
   if (fp == NULL) {
       perror("Failed to open w1_slave file");
       return 1;
   }

   // 讀取兩行數(shù)據(jù),第一行是CRC校驗(yàn)結(jié)果,第二行是溫度數(shù)據(jù)
   if (fgets(buf, sizeof(buf), fp) == NULL) {
       perror("Failed to read first line from w1_slave");
       fclose(fp);
       return 1;
   }
   if (fgets(buf, sizeof(buf), fp) == NULL) {
       perror("Failed to read second line from w1_slave");
       fclose(fp);
       return 1;
   }

   fclose(fp);

   // 解析溫度數(shù)據(jù)
   // 查找"t="的起始位置
   char *temp_str = strstr(buf, "t=");
   if (temp_str != NULL) {
       // 跳過"t="
       temp_str += 2;
       temperature_raw = atol(temp_str);
       temperature_celsius = (float)temperature_raw / 1000.0f;
       printf("Temperature: %.2f C ", temperature_celsius);
   } else {
       fprintf(stderr, "Could not find 't=' in w1_slave data. ");
       return 1;
   }

   return 0;
}

編譯命令: gcc -o read_temp read_temp.c

運(yùn)行: ./read_temp

6.2 用戶空間GPIO位操作 (如果不用內(nèi)核1-Wire子系統(tǒng))

如果選擇在用戶空間直接操作GPIO模擬1-Wire協(xié)議(例如,在資源非常有限的系統(tǒng)或?yàn)榱丝焖僭烷_發(fā)),可以使用sysfs接口或libgpiod庫(kù)。

Sysfs GPIO操作示例 (不推薦用于精確時(shí)序,因?yàn)橛脩艨臻g切換和調(diào)度可能導(dǎo)致時(shí)序不準(zhǔn)):

C

// 導(dǎo)出GPIO
echo 4 > /sys/class/gpio/export
// 設(shè)置為輸出
echo out > /sys/class/gpio/gpio4/direction
// 設(shè)置為高電平
echo 1 > /sys/class/gpio/gpio4/value
// 設(shè)置為輸入
echo in > /sys/class/gpio/gpio4/direction
// 讀取值
cat /sys/class/gpio/gpio4/value
// 卸載GPIO
echo 4 > /sys/class/gpio/unexport

Libgpiod庫(kù) (推薦用于用戶空間GPIO操作,因?yàn)樗峁┝烁鼜?qiáng)大的功能和更好的性能):

libgpiod是一個(gè)新的Linux GPIO庫(kù),旨在替代傳統(tǒng)的sysfs GPIO接口,提供更穩(wěn)定和高效的GPIO控制。

#include <gpiod.h>
#include <stdio.h>
#include <unistd.h> // For usleep

#define GPIO_CHIP_NAME "gpiochip0" // 通常是gpiochip0或gpiochip1
#define GPIO_PIN 4                 // 你的DS18B20連接的GPIO引腳號(hào)

// ... (省略1-Wire協(xié)議實(shí)現(xiàn),這里僅展示libgpiod的基本用法)

int main() {
   struct gpiod_chip *chip;
   struct gpiod_line *line;
   int ret;

   chip = gpiod_chip_open_by_name(GPIO_CHIP_NAME);
   if (!chip) {
       perror("Open chip failed");
       return 1;
   }

   line = gpiod_chip_get_line(chip, GPIO_PIN);
   if (!line) {
       perror("Get line failed");
       gpiod_chip_close(chip);
       return 1;
   }

   // 設(shè)置為輸出模式并初始為高電平
   ret = gpiod_line_request_output(line, "ds18b20_driver", 1);
   if (ret < 0) {
       perror("Request line as output failed");
       gpiod_chip_close(chip);
       return 1;
   }

   // 示例:拉低GPIO 500us (1-Wire復(fù)位脈沖的一部分)
   gpiod_line_set_value(line, 0); // 拉低
   usleep(500); // 延時(shí)500微秒
   gpiod_line_set_value(line, 1); // 拉高
   usleep(60); // 延時(shí)60微秒

   // 切換為輸入模式讀取
   ret = gpiod_line_request_input(line, "ds18b20_driver");
   if (ret < 0) {
       perror("Request line as input failed");
       gpiod_chip_close(chip);
       return 1;
   }

   int value = gpiod_line_get_value(line);
   printf("GPIO %d value: %d ", GPIO_PIN, value);

   gpiod_line_release(line);
   gpiod_chip_close(chip);

   return 0;
}

6.3 數(shù)據(jù)處理與展示

獲取到溫度數(shù)據(jù)后,用戶空間應(yīng)用程序可以:

  • 數(shù)據(jù)平滑處理: 對(duì)連續(xù)采集的溫度數(shù)據(jù)進(jìn)行平均或?yàn)V波,消除瞬時(shí)波動(dòng)。

  • 溫度報(bào)警: 設(shè)置溫度閾值,當(dāng)溫度超出范圍時(shí)觸發(fā)報(bào)警(如郵件、短信、蜂鳴器)。

  • 數(shù)據(jù)可視化: 使用圖表庫(kù)(如gnuplotmatplotlib通過Python)將溫度變化趨勢(shì)可視化。

  • 數(shù)據(jù)存儲(chǔ): 將溫度數(shù)據(jù)記錄到文件、數(shù)據(jù)庫(kù)(如SQLite、InfluxDB)或上傳到云平臺(tái)(如MQTT、HTTP POST)。

  • 網(wǎng)絡(luò)發(fā)布: 通過MQTT、HTTP或WebSocket協(xié)議將溫度數(shù)據(jù)發(fā)布到局域網(wǎng)或互聯(lián)網(wǎng),實(shí)現(xiàn)遠(yuǎn)程監(jiān)控。

7. 調(diào)試與故障排除

在開發(fā)和部署DS18B20驅(qū)動(dòng)程序時(shí),可能會(huì)遇到各種問題。以下是一些常見的調(diào)試技巧和故障排除方法:

  • 檢查硬件連接: 仔細(xì)檢查DS18B20與Linux開發(fā)板之間的所有連接,特別是數(shù)據(jù)線、地線和上拉電阻。確保上拉電阻值正確,并且DS18B20的供電電壓在允許范圍內(nèi)。

  • 確認(rèn)1-Wire DTOVERLAY加載: 檢查/boot/config.txt是否正確配置了dtoverlay=w1-gpio,并重啟系統(tǒng)。

  • 檢查內(nèi)核日志: 使用dmesg命令查看內(nèi)核日志,搜索與1-Wire子系統(tǒng)或DS18B20相關(guān)的錯(cuò)誤或警告信息。例如,dmesg | grep w1。

  • 檢查sysfs設(shè)備節(jié)點(diǎn): 確認(rèn)/sys/bus/w1/devices/目錄下是否存在DS18B20的設(shè)備目錄(以28-開頭)。如果沒有,說明內(nèi)核驅(qū)動(dòng)可能沒有成功識(shí)別設(shè)備,或者硬件連接存在問題。

  • CRC校驗(yàn)失敗: 如果讀取w1_slave文件時(shí)看到CRC校驗(yàn)失敗的錯(cuò)誤信息,通常是由于硬件連接不良、總線干擾、上拉電阻值不合適或電源問題導(dǎo)致數(shù)據(jù)傳輸錯(cuò)誤。嘗試更換上拉電阻,檢查線纜質(zhì)量,或者增加電源濾波電容。

  • 權(quán)限問題: 確保用戶空間程序有權(quán)限讀取/sys/bus/w1/devices/XXXX/w1_slave文件。通常,以root用戶或?qū)⒂脩籼砑拥?/span>gpioi2c組可以解決權(quán)限問題。

  • 多傳感器尋址: 如果總線上連接了多個(gè)DS18B20,確保在用戶空間程序中能夠正確地根據(jù)ROM ID訪問每個(gè)傳感器。

  • 時(shí)序問題 (自定義驅(qū)動(dòng)): 如果自己編寫內(nèi)核模塊或用戶空間GPIO驅(qū)動(dòng),時(shí)序是關(guān)鍵。使用示波器檢查GPIO引腳的波形,確保復(fù)位脈沖、存在脈沖和數(shù)據(jù)位的時(shí)序符合DS18B20數(shù)據(jù)手冊(cè)的要求。特別是udelay()ndelay()的精度,以及中斷對(duì)時(shí)序的影響。

  • 寄生電源模式: 在寄生電源模式下,DS18B20在溫度轉(zhuǎn)換期間需要較大的電流。如果供電不足,可能會(huì)導(dǎo)致轉(zhuǎn)換失敗或讀數(shù)不準(zhǔn)確。確保上拉電阻能夠提供足夠的電流,并且在DQ線和GND之間并聯(lián)一個(gè)100nF的電容可以改善穩(wěn)定性。

8. 總結(jié)與展望

本設(shè)計(jì)方案詳細(xì)闡述了基于Linux操作系統(tǒng)的DS18B20數(shù)字溫度傳感器驅(qū)動(dòng)程序的實(shí)現(xiàn)。通過利用Linux內(nèi)核強(qiáng)大的1-Wire子系統(tǒng),可以極大地簡(jiǎn)化DS18B20的集成。從硬件選型,到內(nèi)核驅(qū)動(dòng)的機(jī)制,再到用戶空間應(yīng)用程序的開發(fā),整個(gè)流程旨在提供一個(gè)穩(wěn)健、高效且易于維護(hù)的溫度采集解決方案。

未來的工作可以包括:

  • 更高級(jí)的數(shù)據(jù)分析: 結(jié)合機(jī)器學(xué)習(xí)算法對(duì)溫度數(shù)據(jù)進(jìn)行異常檢測(cè)、趨勢(shì)預(yù)測(cè)。

  • 分布式溫度監(jiān)測(cè)網(wǎng)絡(luò): 利用LoRa、Zigbee等無線技術(shù)構(gòu)建分布式傳感器網(wǎng)絡(luò),將DS18B20數(shù)據(jù)傳輸?shù)街醒刖W(wǎng)關(guān)。

  • Web界面或移動(dòng)應(yīng)用: 開發(fā)用戶友好的Web界面或移動(dòng)應(yīng)用程序,實(shí)現(xiàn)遠(yuǎn)程溫度數(shù)據(jù)可視化和控制。

  • 電源管理優(yōu)化: 對(duì)于電池供電的嵌入式系統(tǒng),進(jìn)一步優(yōu)化DS18B20的功耗管理,例如使用周期性休眠模式。

通過遵循本方案,開發(fā)者將能夠成功地在Linux平臺(tái)上部署DS18B20溫度傳感器,為各種溫度監(jiān)測(cè)和控制應(yīng)用奠定堅(jiān)實(shí)基礎(chǔ)。

責(zé)任編輯:David

【免責(zé)聲明】

1、本文內(nèi)容、數(shù)據(jù)、圖表等來源于網(wǎng)絡(luò)引用或其他公開資料,版權(quán)歸屬原作者、原發(fā)表出處。若版權(quán)所有方對(duì)本文的引用持有異議,請(qǐng)聯(lián)系拍明芯城(marketing@iczoom.com),本方將及時(shí)處理。

2、本文的引用僅供讀者交流學(xué)習(xí)使用,不涉及商業(yè)目的。

3、本文內(nèi)容僅代表作者觀點(diǎn),拍明芯城不對(duì)內(nèi)容的準(zhǔn)確性、可靠性或完整性提供明示或暗示的保證。讀者閱讀本文后做出的決定或行為,是基于自主意愿和獨(dú)立判斷做出的,請(qǐng)讀者明確相關(guān)結(jié)果。

4、如需轉(zhuǎn)載本方擁有版權(quán)的文章,請(qǐng)聯(lián)系拍明芯城(marketing@iczoom.com)注明“轉(zhuǎn)載原因”。未經(jīng)允許私自轉(zhuǎn)載拍明芯城將保留追究其法律責(zé)任的權(quán)利。

拍明芯城擁有對(duì)此聲明的最終解釋權(quán)。

相關(guān)資訊

拍明芯城微信圖標(biāo)

各大手機(jī)應(yīng)用商城搜索“拍明芯城”

下載客戶端,隨時(shí)隨地買賣元器件!

拍明芯城公眾號(hào)
拍明芯城抖音
拍明芯城b站
拍明芯城頭條
拍明芯城微博
拍明芯城視頻號(hào)
拍明
廣告
恒捷廣告
廣告
深亞廣告
廣告
原廠直供
廣告