數(shù)模轉(zhuǎn)換(芯片PCF8591)
時間:2018-03-08作者:華清遠見
一.AD轉(zhuǎn)換的概念 AD轉(zhuǎn)換的功能是把模擬量電壓轉(zhuǎn)換為數(shù)字量電壓。DA轉(zhuǎn)換的功能正好相反,就是將數(shù)字量轉(zhuǎn)換位模擬量。 二.芯片PCF8591介紹 PCF8591是一個單片集成、單獨供電、低功耗、8-bit CMOS數(shù)據(jù)獲取器件。PCF8591具有4個模擬輸入、1個模擬輸出和1個串行I²C總線接口。PCF8591的3個地址引腳A0, A1和A2可用于硬件地址編程,允許在同個I2C總線上接入8個PCF8591器件,而無需額外的硬件。在PCF8591器件上輸入輸出的地址、控制和數(shù)據(jù)信號都是通過雙線雙向I²C總線以串行的方式進行傳輸。 PCF8591 是具有I2C 總線接口的8 位A/D 及D/A 轉(zhuǎn)換器。有4 路A/D 轉(zhuǎn)換輸入,1 路D/A 模擬輸出。這就是說,它既可以作A/D 轉(zhuǎn)換也可以作D/A 轉(zhuǎn)換。A/D 轉(zhuǎn)換為逐次比較型。電源電壓典型值為5V。 AIN0~AIN3:模擬信號輸入端。 A0~A3:引腳地址端。 VSS:電源負極。 SDA、SCL:I2C 總線的數(shù)據(jù)線、時鐘線。 OSC:外部時鐘輸入端,內(nèi)部時鐘輸出端。 EXT:內(nèi)部、外部時鐘選擇線,使用內(nèi)部時鐘時EXT 接地。 AGND:模擬信號地。 VREF:基準電源端。 AOUT:D/A 轉(zhuǎn)換輸出端。 VDD:電源端。(2.5~6V)
模塊原理圖 PCF8591的器件地址: PCF8591 采用典型的I2C 總線接口器件尋址方法,即總線地址由器件地址、引腳地址和方向位組成。飛利蒲公司規(guī)定A/D 器件地址為1001。引腳地址A2A1A0,其值由用戶選擇,因此I2C 系統(tǒng)中最多可接2^3=8 個具有I2C 總線接口的A/D 器件。地址的最后一位為方向位R/w ,當主控器對A/D 器件進行讀操作時為1,進行寫操作時為0。總線操作時,由器件地址、引腳地址和方向位組成的從地址為主控器發(fā)送的第一字節(jié)。
D7~D4:1001 D3~D1:分別是A2、A1、A0的電平,我們原理圖上面是全部接地,所以為000。 D0:為方向設置,當為1時進行讀操作,當為0時進行寫操作。 PCF8591的控制寄存器
D1、D0:AD通道選擇00通道0,01通道1,10通道2,11通道3 D2:自動增益選擇(有效位為1) D5、D4:輸入模式選擇:00四路單數(shù)輸入;01三路差分輸入;10單端與差分配合輸入;11為模擬輸入有效 D6:模擬輸出使能位。(時能為1) I2C總線的數(shù)據(jù)傳送 起始、終止、應答信號時序圖 主機可以采用不帶I2C總線接口的單片機,如80C51、AT89C2051等單片機,利用軟件實現(xiàn)I2C總線的數(shù)據(jù)傳送,即軟件與硬件結(jié)合的信號模擬。為了保證數(shù)據(jù)傳送的可靠性,標準的I2C總線的數(shù)據(jù)傳送有嚴格的時序要求。I2C總線的起始信號、終止信號、發(fā)送“0”及發(fā)送“1”的模擬時序 :
起始信號程序: void Start_I2c() { sda=1; /*發(fā)送起始條件的數(shù)據(jù)信號*/ _nop_(); scl=1; _nop_(); /*起始條件建立時間大于4.7us,延時*/ _nop_(); _nop_(); _nop_(); _nop_(); sda=0; /*發(fā)送起始信號*/ _nop_(); /* 起始條件鎖定時間大于4μs*/ _nop_(); _nop_(); _nop_(); _nop_(); scl=0; /*開啟I2C總線,準備發(fā)送或接收數(shù)據(jù) */ _nop_(); _nop_(); } 終止信號程序: void Stop_I2c() { sda=0; /*發(fā)送結(jié)束條件的數(shù)據(jù)信號*/ _nop_(); /*發(fā)送結(jié)束條件的時鐘信號*/ scl=1; /*結(jié)束條件建立時間大于4μs*/ _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); sda=1; /*發(fā)送I2C總線結(jié)束信號*/ _nop_(); _nop_(); _nop_(); _nop_(); } 應答信號程序: void Ack_I2c(bit a) { if(a==0)sda=0; /*在此發(fā)出應答或非應答信號 */ else sda=1; _nop_(); _nop_(); _nop_(); scl=1; _nop_(); /*時鐘低電平周期大于4μs*/ _nop_(); _nop_(); _nop_(); _nop_(); scl=0; /*清時鐘線,開啟I2C總線以便繼續(xù)接收*/ _nop_(); _nop_(); } PCF8591的寫入 第一個字節(jié)是器件地址和讀寫控制 第二個字節(jié)被存到控制寄存器,用于控制器件功能。 第三個字節(jié)被存儲到DAC數(shù)據(jù)寄存器,并使用片上D/A轉(zhuǎn)換器轉(zhuǎn)換成對應的模擬電壓。(所以不輸入D/A時,可以不用輸入。) PCF8591發(fā)送一個字節(jié)的程序 bit PCF8591_SendByte(unsigned char addr,unsigned char channel) { Start_I2c(); //啟動總線 I2C_SendByte(addr); //發(fā)送器件地址 if(ack==0)return(0); I2C_SendByte(0x40|channel); //發(fā)送控制字節(jié) if(ack==0)return(0); Stop_I2c(); //結(jié)束總線 return(1); } PCF8591的讀取 讀取的第一個字節(jié)是包含上一次轉(zhuǎn)換結(jié)果。將上一個字節(jié)讀取時,才開始進行這次轉(zhuǎn)換的采樣。讀取的第二個字節(jié)才是這次的轉(zhuǎn)換結(jié)果。所以讀取轉(zhuǎn)換結(jié)果的步驟是:發(fā)送轉(zhuǎn)換命令,將上次的結(jié)果讀走,然后等一會兒,然后讀取結(jié)果。
PCF8591讀取一個字節(jié)的程序: unsigned char PCF8591_RcvByte(unsigned char addr) { unsigned char dat; Start_I2c(); //啟動總線 I2C_SendByte(addr+1); //發(fā)送器件地址 if(ack==0)return(0); dat=I2C_RcvByte(); //讀取數(shù)據(jù) Ack_I2c(1); //發(fā)送非應答信號 Stop_I2c(); //結(jié)束總線 return(dat); } PCF8591發(fā)送一次轉(zhuǎn)換的程序: bit Pcf8591_DaConversion(unsigned char addr,unsigned char channel, unsigned char Val) { Start_I2c(); //啟動總線 I2C_SendByte(addr); //發(fā)送器件地址 if(ack==0)return(0); I2C_SendByte(0x40|channel); //發(fā)送控制字節(jié) if(ack==0)return(0); I2C_SendByte(Val); //發(fā)送DAC的數(shù)值 if(ack==0)return(0); Stop_I2c(); //結(jié)束總線 return(1); } 相關資訊
發(fā)表評論
|
全國咨詢電話:400-611-6270,雙休日及節(jié)假日請致電值班手機:15010390966
在線咨詢: 曹老師QQ(3337544669), 徐老師QQ(1462495461), 劉老師 QQ(3108687497)
企業(yè)培訓洽談專線:010-82600901,院校合作洽談專線:010-82600350,在線咨詢:QQ(248856300)
Copyright 2004-2018 華清遠見教育科技集團 版權(quán)所有 ,京ICP備16055225號,京公海網(wǎng)安備11010802025203號