热度 30
2012-3-28 20:51
7180 次阅读|
14 个评论
PCF8591是单片、单电源低功耗8位CMOS数据采集器件,具有4个模拟输入、一个输出和一个串口I2C总线接口。3个地址引脚A0、A1、A2用于硬件地址编址,允许将最多8个器件连接至I2C总线而不需要额外硬件。器件的地址、控制和数据通过两线双向I2C总线传输。器件功能包括多路复用模拟输入、片上跟踪和保持功能、8位模数转换和8位数模转换。最大转换速率取决于I2C总线的最高速率。 (1)引脚定义 1、2、3、4引脚为4个8位ADC通道,可通过软件选择读取的通道号。5、6、7引脚为地址输入脚,分别接地或接高,确定器件硬件地址。PCF8591的地址分为固定部分和可编辑部分,高四位固定为1001,低半字节前三位分别由A2、A1、A0确定,最低位为读/写选择位,“0”时为写操作,“1”时为读操作。器件地址必须是起始条件后第一个发送的字节。8、16引脚分别接地和电源。13、14引脚分别为模拟地和参考电压。9、10引脚为I2C总线的数据线和时钟线,需接10K上拉电阻,以使信号线保持高电平。11号引脚为外部时钟输入脚,当使用内部时钟方式时悬空。12号引脚为外部时钟选择脚,当其接高时选择外部时钟工作方式。15号脚为模拟信号输出脚,由控制字的第二位使能模拟输出。 (2)控制字 跟随于器件地址之后的第二个字节数据,存储于控制寄存器,控制器件功能。控制字最高位和第五位必须为0,第二位为模拟出书使能位,“1”时允许模拟输出,第3、4位为输入模式选择,第六位为自动增量位,"1"时,每次AD转换后通道号自动增加。最低两位为ADC通道选择位。 (3)AD转换 PCF8591采用8位初次逼近式ADC,一个AD转换周期总是开始于发送一个控制字之后,一旦一个转换周期被触发,所选通道的输入电压采样将保存到芯片并被转换为对应的8位二进制码。转换结果被保存在ADC数据寄存器等待传输。最高AD转换速率取决于实际的I2C总线速度。 操作时序 : /**************************************************************** 函数名称:Read_ADC 函数功能:读取AD转换后的8位数值 入口参数:channel //选择ADC通道(0-3) 出口参数:value //AD转换后的8 bit数字量 备 注: *****************************************************************/ unsigned char Read_ADC(unsigned char channel) { unsigned char value; Start_I2c(); Send_Byte(0x90);//发送器件地址 Send_Byte(0x40+channel);//发送控制字 Start_I2c(); Send_Byte(0x91);//发送器件地址,最低位置1,表示读数据 value=Rcv_Byte();//将读取的数据赋给value变量 NoAck_I2c();//主机发送非应答信号 Stop_I2c(); return (value); } (4)DA转换 发送给PCF8591的第三字节被存储到DAC数据存储器,并使用片上DA转换器转换成对应的模拟电压。使用DA转换需将控制字第二位置1,使能模拟输出。 /**************************************************************** 函数名称:Write_DAC 函数功能:向PCF8591发送8位数字量进行DA转换 入口参数:dat //需转换的数字量 出口参数: 备 注: *****************************************************************/ void Write_DAC(unsigned char dat) { Start_I2c(); Send_Byte(0x90); //发送器件地址,最低位为0,表示向从机械数据 Send_Byte(0x40);//发送控制字,第四位必须置1,表示允许模拟输出 Send_Byte(dat); //发送8位数字量 Stop_I2c(); }