<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 數字溫濕度計設計

數字溫濕度計設計

作者: 時(shí)間:2023-12-15 來(lái)源:電子森林 收藏

實(shí)驗任務(wù)

  • 任務(wù):基于核心板 和 底板 完成計設計并觀(guān)察調試結果
  • 要求:驅動(dòng)底板上的溫濕度傳感器SHT-20測量空氣中的溫度和濕度,將溫濕度信息顯示在8位掃描式數碼管上。
  • 解析:通過(guò)編程驅動(dòng)I2C接口溫濕度傳感器SHT-20,獲取溫濕度碼值信息,將兩種碼值信息經(jīng)過(guò)運算轉換成物理溫度濕度數據,然后經(jīng)過(guò)BCD轉碼處理并顯示到掃描式數碼管上。

實(shí)驗目的

前面的章節中我們學(xué)習了掃描式數碼管模塊和BCD轉碼模塊的工作原理及驅動(dòng)方法,也對I2C總線(xiàn)協(xié)議及相關(guān)知識,本實(shí)驗主要對I2C總線(xiàn)驅動(dòng)方法加以練習,同時(shí)熟悉設計中常用運算方法,最終完成計總體設計。

本文引用地址:http://dyxdggzs.com/article/202312/453963.htm
  • 復習I2C總線(xiàn)工作原理及通信協(xié)議
  • 練習I2C接口驅動(dòng)設計方法,完成溫濕度傳感器SHT-20驅動(dòng)設計
  • 完成計總體設計

設計框圖

根據前面的實(shí)驗解析我們可以得知,該設計可以拆分成兩個(gè)功能模塊實(shí)現,

  • SHT20Driver:溫濕度傳感器SHT-20芯片I2C總線(xiàn)通信驅動(dòng)模塊。 * Calculate:完成溫濕度碼值到數碼管顯示之間的運算、轉碼和顯示控制。 * bintobcd:將二進(jìn)制數據轉換成BCD碼的方法。。 * Segmentscan:通過(guò)驅動(dòng)掃描式數碼管將溫濕度數據顯示出來(lái)。

Top-Down層次設計

 

模塊結構設計

實(shí)驗原理

SHT-20模塊介紹

SHT-20是一款集成溫度和濕度感測于一體的傳感器芯片,采用3mm x 3mm貼片DFN封裝,數字I2C總線(xiàn)接口,管腳功能描述如下:

管腳功能描述

SHT-20芯片典型電路連接如下:

典型電路連接

SHT-20芯片可以配置不同的分辨率模式,User Register中的bit0和bit7控制分辨率模式選擇,默認狀態(tài)溫度T和濕度RH分別采用14bit和12bit模式

分辨率模式配置

不同的分辨率模式下,溫度和濕度分辨率不同,默認狀態(tài)溫度和濕度分辨率分別為0.01℃和0.04%RH。

溫度和濕度分辨率

不同的分辨率模式下,溫度和濕度的轉換時(shí)間也是不同的,默認狀態(tài)溫度和濕度最大轉換時(shí)間分別為85ms和29ms。

溫度和濕度轉換時(shí)間

溫度和濕度測量范圍如下:

溫度和濕度測量范圍

SHT-20模塊連接

底板上的溫濕度傳感器SHT-20模塊電路圖如下(上拉電阻未顯示):

SHT-20模塊電路

上圖為溫濕度傳感器SHT-20模塊電路,與硬件接口有I2C總線(xiàn)(SCL、SDA),SHT2x 傳感器包含電容式濕度傳感器、帶隙溫度傳感器和專(zhuān)用的模擬和數字集成電路-全部放在單 CMOSens?芯片上。這在精度和穩定性方面, 以及功耗最小的情況下, 都能產(chǎn)生無(wú)與倫比的傳感器性能, SHT20的分辨率可以通過(guò)命令 (RH/T 的8/12 位到12/14 位) 進(jìn)行更改, 并且校驗和有助于提高通信的可靠性。

SHT-20模塊驅動(dòng)設計

智能接近系統設計實(shí)驗中我們已經(jīng)講述學(xué)習過(guò)I2C總線(xiàn)驅動(dòng)的設計,本實(shí)驗可以上原來(lái)的基礎上調整,首先來(lái)了解SHT-20時(shí)序中的參數要點(diǎn)。

SHT-20時(shí)序圖

SHT-20時(shí)序參數

通過(guò)SHT-20時(shí)序參數了解,SHT-20支持I2C通信400KHz快速模式同時(shí)兼容100KHz的標準模式,還有兩種模式下時(shí)序中的各種時(shí)間參數,所以通信速度不需要調整。

  • 普通列表項目分頻得到400KHz的時(shí)鐘,程序實(shí)現同智能接近系統設計實(shí)驗。

