采用DS18B20作溫度補償的超聲波液位計 摘要:介紹一種利用 DS18B20 溫度傳感器作溫度補償實現超聲波液位計的設計方案,在分析超聲波測量液位的誤差來源之后,詳細介紹了系統硬件和軟件的設計方法。實驗結果表明,本測量方案工作穩定,性能良好,較之以往的測量方案有許多優點。 超聲液位測量具有響應時間短、連續液位測量、實時性強等優點,在水利、氣象和環保領域有廣泛的應用,但是其測量結果受溫度的影響大,必須采用溫度補償。溫度補償的方法很多,傳統的補償方案有許多不足之處,本研究采用了一種簡潔且實用的溫度補償方案,實現了超聲波液位計的準確測量。 1 超聲波液位測量與溫度補償 1.1超聲波液位計的測量原理 本液位計采用時差法測量原理,由單片機控制超聲傳感器連續發射超聲波進行液位測量,計算公式如下L = H–V ×T / 2 式中,L 為液位高度;V 為超聲波在空氣中的傳播速度;T 為超聲波渡越時間;H 為超聲傳感器至液體容器底面的總距離。 1.2 溫度補償的必要性 超聲波是一種聲波,它的傳播速度受空氣密度的影響,密度越大,傳播速度越快,而空氣密度和溫度有密切關系,所以溫度變化時,聲速也變化,導致測量不準確。超聲波傳播速度和溫度有如下近似的關系V =331.5 + 0.607 × T (℃) 當溫度為 20 ℃時,V=344 m/s ,當溫度為 30 ℃時,V=350m/s,聲速變化為 6 m/s。設超聲波傳播距離 S=1 m,若在 30℃以 20 ℃的聲速進行測量時,誤差達到 3.5 cm。可見要實現高精度的液位測量,必須對聲速進行溫度補償。常用的測溫補償方法有:熱敏電阻,鉑電阻,熱電偶以及IC 溫度傳感器補償。使用傳統的溫度傳感器,硬件電路復雜,而且輸出為電壓或是電流值,需要進行 A/D 轉換。DS18B20 是 DALLAS 公司推出的數字式單總線溫度傳感器,硬件接口電路簡單,分辨率可達到 0.062 5 ℃,能很好地補償超聲波在不同溫度時的傳播速度,從而保證了液位測量的精度。 2 用 DS18B20 實現溫度補償的方案 DS18B20 是單總線數字式溫度傳感器,分辨率可編程,分為 9 位、10 位、11 位和 12 位,測溫范圍是-55~+125 ℃,在-10~+85 ℃,準確度為±0.5 ℃,允許用戶進行高低溫報警設定。下面說明其操作方法。 (1)DS18B20 的引腳圖與接線方法。 ![]() 圖 1 中,(a)為 TO-92 型封裝的 DS18B20 的引腳圖,其引腳:GND 為地;VDD 為電源;DQ 為數據輸入/輸出端。(b)為DS18B20 的典型接線圖,就兩種方式相比較而言,(1)寄生電源工作方式少用一根導線,但它完成溫度測量所需的時間較長,而外部電源方式測量速度較快,工作可靠,推薦使用(2)外接電源工作方式。 (2)DS18B20 的讀寫。 DS18B20 遵 循 典 型 的1—Wire 總線讀寫時序:第一步初始化→第二步ROM 命令→第三步 DS18B20功能命令。 每次對 DS18B20 進行操作的時候必須嚴格按照上述時序,任何的步驟遺漏或者顛倒,DS18B20 都不會響應。但是搜索 ROM(F0H)和報警搜索(ECH)兩個命令例外,在執行了這些命令后操作時序必須回第一步。DS18B20 對時序要求嚴格,程序一般用匯編語言編寫;采用 C51 語言編程時最好使用定時器延時或是調用內部庫函數_nop_( )來延時。DS18B20 的時序圖以及部分程序可從數據手冊上獲得。 3 液位計的硬件結構 本超聲波液位計的硬件框圖如圖 2 所示。整個電路分為一次電路部分和二次電路部分,一次部分包括超聲波傳感器、收發電路、測溫電路及回波處理電路;二次部分為鍵盤和顯示部分。AT89C2051 控制 NE555時基電路產生 40 kHz 方波,經 MOSFET 功率放大,驅動超聲傳感器發射超聲波,超聲波傳感器型號為 T/R40-16;經液面反射回來的微弱信號由 CA3140 組成的二級交流運放放大后,通過檢波電路和比較器產生一個下降沿,接入外部中斷 INT0, 產生中斷后,計數器停止計數,得到時間差;同時讀取 DS18B20 所測得的溫度,根據此溫度修正聲速,計算得到液位值。對此數值進行濾波處理,每 8 次數據排序,去掉最大和最小值,取中間 6 個數據求平均值,和溫度數值一起送給二次部分 CPU,二次部分根據總距離H 計算液位值并負責顯示。 串行通信電路的功能是把采集到的有效的液位信號和溫度信號傳送給二次部分,并接收其發送的聯絡命令。在這里利用 MAXIM 公司的芯片 MAX485 將 TTL 電平轉為 RS485 電平。采用 RS485 通信接口數據傳送距離遠,便于實現遠程監測。
![]()
![]() 4 軟件編程 圖 3 為液位計軟件流程圖 DS18B20 測量子程序及液位計主程序: #include #include #include /* enable the MCS51 instruction */ #define uchar unsigned char /*cpu P1^3 => DS18B20 data wire */ sbit DQ = P1^3; //DS18B20 初始化程序 // reset, return presence, if ready,presence=0 uchar ds_reset(void) { uchar presence; DQ = 0; _nop_(); //begin to reset delay5(96); //maintain DQ=0 for 480 μs DQ = 1; delay5(9) ; //wait for the presence presence = DQ; //get presence signal delay5(75); return(presence); //return the presence information // if has reply ,presence=0 // if not ,presence=1 } 液位計一次部分主程序: void main(void) { iniate(); //主程序初始化 comtest (); while (1) { transwv (); recwv (); //等待回波,出口為時間值 gettp(); //啟動 DS18B20,獲取溫度 deal(); //計算聲速和液位值 outdata(); //將溫度和液位數據從串行口輸出 } } 5 實驗結果 實驗結果如表 1 所示,溫度條件(t =15 ℃)。
![]() 從表 1 可以看出,在補償前所測的液位數據明顯偏大,原因是沒有進行聲速補償,采用的聲速為 t =25 ℃ 時的值;采用DS18B20 補償溫度后,該液位計在 0.2~3 m 的有效范圍內誤差小于 0.5%FS,完全能夠滿足一般工程和環境監測部門的需求。 (責任編輯:admin) |