引言
PCF8591 是單電源,低功耗8 位CMOS 數據采集器件,具有4 個模擬輸入、一個輸出和一個串行I2C 總線接口。3 個地址引腳A0、A1 和A2 用於編程硬件地址,允許將最多8 個器件連接至I2C總線而不需要額外硬件。PCF8591由於其使用的簡單方便和集成度高,在單片機應用系統中得到了廣泛的應用,這篇文章是介紹IIC通信在ADDA轉換芯片PCF8591中的應用。
關於IIC
IIC總線通信協議的介紹在"基於51單片機IIC通信的AT24C02學習筆記"有詳細的介紹。
關於PCF8591
PCF8591是單片、單電源低功耗8位CMOS數據采集器件,具有4個模擬輸入、一個輸出和一個串行I2C總線接口。3個地址引腳A0、A1 和A2 用於編程硬件地址,允許將最多8個器件連接至I2C總線而不需要額外硬件。器件的地址、控制和數據通過兩線雙向I2C總線傳輸。器件功能包括多路復用模擬輸入、片上跟蹤和保持功能、8位模數轉換和8位數模擬轉換。最大轉換速率取決於I2C總線的最高速率。
PCF8591的操作和AT24C02非常類似,只不過AT24C02是寫入或讀出數據,而PCF8591是AIN端口輸入模擬電壓,然后PCF8591將轉換后的數字量通過IIC總線發送給單片機,或是單片機通過IIC總線給一個數字量,然后PCF8591通過AOUT端口將模擬電壓輸出.
控制字格式
最高位默認為0
第6位是選擇是否允許模擬電壓輸出,在DA轉換時設置為1,AD轉換時設置為0或1均可
第5/4位是選擇模擬電壓輸出方式,一般選擇00單端輸入方式,其他的幾種方式如下圖所示
第3位默認為0
第2位是自動增量使能位,如果自動增量(auto-increment)標志置1,每次A/D 轉換后通道號將自動增加。
第1/0為是在AD轉換時選擇哪一個通道輸入的電壓轉換為數字量.
PCF8591的器件地址
每一個IIC器件都有一個器件地址,來區分不同的IIC設備,下面是PCF8591的地址
它的地址是由1001和A2A1A0組成的,在原理圖中可以看出,A2A1A0均為0,所以器件地址為0x90/0x91,最后一位是讀寫方向位,0表示下一個字節往總線上寫數據,1表示下一個字節從總線上讀取數據.
AD轉換函數
AD轉換即將AIN端口輸入的模擬電壓轉換為數字量並發送到總線上,可以知道該函數需要指定輸入的通道,還要將轉換后的數字量返回,所以該函數有返回值,和一個形參
程序實現:
/*讀取某一個通道轉換后的數字量*/
uchar Read_D(uchar Channel)
{
uchar dat;
start();
write_byte(0x90); //器件地址+0
ack();
write_byte(Channel); //控制字0x01表示通道1
ack();
start();
write_byte(0x91); //器件地址+1,下一個字節要讀取
ack();
dat=read_byte();
ack();
stop();
// AD_led=0; //轉換成功顯示
return dat;
}
DA轉換函數
DA轉換即將從總線上接收到的數字量通過AOUT輸出,該函數無返回值,有一個形參
程序實現:
void Out_A(uchar Digital) { start(); write_byte(0x90); //器件地址+0,下一個字節為寫入 ack(); write_byte(0x40); //設置控制字 0100 0000 允許模擬輸出,不自增單端 ack(); write_byte(Digital); //將要轉換的數字量寫入 ack(); stop(); // DA_led=0; //轉換成功顯示 }
轉換公式
我們可以用一個轉換公式,將AD轉換后的數字量轉換為對應的電壓值,在數碼管或液晶上顯示,公式如下:
#define fun(x) (int)(5*x/255.0*100+0.5) //數字電壓x轉換為模擬電壓的公式
主函數調用
dat1 = Read_D(0x01); //將通道1(電位器v2)的模擬電壓轉換的數字量讀出 Out_A(dat1); //將數字量轉換為模擬量輸出到led顯示 dis_Voltage1(fun(dat1)); //數碼管顯示電壓值 Delay_Ms(5); //延時緩沖
這樣就可以實時顯示輸入的電壓值了.還可以將電壓值輸出到led亮度顯示出來.這樣就可以作為一個簡易的小量程(5v)的電壓表了
總結
從程序可以看出PCF8591的操作和AT24C02基本一致,就是增加了控制字的內容,相比於其他的ADDA轉換芯片,它結構簡單,不需要外圍的電路,可以直接使用,而且容易實現模塊化設計,在大多數單片機系統中ADDA幾乎是不可缺少的,而PCF8591只需要兩個IO口(時鍾和數據)和電源就可以實現,大大節省了IO口的使用。
關於AT24C02的使用,請看我另一篇隨筆:“基於51單片機IIC通信的AT24C02學習筆記”
參考資料:
PCF8591_百度百科
iic_百度百科
我的其他博文:
- 一鍵自動格式化你的代碼
- C標准庫string.h中幾個常用函數的使用詳解
- Jlink使用技巧系列教程索引
- Jlink使用技巧之燒寫SPI Flash存儲芯片
- Jlink使用技巧之虛擬串口功能
- Jlink使用技巧之讀取STM32內部的程序
- Jlink使用技巧之J-Scope虛擬示波器功能
- 基於uFUN開發板的RGB調色板
- 基於uFUN開發板的心率計(一)DMA方式獲取傳感器數據
- 基於uFUN開發板的心率計(二)動態閾值算法獲取心率值
- 基於uFUN開發板的心率計(三)Qt上位機的實現
- Qt實現軟件自動更新的一種簡單方法
- 【UFUN開發板評測】小巧而不失精致,簡單而不失內涵——uFun開發板開箱爆照
- 如何使用串口來給STM32下載程序
- STM32串口打印輸出亂碼的解決辦法
- Keil報錯:cannot open source input file "core_cmInstr.h" 解決辦法