解析PCF8591的IIC信號
e小白網(wǎng)址:www.e-xiaobai.com
1.PCF8591模塊原理圖及引腳定義

2.PCF8591的IIC通訊地址

模塊上A2,A1,A0都連接GND,那么PCF8591的地址/寫是0X90,地址/讀是0x91。
3.PCF8591的控制字節(jié)


由此可知,讀取1通道的AD值的控制字節(jié)為0x41or0x01;DA輸出的控制字節(jié)為0x4?(此時(shí)“?”可以表示0,1,2,3,因?yàn)槭荄A輸出與AD輸入無關(guān),一般直接寫0x40即可)
4.PCF8591的讀時(shí)序

5.PCF8591的寫時(shí)序

6.代碼
6.1讀AD
//channel可取0x00,0x01,0x02,0x03或0x40,0x41,0x42,0x43
u8 ADCconversion(u8 channel)
{
? ?u8 data;
? ?PCF8591_IIC_Start(); ? ?//發(fā)送IIC開始信號
? ?PCF8591_IIC_Send_Byte(0x90); ? ?//IIC發(fā)送一個(gè)字節(jié)
? ?PCF8591_IIC_Wait_Ack();
? ?PCF8591_IIC_Send_Byte(channel);
? ?PCF8591_IIC_Wait_Ack();
PCF8591_IIC_Start();
? ?PCF8591_IIC_Send_Byte(0x91);
? ?PCF8591_IIC_Wait_Ack();
data=PCF8591_IIC_Read_Byte(0);? ? ? //IIC讀取一個(gè)字節(jié)
? ?PCF8591_IIC_Stop(); ? ? ?//發(fā)送IIC停止信號
return(data);
}
下圖為邏輯分析儀解析的IIC讀時(shí)序(channel的值為0x03):


其中,0XB0為讀取到的AD值,轉(zhuǎn)化為10進(jìn)制為176,與OLED顯示的數(shù)字一致。
6.2寫DA
//DA?
//V的范圍是0-5
void DACconversion(float V)
{
float a;
a=(u8)(V*255/5);
? ?PCF8591_IIC_Start(); ? ?//發(fā)送IIC開始信號
? ?PCF8591_IIC_Send_Byte(0x90); ? ?//IIC發(fā)送一個(gè)字節(jié)
? ?PCF8591_IIC_Wait_Ack();
? ?PCF8591_IIC_Send_Byte(0x40);
? ?PCF8591_IIC_Wait_Ack();
? ?PCF8591_IIC_Send_Byte(a);
? ?PCF8591_IIC_Wait_Ack();
? ?PCF8591_IIC_Stop(); ? ? ?//發(fā)送IIC停止信號
}
下圖為邏輯分析儀解析的IIC寫時(shí)序(V為3.5):

其中,0XB2為輸出電壓的數(shù)字值。