I2C時(shí)序基本單元(啟動(dòng)、停止、發(fā)送、接收、發(fā)應答、讀應答)協(xié)議里統一的,所以所以基本單元狀態(tài)的設計也是不需要調整的。

  • 啟動(dòng)時(shí)序狀態(tài)設計程序實(shí)現同智能接近系統設計實(shí)驗。
  • 發(fā)送單元和讀應答單元合并,時(shí)序狀態(tài)設計程序實(shí)現同智能接近系統設計實(shí)驗。
  • 接收單元和寫(xiě)應答單元合并,時(shí)序狀態(tài)設計程序實(shí)現同智能接近系統設計實(shí)驗。
  • 停止時(shí)序狀態(tài)設計程序實(shí)現同智能接近系統設計實(shí)驗。

SHT-20驅動(dòng)的流程,手冊上看到SHT-20芯片有很多指令,指令列表如下:

SHT-20基礎指令

本實(shí)驗涉及軟件復位、溫度測量和濕度測量三個(gè)操作分別查看其時(shí)序流程。

軟件復位

軟件復位操作時(shí)序流程如下:

軟件復位操作

我們將這種操作設計成一個(gè)一個(gè)狀態(tài),程序實(shí)現如下:

MODE1:begin //單次寫(xiě)操作
        if(cnt_mode1 >= 4'd4) cnt_mode1 <= 1'b0;    //對START中的子狀態(tài)執行控制cnt_start
        else cnt_mode1 <= cnt_mode1 + 1'b1;
        state_back <= MODE1;
        case(cnt_mode1)
            4'd0:   begin state <= START; end   //I2C通信時(shí)序中的START
            4'd1:   begin data_wr <= dev_addr<<1; state <= WRITE; end   //設備地址
            4'd2:   begin data_wr <= reg_addr; state <= WRITE; end  //寄存器地址
            4'd3:   begin state <= STOP; end    //I2C通信時(shí)序中的STOP
            4'd4:   begin state <= MAIN; end    //返回MAIN
            default: state <= IDLE; //如果程序失控,進(jìn)入IDLE自復位狀態(tài)
        endcase
    end

溫濕度測量

溫度測量分為兩種模式:hold master和no hold master,兩種模式都可用但時(shí)序不同,本實(shí)驗我們使用no hold master,濕度測量流程同溫度測量流程,只是指令不一樣。其操作時(shí)序流程如下:

溫濕度采樣操作

根據問(wèn)濕度測量的時(shí)序流程,我們分為兩部分,寫(xiě)指令部分和讀數據部分,寫(xiě)指令部分比復位操作時(shí)序流程多了20us的等待,且20us等待不是必須的,可以直接使用MODE1狀態(tài)完成,讀數據部分如果沒(méi)有測量完成尋址時(shí)就會(huì )不應答,如果測量完成時(shí)序流程程序實(shí)現如下:

MODE2:begin //兩次讀操作
        if(cnt_mode2 >= 4'd7) cnt_mode2 <= 4'd0;    //對START中的子狀態(tài)執行控制cnt_start
        else cnt_mode2 <= cnt_mode2 + 1'b1;
        state_back <= MODE2;
        case(cnt_mode2)
            4'd0:   begin state <= START; end   //I2C通信時(shí)序中的START
            4'd1:   begin data_wr <= (dev_addr<<1)|8'h01; state <= WRITE; end//設備地址
            4'd2:   begin ack <= ACK; state <= READ; end    //讀寄存器數據
            4'd3:   begin dat_h <= data_r; end
            4'd4:   begin ack <= NACK; state <= READ; end   //讀寄存器數據
            4'd5:   begin dat_l <= data_r; end
            4'd6:   begin state <= STOP; end    //I2C通信時(shí)序中的STOP
            4'd7:   begin state <= MAIN; end    //返回MAIN
            default: state <= IDLE; //如果程序失控,進(jìn)入IDLE自復位狀態(tài)
        endcase
    end

最后我們編程控制狀態(tài)機按照驅動(dòng)例程代碼中流程運行,程序實(shí)現如下:

MAIN:begin
        if(cnt_main >= 4'd9) cnt_main <= 4'd2;      //寫(xiě)完控制指令后循環(huán)讀數據
        else cnt_main <= cnt_main + 1'b1;   
        case(cnt_main)
            //軟件復位
            4'd0:   begin dev_addr <= 7'h40; reg_addr <= 8'hfe; state <= MODE1; end 
            4'd1:   begin num_delay <= 24'd6000; state <= DELAY; end //復位時(shí)間,15ms
            //測量溫度
            4'd2:   begin dev_addr <= 7'h40; reg_addr <= 8'hf3; state <= MODE1; end 
            4'd3:   begin num_delay <= 24'd34000; state <= DELAY; end //溫度轉換,85ms 
            4'd4:   begin dev_addr <= 7'h40; state <= MODE2; end    //讀取配置
            4'd5:   begin T_code <= {dat_h,dat_l}; end  //讀取數據
            //測量濕度
            4'd6:   begin dev_addr <= 7'h40; reg_addr <= 8'hf5; state <= MODE1; end 
            4'd7:   begin num_delay <= 24'd12000; state <= DELAY; end //濕度轉換,30ms
            4'd8:   begin dev_addr <= 7'h40; state <= MODE2; end    //讀取配置
            4'd9:   begin H_code <= {dat_h,dat_l}; end  //讀取數據
            default: state <= IDLE; //如果程序失控,進(jìn)入IDLE自復位狀態(tài)
        endcase
    end
系統總體實(shí)現

SHT-20驅動(dòng)模塊得到的是溫度和濕度的編碼值,想要得到℃和%RH的溫度和濕度的數據還需要運算,運算后的數據是二進(jìn)制數,想要顯示在數碼管上還需要BCD轉碼。先考慮運算:

溫度運算 

濕度運算

這里我們以溫度的運算為例,FPGA不擅長(cháng)小數的運算,我們可以將小數運算轉換成整數運算處理,如下:

T = -46.85 + 175.72 * Tcode / 2^16 = (-4685 + 17572 * Tcode / 2^16) / 100

程序實(shí)現如下:

wire [31:0] a = T_code * 16'd17572;
wire [31:0] b = a >> 16; //除以2^16取商
wire [31:0] c = (b>=32'd4685)?(b - 32'd4685):(32'd4685 - b);//絕對值
wire [15:0] T_data_bin = c[15:0];

上面程序中沒(méi)有除以100的運算,沒(méi)有集成專(zhuān)用除法器的FPGA實(shí)現除法運算非常麻煩,需要大量的邏輯資源且性能不佳,通常我們不在FPGA中直接做除法運算,上面程序中兩個(gè)除法。

⑴除以2^16可以通過(guò)右移16位方式解決。

⑵除以100在二進(jìn)制數中不好解決,而在BCD碼的十進(jìn)制數據很好處理,相當于小數點(diǎn)左移兩位(十進(jìn)制位),所以等完成BCD碼后再來(lái)處理。

BCD轉碼在前面電壓器實(shí)驗中介紹過(guò),這里直接例化,程序實(shí)現如下:

//進(jìn)行BCD轉碼處理
//小數點(diǎn)在BCD碼基礎上左移2位,完成除以100的操作
//移位后T_data_bcd[19:16]百位,[15:12]十位,[11:8]個(gè)位,[7:0]兩個(gè)小數位
wire [19:0] T_data_bcd;
bin_to_bcd u1
(
.rst_n              (rst_n      ),  //系統復位,低有效
.bin_code           (T_data_bin ),  //需要進(jìn)行BCD轉碼的二進(jìn)制數據
.bcd_code           (T_data_bcd )   //轉碼后的BCD碼型數據輸出
); 
//4位數碼管用于溫度顯示,保留1位小數//若溫度為負,將T_data_bcd[19:16]百位數據用數字A替換,同時(shí)把數碼管A的字庫顯示負號
assign T_data = (b>=32'd4685)? T_data_bcd[19:4]:{4'ha,T_data_bcd[15:4]};
assign dot_en[7:4] = 4'b0010;  //小數點(diǎn)顯示使能

設計到這里,將4個(gè)BCD碼顯示在4個(gè)數碼管上,就可以實(shí)現溫度的顯示了,另外還可以增加高位消零的設計,讓數碼管顯示更加符合人的習慣

//數據顯示使能,高位消零
assign dat_en[7] = |T_data[15:12]; //自或
assign dat_en[6] = (b>=32'd4685)?(|T_data[15:8]):(|T_data[11:8]);
assign dat_en[5:4] = 2'b11;

綜合后的設計框圖如下:

RTL設計框圖

實(shí)驗步驟

  1. 雙擊打開(kāi)Quartus Prime工具軟件;
  2. 新建工程:File → New Project Wizard(工程命名,工程目錄選擇,設備型號選擇,EDA工具選擇);
  3. 新建文件:File → New → Verilog HDL File,鍵入設計代碼并保存;
  4. 設計綜合:雙擊Tasks窗口頁(yè)面下的Analysis & Synthesis對代碼進(jìn)行綜合;
  5. 管腳約束:Assignments → Assignment Editor,根據項目需求分配管腳;
  6. 設計編譯:雙擊Tasks窗口頁(yè)面下的Compile Design對設計進(jìn)行整體編譯并生成配置文件;
  7. 程序燒錄:點(diǎn)擊Tools → Programmer打開(kāi)配置工具,Program進(jìn)行下載;
  8. 觀(guān)察設計運行結果。

實(shí)驗現象

將程序加載到FPGA,觀(guān)察數碼管顯示,左邊4位數碼管顯示溫度,右邊4位數碼管顯示濕度,用手接觸溫濕度傳感器,觀(guān)察顯示變化。

實(shí)驗現象



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>