久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6055|回復: 3
打印 上一主題 下一主題
收起左側

通過溫濕度傳感器HTU20D來加深理解分辨率和精度

[復制鏈接]
跳轉到指定樓層
樓主
ID:108935 發表于 2016-3-15 02:26 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
    昨天有人反應我寫的錯別字太多,那我恭喜你看明白了我想表達的意思,只要是我偏科偏得厲害。

言歸正傳啊!
       最近做的這個基于衛星定位的便攜式污染源監測系統,對溫濕度要有高了些,對價格也比較敏感,所以對溫濕度的選擇比較慎重了些。順便我有分析了下,AD的精度和分辨率的問題:

很多人對于精度和分辨率的概念不清楚,這里我做一下總結,希望大家不要混淆。

像我們搞電子的,經常跟“精度”與“分辨率”打交道。簡單點說,“精度”是用來描述物理量的準確程度的,而“分辨率”是用來描述刻度劃分的。從定義上看,這兩個量應該是風馬牛不相及的。我是這么理解的,“精度”就是描述物理量 的精確程度的,也就是我們常說的準不準的問題,或者說與真實值差多少的問題;“分辨率”是用來表述分辨能力的,分辨能力強的未必測試的準確,比如說溫度變化多少時它能分辨出來。
        在簡單做個比喻:有這么一把常見的塑料尺(中學生用的那種),它的量程是10厘米,上面有100個刻度,最小能讀出1毫米的有效值。那么我們就說這把尺子的分辨率是1毫米,或者量程的1%;而它的實際精度就不得而知了(算是0.1毫米吧)。當我們用火來烤一下它,并且把它拉長一段,然后再考察一下它。我們不難發現,它還有有100個刻度,它的“分辨率”還是1毫米,跟原來一樣!然而,您還會認為它的精度還是原來的0.1毫米么?(這個例子是引用網上的,個人覺得比喻的很形象!)


回到電子技術上,
所以很多朋友一談到精度,馬上就和分辨率聯系起來了,包括有些項目負責人,只會在那里說:這個系統精度要求很高啊,你們AD的位數至少要多少多少啊
其實,仔細瀏覽一下AD的數據手冊,會發現跟精度有關的有兩個很重要的指標:DNL和INL。似乎知道這兩個指標的朋友并不多,所以在這里很有必要解釋一下。
DNL:Differencial NonLiner——微分非線性度
INL:Interger NonLiner——積分非線性度(精度主要用這個值來表示)
他表示了ADC器件在所有的數值點上對應的模擬值,和真實值之間誤差最大的那一點的誤差值。也就是,輸出數值偏離線性最大的距離。單位是LSB(即最低位所表示的量)。當然,像有的AD如△—∑系列的AD,也用Linearity error來表示精度。

分辨率的計算:測量電壓范圍/(2^AD位數-1)

就HTU20D溫濕度傳感器來說:
溫度部分:

由上圖不難看出,在14bit時,HTU20D傳感器的溫度部分的分辨率是0.01°C,在12bit時,溫度的分辨率是0.04°C。這里的14bit與12bit就是設定的AD轉換的位數啊。但是大家看看表中給出的溫度的“精度(Temperature Accuracy@25°C)”是±0.3°C,不管你在設置AD轉換位數是14位還是12位時,傳感器本身的精度數不變的,0.3就是0.3°C。所以精度和分辨率是兩個完全不同的我概念。

下面再看看濕度吧

       HTU20D濕度的的“分辨率”是,在12bits時為0.04%RH; 在8bits時 0.7%RH,
那么他的“精度”總是±3%RH,   如此看來分辨率和精度真的是不同了,呵呵   大家再想想,同是在一個傳感器中的溫度和濕度兩個物理量的溫度的精度是±0.3,而濕度的精度是±3  。對吧
你在看看上面的兩個表格,如果吧溫度和濕度都設置是12bit時,他們的分辨率是相同的,都是0.04,不是嗎?你在仔細看看
至于0.04這個數是如何來的呢!  你知道嗎?  考慮考慮吧,

