 數模(mo)轉換(huan)(芯(xin)片PCF8591)
							時(shi)間:2018-08-15      來(lai)源:未知
							數模(mo)轉換(huan)(芯(xin)片PCF8591)
							時(shi)間:2018-08-15      來(lai)源:未知 
							一.AD轉換的概念
AD轉(zhuan)換的功(gong)能是把模擬(ni)量(liang)電壓轉(zhuan)換為數(shu)字量(liang)電壓。DA轉(zhuan)換的功(gong)能正(zheng)好相反,就是將數(shu)字量(liang)轉(zhuan)換位(wei)模擬(ni)量(liang)。
二.芯片PCF8591介紹
PCF8591是一(yi)個(ge)單(dan)片集(ji)成、單(dan)獨供電、低功耗、8-bit CMOS數據(ju)獲取器件。PCF8591具有4個(ge)模(mo)擬輸入(ru)、1個(ge)模(mo)擬輸出(chu)和1個(ge)串行I²C總線(xian)接(jie)口。PCF8591的3個(ge)地址引腳A0, A1和A2可用于硬件地址編程,允(yun)許在同(tong)個(ge)I2C總線(xian)上接(jie)入(ru)8個(ge)PCF8591器件,而無需(xu)額外的硬件。在PCF8591器件上輸入(ru)輸出(chu)的地址、控(kong)制和數據(ju)信(xin)號都是通過雙(shuang)(shuang)線(xian)雙(shuang)(shuang)向I²C總線(xian)以串行的方式進行傳輸。
PCF8591 是具有(you)(you)I2C 總線接(jie)口的8 位A/D 及D/A 轉換(huan)器。有(you)(you)4 路A/D 轉換(huan)輸入,1 路D/A 模擬輸出(chu)。這(zhe)就是說(shuo),它既可(ke)以作(zuo)A/D 轉換(huan)也可(ke)以作(zuo)D/A 轉換(huan)。A/D 轉換(huan)為逐次(ci)比較型。電源電壓典型值為5V。
AIN0~AIN3:模擬(ni)信(xin)號輸入端(duan)。
A0~A3:引腳地址端。
VSS:電源(yuan)負極。
SDA、SCL:I2C 總線(xian)(xian)的數據線(xian)(xian)、時鐘線(xian)(xian)。
OSC:外部時(shi)鐘(zhong)輸入端,內部時(shi)鐘(zhong)輸出端。
EXT:內部、外(wai)部時(shi)(shi)鐘選(xuan)擇線,使用內部時(shi)(shi)鐘時(shi)(shi)EXT 接地。
AGND:模(mo)擬信號地。
VREF:基準電源端。
AOUT:D/A 轉換輸出端。
VDD:電源端。(2.5~6V)
 
模塊原理圖
PCF8591的(de)器件地址:
PCF8591 采用(yong)典型的(de)I2C 總(zong)線接口(kou)器(qi)(qi)件尋址(zhi)(zhi)方(fang)法,即總(zong)線地(di)(di)址(zhi)(zhi)由器(qi)(qi)件地(di)(di)址(zhi)(zhi)、引腳(jiao)地(di)(di)址(zhi)(zhi)和(he)方(fang)向(xiang)位(wei)組(zu)成(cheng)。飛(fei)利蒲公司規定A/D 器(qi)(qi)件地(di)(di)址(zhi)(zhi)為(wei)(wei)(wei)1001。引腳(jiao)地(di)(di)址(zhi)(zhi)A2A1A0,其(qi)值由用(yong)戶選擇,因此I2C 系統(tong)中(zhong)多可(ke)接2^3=8 個具有I2C 總(zong)線接口(kou)的(de)A/D 器(qi)(qi)件。地(di)(di)址(zhi)(zhi)的(de)后一(yi)位(wei)為(wei)(wei)(wei)方(fang)向(xiang)位(wei)R/w ,當(dang)主(zhu)控器(qi)(qi)對A/D 器(qi)(qi)件進行(xing)讀操(cao)作(zuo)時為(wei)(wei)(wei)1,進行(xing)寫(xie)操(cao)作(zuo)時為(wei)(wei)(wei)0。總(zong)線操(cao)作(zuo)時,由器(qi)(qi)件地(di)(di)址(zhi)(zhi)、引腳(jiao)地(di)(di)址(zhi)(zhi)和(he)方(fang)向(xiang)位(wei)組(zu)成(cheng)的(de)從(cong)地(di)(di)址(zhi)(zhi)為(wei)(wei)(wei)主(zhu)控器(qi)(qi)發送(song)的(de)第(di)一(yi)字節。
  
D7~D4:1001
D3~D1:分別是(shi)A2、A1、A0的電平,我們原理圖上面是(shi)全部接地(di),所以為000。
D0:為方(fang)向設置,當為1時進(jin)(jin)行(xing)讀(du)操作,當為0時進(jin)(jin)行(xing)寫操作。
PCF8591的控制寄存器
  
