PCF8591

辣雞芯片,無人能敵。沒有if,就是菜雞。

寫在前面

注意:
ADC讀值時一定要加if來限制
例如參考電壓是5V,爲方便處理放大十倍爲50V,那麼讀出來的值 Val最大就是50,最小是0,
要加上if(Val > 0 && Val<50)的語句,PCF8591才能正常工作。原因是過快的IIC導致讀出亂碼,需要判斷該值是否合法,即當前Val是不是理論上的可能出現的值,再做其他操作。


ADC

AD/DA的主要參數:

1、位數:表明這個AD共有2^n個刻度,例如8位AD,輸出的刻度是0~255。
2、分辨率:就是AD能夠分辨的最小的模擬量變化,假設5.10V的系統用8位的AD採樣,那麼它能分辨的最小電壓就是5.10/255=0.02V。
3、INL(Interger NonLiner): 積分非線性度,表示了ADC器件在所有的數值點上對應的模擬值和真實值之間誤差最大的那一點的誤差值。也就是說,輸出數值偏離線性最大的距離。單位是LSB(即最低位所表示的量)。比如12位ADC:TLC2543,INL值爲1LSB。那麼,如果基準4.095V,測某電壓得的轉換結果是1000,那麼,真實電壓值可能分佈在0.999~1.001V之間。這裏是這樣這樣計算得來的,12位ADC最小分辨率是1/4095。在這裏即爲4.095*(1/4095)=0.001V。那麼1LSB就爲0.001V,。轉換結果爲1000即爲1V。
4、DNL(Differencial NonLiner):差分非線性度,ADC相鄰兩刻度之間最大的差異就叫差分非線性值。理論上說,模數器件相鄰量個數據之間,模擬量的差值都是一樣的。就像一把疏密均勻的尺子。但實際並不如此。一把分辨率1毫米的尺子,相鄰兩刻度之間也不可能都是1毫米整。那麼,DNL值如果大於1,那麼這個ADC甚至不能保證是單調的,輸入電壓增大,在某個點數值反而會減小。這種現象在SAR(逐位比較)型ADC中很常見。
5、基準源:有內部基準源、外部基準源等等。
6、轉換速率:也就是轉換週期的倒數,轉換週期就是完成一次AD轉換所需的時間。


PCF8591

第一字節:器件地址

在這裏插入圖片描述

第二字節:命令字節

在這裏插入圖片描述

  • MSB :0
  • bit7:模擬輸出使能位
  • bit6、5:00(四通道獨立輸入)、01(012與3差分輸入)、10(01獨立,23差分)、11(01差分,02差分)
  • bit4:自動進位值

第三字節:DAC字節

在這裏插入圖片描述


驅動

//PCF8591.h

#include"I2C.h"
#define VCC 48			//定義基準電壓*10
#define PCF8591_Addr 0x90	//定義PCF8591地址
//PCF8591.c

u8 Get_ADC_Val(u8 ch)
{
 u8 Val = 0;
 I2C_Start();
 
 if(!I2C_Write(PCF8591_Addr))
 {
  I2C_Stop();
  return 0;
 }
  
 I2C_Write(ch);
 I2C_Start();
 I2C_Write(PCF8591_Addr | 0x01);
 
 I2C_Read();
 Transmit_Ack();
 Val = I2C_Read();
 I2C_Stop();
 
 Val = (Val*VCC)/255;
 return Val;
}
//PCF8591.c

void Set_DAC_Out(u8 Val)
{
 Val = (val*255)/VCC;
 
 I2C_Start();
 if(!I2C_Write(PCF8591_Addr))
 {
  I2C_Stop();
  return;
 }
 I2C_Write(0x40);
 I2C_Write(Val);
 I2C_Stop(); 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章