下面我給出我的讀寫HTU20D/HTU21D的程序僅供參考,不過我在項目中應用過了,還沒發現有什么問題呢
/*================================================================
【名 稱】void I2CDelay (unsigned char t)
【功 能】模擬IIC用的短延時
【備 注】
【作 者】
【時 間】2015年10月18日
================================================================*/
void I2CDelay (unsigned char t)
{
while(t--);
}
/*================================================================
【名 稱】void I2CInit(void)
【功 能】I2C初始化,空閑狀態
【備 注】
【作 者】
【時 間】2015年10月18日
================================================================*/
void I2CInit(void)
{
SDA = 1;
SCL = 1;
}

/*================================================================
【名 稱】void I2CStart(void)
【功 能】I2C起始信號
【備 注】SCL、SDA同為高,SDA跳變成低之后,SCL跳變成低
【作 者】
【時 間】2015年10月18日
================================================================*/
void I2CStart(void)
{
   SDA = 1;
   SCL = 1;
   I2CDelay(10);
   SDA = 0;
   I2CDelay(20);
   SCL = 0;
   I2CDelay(20);
}
/*================================================================
【名 稱】void I2CStop(void)
【功 能】I2C停止信號
【備 注】SCL、SDA同為低,SCL跳變成高之后,SDA跳變成高
【作 者】
【時 間】2015年10月18日
================================================================*/
void I2CStop(void)
{
   SDA = 0;
   SCL = 0;
I2CDelay(10);
   SCL = 1;
   I2CDelay(10);
   SDA = 1;
   I2CDelay(10);
}

/*================================================================
【名 稱】unsigned char I2CWRByte(unsigned char WRByte)
【功 能】I2C寫一個字節數據,返回ACK或者NACK
【備 注】從高到低,依次發送
【作 者】
【時 間】2015年10月18日
================================================================*/
unsigned char I2CWRByte(unsigned char WRByte)
{
unsigned char i;
SCL = 0;
for(i=0;i<8;i++)
{
  if(WRByte&0x80)
  {
   SDA = 1;
  }
  else
  {
   SDA = 0;
  }
  I2CDelay(10);
  SCL=1;   //輸出SDA穩定后,拉高SCL給出上升沿,從機檢測到后進行數據采樣
  I2CDelay(50);
  SCL=0;
  I2CDelay(10);
  WRByte <<= 1;
}
SDA = 1;
SCL = 1;
I2CDelay(20);
if(SDA==1)   //SDA為高,收到NACK
{
  SCL=0;
  I2CDelay(50);
  return NACK;
}
else     //SDA為低,收到NACK
{
  SCL=0;
  I2CDelay(50);
  return ACK;
}
}

/*================================================================
【名 稱】unsigned char I2CRDByte(unsigned char AckValue)
【功 能】I2C讀一個字節數據,入口參數用于控制應答狀態,ACK或者NACK
【備 注】從高到低,依次接收
【作 者】
【時 間】2015年10月18日
================================================================*/
unsigned char I2CRDByte(unsigned char AckValue)
{
unsigned char i,RDByte=0;
SCL = 0;
SDA = 1;   //釋放總線
for (i=0;i<8;i++)
{
  RDByte <<= 1; //移位
  SCL = 1;  //給出上升沿
  I2CDelay(30); //延時等待信號穩定
  if(SDA==1)   //采樣獲取數據
  {
   RDByte |= 0x01;
  }
  else
  {
   RDByte &= 0xfe;
  }
  SCL = 0;     //下降沿,從機給出下一位值
  I2CDelay(10);
}   
SDA =  AckValue; //應答狀態
I2CDelay(10);
SCL = 1;                        
   I2CDelay(50);         
   SCL = 0;
   SDA = 1;               
   I2CDelay(1);
return RDByte;
}
/*================================================================
【名 稱】void HTU21Init(void)
【功 能】HTU21初始化函數,主函數中調用
【備 注】從高到低,依次接收
【作 者】
【時 間】2015年10月18日
================================================================*/
void HTU21Init(void)
{
I2CInit();//I2C初始化
I2CStart();//啟動I2C
I2CWRByte(HTU21ADDR&0xfe);//寫HTU21I2C地址
I2CWRByte(0xfe);
I2CStop();//停I2C
Delay(600);//短延時
}