D1、D0:AD通(tong)道(dao)選(xuan)擇00通(tong)道(dao)0,01通(tong)道(dao)1,10通(tong)道(dao)2,11通(tong)道(dao)3
D2:自動增益(yi)選擇(有效位(wei)為1)
D5、D4:輸(shu)入模(mo)(mo)式(shi)選擇:00四(si)路(lu)單數輸(shu)入;01三路(lu)差分(fen)輸(shu)入;10單端與差分(fen)配合(he)輸(shu)入;11為模(mo)(mo)擬輸(shu)入有效
D6:模(mo)擬輸出(chu)使能(neng)位。(時能(neng)為1)
I2C總線的(de)數據(ju)傳送
起始、終止、應答信號時序圖
主機(ji)可以采用(yong)不帶I2C總線(xian)接口(kou)的單片機(ji),如80C51、AT89C2051等單片機(ji),利用(yong)軟件(jian)實現I2C總線(xian)的數(shu)據傳(chuan)送(song),即軟件(jian)與(yu)硬件(jian)結合(he)的信(xin)號模(mo)擬(ni)。為了保證數(shu)據傳(chuan)送(song)的可靠性(xing),標準的I2C總線(xian)的數(shu)據傳(chuan)送(song)有嚴格的時序要(yao)求。I2C總線(xian)的起始信(xin)號、終止信(xin)號、發(fa)送(song)“0”及發(fa)送(song)“1”的模(mo)擬(ni)時序 :
  
起始信號程序:
void Start_I2c()
{
sda=1; /*發送起始條件的數據信號*/
_nop_();
scl=1;
_nop_(); /*起(qi)始條件建立時間大(da)于4.7us,延時*/
_nop_(); _nop_(); _nop_(); _nop_();
sda=0; /*發(fa)送起(qi)始信號*/
_nop_(); /* 起始條(tiao)件(jian)鎖定(ding)時間大(da)于4μs*/
_nop_(); _nop_(); _nop_(); _nop_();
scl=0; /*開啟(qi)I2C總(zong)線,準備發送或接(jie)收數據 */
_nop_(); _nop_();
}
終止信號程序:
void Stop_I2c()
{
sda=0; /*發送(song)結束條件(jian)的(de)數據信號*/
_nop_(); /*發送結束條件的時鐘信(xin)號(hao)*/
scl=1; /*結(jie)束條件(jian)建立時間大(da)于4μs*/
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
sda=1; /*發送(song)I2C總線結束信號*/
_nop_(); _nop_(); _nop_(); _nop_();
}
應答信號程序(xu):
void Ack_I2c(bit a)
{
if(a==0)sda=0; /*在(zai)此發(fa)出應答或(huo)非應答信號 */
else sda=1;
_nop_(); _nop_(); _nop_();
scl=1;
_nop_(); /*時(shi)鐘(zhong)低電平周期(qi)大于4μs*/
_nop_(); _nop_(); _nop_(); _nop_();
scl=0; /*清(qing)時鐘線(xian),開啟I2C總(zong)線(xian)以便繼續接收*/
_nop_(); _nop_();
}
PCF8591的寫入
第一(yi)個字(zi)節是器(qi)件地址和讀(du)寫控制
第二個字節被存到控(kong)制寄存器,用于控(kong)制器件功(gong)能。
第三個字(zi)節被存儲(chu)到DAC數(shu)據(ju)寄存器(qi),并(bing)使用(yong)片上(shang)D/A轉換器(qi)轉換成對應的模擬電壓(ya)。(所以(yi)(yi)不輸入D/A時(shi),可以(yi)(yi)不用(yong)輸入。)
PCF8591發(fa)送一個字節的程(cheng)序
bit PCF8591_SendByte(unsigned char addr,unsigned char channel)
{
Start_I2c(); //啟動(dong)總(zong)線
I2C_SendByte(addr); //發送(song)器(qi)件地址
if(ack==0)return(0);
I2C_SendByte(0x40|channel); //發送(song)控制字節
if(ack==0)return(0);
Stop_I2c(); //結束總線
return(1);
}
PCF8591的讀取(qu)
讀(du)取(qu)(qu)的(de)(de)第一(yi)(yi)(yi)個(ge)字(zi)節(jie)是包含(han)上一(yi)(yi)(yi)次轉換(huan)結(jie)果(guo)。將上一(yi)(yi)(yi)個(ge)字(zi)節(jie)讀(du)取(qu)(qu)時,才(cai)開始(shi)進行(xing)這(zhe)次轉換(huan)的(de)(de)采(cai)樣。讀(du)取(qu)(qu)的(de)(de)第二個(ge)字(zi)節(jie)才(cai)是這(zhe)次的(de)(de)轉換(huan)結(jie)果(guo)。所以讀(du)取(qu)(qu)轉換(huan)結(jie)果(guo)的(de)(de)步驟是:發送轉換(huan)命令(ling),將上次的(de)(de)結(jie)果(guo)讀(du)走,然后(hou)等一(yi)(yi)(yi)會兒(er),然后(hou)讀(du)取(qu)(qu)結(jie)果(guo)。
  
PCF8591讀取一個(ge)字(zi)節的程序:
unsigned char PCF8591_RcvByte(unsigned char addr)
{ unsigned char dat;
Start_I2c(); //啟動總(zong)線
I2C_SendByte(addr+1); //發送器件地址
if(ack==0)return(0);
dat=I2C_RcvByte(); //讀取數據
Ack_I2c(1); //發送(song)非應答信號
Stop_I2c(); //結束總線(xian)
return(dat);
}
PCF8591發送一次轉換的程序(xu):
bit Pcf8591_DaConversion(unsigned char addr,unsigned char channel, unsigned char Val)
{
Start_I2c(); //啟動(dong)總線
I2C_SendByte(addr); //發送器件地址
if(ack==0)return(0);
I2C_SendByte(0x40|channel); //發送控制字節
if(ack==0)return(0);
I2C_SendByte(Val); //發送DAC的數值
if(ack==0)return(0);
Stop_I2c(); //結束總線
return(1);
}

