A/D与D/A转换芯片PCF8591

PCF8591功能

1 PCF8591是一种具有 I2C总线接口的8位A/D、D/A转换芯片;其地址、控制和数据信号都是通过I²C总线,以串行的方式进行传输,在与CPU的信息传输过程中仅靠时钟线SCL和数据线 SDA就可以实现。

2 多路模拟输入、内置跟踪保持、8-bit模数转换和8-bit数模转换

芯片管脚

A/D与D/A转换芯片PCF8591_第1张图片
1234管脚用于模拟量输入,567管脚用于寻址,SCL SDA串行时钟与串行时钟与主控制器相连。
这里给出应用电路图:
A/D与D/A转换芯片PCF8591_第2张图片

I2C总线连接与通信

1 地址
A/D与D/A转换芯片PCF8591_第3张图片
在上述应用电路图中A2A1A0管脚接地,当PCF8591接收主控制器发来的数据时为读,地址是100010000即0x90,如果写,地址是100010001即0x91。

2 控制寄存器
PCF8591的控制寄存器存放转换控制字,用于设置器件的各种功能,如模拟信号由哪几个通道输入等,是总线操作时由主控器件向从器件PCF8591发送的第二字节。其格式如下所示。
在这里插入图片描述
其中:D1、D0:A/D通道编号——00通道0,01通道1,10通道2,11通道3。
D2:自动增益选择(有效位为1)。
D3、D7:固定为0。
D5、D4:模拟量输入选择——00为四路单输入、01为三路差分输入、10为单端与差分配合输入、11为两路差分输入。
D6:模拟输出允许——该位为1时运行模拟输出;当系统A/D转换时,该位为0。

A/D与D/A转换芯片PCF8591_第4张图片
3 器件在I2C总线中的通信
A/D与D/A转换芯片PCF8591_第5张图片
I2C通信需要以下几个步骤:
(1)初始化I2C总线:就是把SDA和SCL都变成高电平。
(2)发送起始信号:就是保持SCL为高电平,而SDA从高电平降为低电平。
(3)发送应答(ACK):每接受或发送一字节数据后都需要发送一位应答,来表是否收到了前面一个字节的数据。
(4)发送结束信号:就是保持SCL为高电平,而SDA从低电平升为高电平。

4 I2C时钟和数据转换
SDA和SCL通常各自通过一个电阻上拉为高电平。SDA总线上的数据仅在SCL为低电平期间可能改变。如果在SCL高电平期间数据发生改变,表示定义“开始”或“停止”两种状态。

A/D与D/A转换芯片PCF8591_第6张图片

ADC编程

在这里不说DAC,只记录ADC,并给出代码
PCF8591的A/D转换采用逐次逼近转换技术,每个转换周期总是开始于发送一个有效模式地址给PCF8591,然后A/D转换周期在应答时钟的后沿触发,所选通道的输入电压采样保存到芯片中,并被转换为对应的8位二进制码。

#include         

bit PCF859_ack;                 /*应答标志位*/
   
/*******************************************************************
                     起动总线函数               
函数原型: void  Start_I2c();  
功能:     启动I2C总线,即发送I2C起始条件.  
********************************************************************/
void PCF8591_Start()
{
	PCF8591_SDA=1;         /*发送起始条件的数据信号*/
	_Nop();
	PCF8591_SCL=1;
	_Nop();        /*起始条件建立时间大于4.7us,延时*/
	_Nop();_Nop();_Nop();_Nop();    
	PCF8591_SDA=0;         /*发送起始信号*/
	_Nop();        /* 起始条件锁定时间大于4μs*/
	_Nop();_Nop();_Nop();_Nop();       
	PCF8591_SCL=0;       /*钳住I2C总线,准备发送或接收数据 */
	_Nop();_Nop();
}
/*******************************************************************
                      结束总线函数               
函数原型: void  Stop_I2c();  
功能:     结束I2C总线,即发送I2C结束条件.  
********************************************************************/
void PCF8591_Stop()
{
  PCF8591_SDA=0;      /*发送结束条件的数据信号*/
  _Nop();       /*发送结束条件的时钟信号*/
  PCF8591_SCL=1;      /*结束条件建立时间大于4μs*/
  _Nop();_Nop();_Nop();_Nop();_Nop();
  PCF8591_SDA=1;      /*发送I2C总线结束信号*/
  _Nop();_Nop();_Nop();_Nop();
}
/*******************************************************************
                 字节数据发送函数               
函数原型: void  SendByte(UCHAR c);
功能:     将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
          此状态位进行操作.(不应答或非应答都使ack=0)     
           发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
********************************************************************/
void  PCF8591_SendByte(unsigned char  c)
{
 unsigned char  BitCnt; 
 for(BitCnt=0;BitCnt<8;BitCnt++)  /*要传送的数据长度为8位*/
    {
     if((c<

你可能感兴趣的:(A/D与D/A转换芯片PCF8591)