/*================================================================
【名 稱】long ReadHtu21(char whatdo)
【功 能】讀取函數函數
【備 注】
【作 者】
【時 間】2015年10月18日
================================================================*/
long ReadHtu21(char whatdo)
{
unsigned long temp;
unsigned char Humidity,HumidityH,HumidityL;
unsigned long wendu;
I2CStart();
if(I2CWRByte(HTU21ADDR&0xfe)==ACK)
{
  if(I2CWRByte(whatdo)==ACK)
  {
   do
   {
    Delay(30);
    I2CStart();
   }while(I2CWRByte(HTU21ADDR|0x01)==NACK);
   HumidityH = I2CRDByte(ACK);
   HumidityL = I2CRDByte(ACK);
   I2CRDByte(NACK);
   I2CStop();   
   HumidityL &= 0xfc;
   temp = HumidityH*256+HumidityL;
   
   if (whatdo==((char)0xf5))
   {
    Humidity = (unsigned char)((temp*125)/65536-6)%0xff;   
    return Humidity;
   }
   else
   {
    temp=((long)17572)*temp;
    temp=temp/((long)65536);
    wendu =temp-((long)4685);
    return wendu;  //輸出
   }  
  }
}
return 0;
}
你如果感覺有收獲就分享給更多的朋友吧,或者你把你的心得體會也分享給我和他。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:204196 發表于 2018-2-28 11:25 | 只看該作者
收藏,挺好的資料!
回復

使用道具 舉報

板凳
ID:126422 發表于 2018-5-29 19:58 | 只看該作者
買了一片測試,溫、濕度顯示,變化按+/-0.5變化,不是線性變化,大家遇到過嗎。
回復

使用道具 舉報

地板
ID:389478 發表于 2018-12-6 00:53 | 只看該作者
lijn 發表于 2018-5-29 19:58
買了一片測試,溫、濕度顯示,變化按+/-0.5變化,不是線性變化,大家遇到過嗎。

我的是+-0.7度,換SHT20就正常,用HTU20D就是+-0.7度,不理解為啥這樣。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 密乳av| 操操日| 国产一区二区三区四区 | 日韩欧美日韩在线 | 一区二区欧美在线 | 69av网| 国产精品一区二区福利视频 | 欧美视频日韩 | 欧美久久久久久久 | 国产精品久久久久久吹潮 | 精品一区二区久久久久久久网站 | 国产日韩精品在线 | 一区二区免费看 | 国产精品一区在线播放 | 欧美福利视频 | 瑟瑟免费视频 | 欧美乱大交xxxxx另类电影 | 国产精品爱久久久久久久 | 亚洲欧美一区二区三区1000 | 性高湖久久久久久久久3小时 | 激情av网站 | 国偷自产av一区二区三区 | 久久精品成人 | 中文字幕在线观看精品 | 色综合视频 | 一级黄色片免费在线观看 | 国产区精品在线观看 | 国产精品网页 | 亚洲精品乱码久久久久久9色 | a视频在线播放 | 亚洲成色777777在线观看影院 | 一区二区国产精品 | 国产一区二 | 亚洲精品一区二区三区 | 精品美女| 日韩精品久久一区 | 国产高清视频在线观看 | 91精品国产综合久久久密闭 | 亚洲一区二区三区在线观看免费 | 成人黄页在线观看 | 亚洲精品免费在线 |