PCF8591是一款CMOS数据采集器件,通过IIC与单片机进行通信,具有4路A/D转换输入、1路D/A模拟输出
以五一板子上面的原理图为例
AIN0~AIN3:模拟信号输入端
EXT:内部、外部时钟选择线,使用内部时钟时EXT接地
Vref:基准电源端
AOUT:D/A转换的模拟输出端
器件地址
进行IIC通信的时候都知道需要先写器件地址和读写操作,从图中可以看出,PCF8591的地址高四位为固定的1001,A2A1A0为可编程寻址位,意思是从000~111该IIC总线可以同时挂载8个同类芯片,最后一位是读写位,1是读0是写
控制字节
第一个字节写完后,IIC总线写的第二个字节是PCF8591的控制字节。
第7位和第3位固定为0,为预留扩展功能位。
第0位第1位则是通道号,表示4路A/D通道编号
第6位是模拟输出使能位
第2位是自动增量位,如果这位置1,每次A/D转换后通道号将自动增加
第4和第5位是定义模拟输入的方式,00为4路单端输入、01为三路差分输入、10为单端与差分配合输入、11为两路差分输入
具体如下图所示
程序
下面是五一上面驱动PCF8591的程序,器件是基于IIC通信协议的,基本的协议过程就不再讲解,如下图所示,通道0123分别接到了VRout、GND、GND、+5V,VRout是滑动变阻器的电压值,分别读取四个通道的电压值,A2A1A0接了地,故需要向总线上写入的第一个字节就是0x90
unsigned char GetADCValue(unsigned char chn)
{
unsigned char val;
I2CStart();
if(!I2CWrite(0x90))//写入器件地址,直到获取到应答
{
I2CStop();
return 0;
}
I2CWrite(0x40 | chn);//写入控制字,或上通道号提供选择
I2CStart();
I2CWrite(0x90);//再次写入地址开始通信
I2CReadACK();
val = I2CReadNAK();
I2CStop();
return val;
}