pcf8591是一个单电源低功耗的8位cmos数据采集器件,具有4路模拟输入,1路模拟输出和一个串行i2c总线接口用来与mcu通信。3个地址引脚a0、a1、a2用于编程硬件地址,允许最多8个器件连接到i2c总线而不需要额外的片选电路。器件的地址、控制以及数据都是通过i2c总线来传输,我们先看一下pcf8591的原理图,如图1所示。
图1pcf8591原理图
其中引脚1、2、3、4是4路模拟输入,引脚5、6、7是i2c总线的硬件地址,8脚是数字gnd,9脚和10脚是i2c总线的sda和scl。12脚是时钟选择引脚,如果接高电平表示用外部时钟输入,接低电平则用内部时钟,我们这套电路用的是内部时钟,因此12脚直接接gnd,同时11脚悬空。13脚是模拟gnd,在实际开发中,如果有比较复杂的模拟电路,那么模拟gnd部分在布局布线上要特别处理,而且和数字gnd的连接也有多种方式,这里大家先了解即可。在我们板子上没有复杂的模拟部分电路,所以我们把模拟的gnd和数字gnd接到一起即可。14脚是基准源,15脚是dac的模拟输出,16脚是供电电源vcc。
pcf8591的adc是逐次逼近型的,转换速率算是中速,但是他的速度瓶颈在i2c通信上。由于i2c通信速度较慢,所以最终的pcf8591的转换速度,直接取决于i2c的通信速率。由于i2c速度的限制,所以pcf8591的算是个低速的ad和da集成,主要应用在一些转换速度要求不高,希望成本较低的场合,比如电池供电设备,测量电池的供电电压,电压低于某一个值,报警提示更换电池等类似场合。
vref基准电压的提供,方法一是采用简易的原则,直接接到vcc上去。但是由于vcc会受到整个线路的用电功耗情况影响,一来不是准确的5v,实测大多在4.8v左右,二来随着整个系统负载情况的变化会产生波动,所以只能用在简易的、对精度要求不高的场合。方法二是使用专门的基准电压器件,比如tl431,它可以提供一个精度很高的2.5v的电压基准,这是我们通常采用的方法。如图2所示。
图2pcf8591电路图
图中j17是双排插针,大家可以根据自己的需求选择跳线帽短接还是使用杜邦线接其他外接电路,都是可以的。在这个地方,我们直接把j17的3脚和4脚用跳线帽短路起来,那么现在vref的基准源就是2.5v了。分别把5和6、7和8、9和10、11和12用跳线帽短接起来的话,那么我们的ain0实测的就是滑动变阻器的分压值,ain1和ain2测的是gnd的值,ain3测的是+5v的值。这里需要注意的是,ain3虽然测的是+5v的值,但是对于ad来说,只要输入信号超过vref基准源,它得到的始终都是最大值,即255,也就是说它实际上无法测量超过其vref的电压信号。需要注意的是,所有输入信号的电压值都不能超过vcc,即+5v,否则可能会损坏adc芯片。