资源预览内容
第1页 / 共29页
第2页 / 共29页
第3页 / 共29页
第4页 / 共29页
第5页 / 共29页
第6页 / 共29页
第7页 / 共29页
第8页 / 共29页
第9页 / 共29页
第10页 / 共29页
亲,该文档总共29页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
PCF8591PCF8591的介绍的介绍. .PCF8591介绍介绍 程序构成程序构成 例子原理图及程序例子原理图及程序 Click to add title in here 123目录PCF8591介绍 PCF8591的介绍: PCF8591是单电源,低功耗8位CMOS数据采集器件,具有4个模拟输入、一个输出和一个串行I2C总线接口。3个地址引脚A0、A1和A2用于编程硬件地址,允许将最多8个器件连接至I2C总线而不需要额外硬件。PCF8591由于其使用的简单方便和集成度高,在单片机应用系统中得到了广泛的应用。特点:1单电源供电2工作电压:2.5V6V3I2C总线串行输入/输出4通过3个硬件地址引脚编址5采样速率取决于I2C总线传输速率决定64个模拟输入可编程为单端或差分输入7自动增量通道选择88位逐次逼近式A/D转换PCF8591介绍 (1)首先发出“启动信号”信号S。当S由高变低时,“逐次逼近寄存器SAR”清0,DAC输出Vo=0,“比较器”输出1。当S变为高电平时,“控制电路”使SAR开始工作。()SAR首先产生8位数字量的一半,即10000000B,试探模拟量的Vi大小,若VoVi,“控制电路”清除最高位,若VoVi,保留最高位。()在最高位确定后,SAR又以对分搜索法确定次高位,即以低7位的一半y1000000B(y为已确定位)试探模拟量Vi的大小。在bit6确定后,SAR以对分搜索法确定bit5位,即以低6位的一半yy100000B(y为已确定位)试探模拟量Vi的大小。重复这一过程,直到最低位bit0被确定。(4)在最低位bit0确定后,转换结束,“控制电路”发出“转换结束”信号EOC。该信号的下降沿把SAR的输出锁存在“缓冲寄存器”里,从而得到数字量输出。从转换过程可以看出:启动信号为负脉冲有效。转换结束信号为低电平。应用:1闭环控制系统2用于远程数据采集的低功耗转换器3电池供电设备4在汽车、音响和TV应用方面的模拟数据采集PCF8591介绍 管脚定义及原理图:AIN0-AIN3:模拟输入(A/D转换)。AOUT:模拟输出(D/A转换)。A0-A1:硬件设备地址。GND:电源负极地VREF:参考电压输入。EXT:振荡器输入时,内部/外部的切换开关。OSC:振荡器输入/输出。SCL:I2CBUS时钟输入。SDA:I2CBUS数据输入/输出。AGND:模拟地,模拟信号和基准电源的参考地PCF8591介绍 内部框图:PCF8591介绍 PCF8591介绍 地址:I2C总线系统中的每一片PCF8591通过发送有效地址到该器件来激活。该地址包括固定部分和可编程部分。可编程部分必须根据地址引脚A0、A1和A2来设置,因此I2C系统中最多可接=8个PCF8591。在I2C总线协议中地址必须是起始条件后作为第一个字节发送。地址字节的最后一位是用于设置以后数据传输方向的读/写位1为读操作,0为写操作。控制字:D0-D1用于4个通道设置D2自动增益选择(有效位为1)D5D4模拟量输入选择004路单端输入013路差分输入10单端与差分输入112路差分输入PCF8591介绍 PCF8591介绍 AD的差分输入与单端输入:单端输入,输入信号均以共同的地线为基准.这种输入方法主要应用于输入信号电压较高(高于1V),信号源到模拟输入硬件的导线较短,且所有的输入信号共用一个基准地线.如果信号达不到这些标准,此时应该用差分输入.对于差分输入,每一个输入信号都有自有的基准地线;由于共模噪声可以被导线所消除,从而减小了噪声误差.单端输入时,是判断信号与GND的电压差.差分输入时,是判断两个信号线的电压差.信号受干扰时,差分的两线会同时受影响,但电压差变化不大.(抗干扰性较佳)而单端输入的一线变化时,GND不变,所以电压差变化较大.(抗干扰性较差)控制字:发送到PCF8591的第二个字节将被存储在控制寄存器,用于控制器件功能。控制寄存器的高半字节用于允许模拟输出,和将模拟输入编程为单端或差分输入。低半字节选择一个由高半字节定义的模拟输入通道。如果自动增量(auto-increment)标志置1,每次A/D转换后通道号将自动增加。PCF8591介绍 PCF8591介绍 A/D转换:A/D转换器采用逐次逼近转换技术。在A/D转换周期将临时使用片上D/A转换器和高增益比较器。一个A/D转换周期总是开始于发送一个有效读模式地址给PCF8591之后。A/D转换周期在应答时钟脉冲的后沿被触发,并在传输前一次转换结果时执行。一旦一个转换周期被触发,所选通道的输入电压采样将保存到芯片并被转换为对应的8位二进制码。转换结果被保存在ADC数据寄存器等待传输。如果自动增量标志被置1,将选择下一个通道。A/D转换时序图:PCF8591介绍 在读周期传输的第一个字节包含前一次读周期的转换结果代码。以上电复位之后读取的第一个字节是0x80。D/A转换:发送给PCF8591的第三个字节被存储到DAC数据寄存器,并使用片上D/A转换器转换成对应的模拟电压。这个D/A转换器由连接至外部参考电压的具有256个接头的电阻分压电路和选择开关组成。接头译码器切换一个接头至DAC输出线。模拟输出电压由自动清零单位增益放大器缓冲。这个缓冲放大器可通过设置控制寄存器的模拟输出允许标志来开户或关闭。在激活状态,输出电压将保持到新的数据字节被发送。PCF8591介绍 D/A转换时序图:PCF8591介绍 程序构成 PCF8591的写入第一个字节是器件地址和读写控制第二个字节被存到控制寄存器,用于控制器件功能。第三个字节被存储到DAC数据寄存器,并使用片上D/A转换器转换成对应的模拟电压。(所以不输入D/A时,可以不用输入。)PCF8591发送一个字节的程序/*函数名:Pcf8591SendByte*函数功能:写入一个控制命令*输入:channel(转换通道)*输出:无*/voidPcf8591SendByte(unsignedcharchannel)I2cStart();I2cSendByte(WRITEADDR);/发送写器件地址I2cSendByte(0x40|channel);/发送控制寄存器I2cStop();PCF8591的读取读取的第一个字节是包含上一次转换结果将上一个字节读取时,才开始进行这次转换的采样。读取的第二个字节才是这次的转换结果。所以读取转换结果的步骤是:发送转换命令,将上次的结果读走,然后等一会儿,然后读取结果。PCF8591读取一个字节的程序/*函数名:Pcf8591ReadByte*函数功能:读取一个转换值*输入:*输出:dat*/unsignedcharPcf8591ReadByte()unsignedchardat;I2cStart();I2cSendByte(READADDR);/发送读器件地址dat=I2cReadByte();/读取数据I2cStop();/结束总线returndat;PCF8591发送一次转换的程序/*函数名:Pcf8591DaConversion*函数功能:PCF8591的输出端输出模拟量*输入:value(转换的数值)*输出:无*/voidPcf8591DaConversion(unsignedcharvalue)I2cStart();I2cSendByte(WRITEADDR);/发送写器件地址I2cSendByte(0x40);/开启DA写到控制寄存器I2cSendByte(value);/发送转换数值I2cStop();例子原理图及程序 例子:*实验名:AD显示试验*实验说明:使用LCD1602显示AD读取到的各个数值说明:电压值=读取值*分辨率。原理图:例子原理图及程序 热敏电阻光敏电阻例子原理图及程序 程序(采用C51):#include#includei2c.h#includelcd.h/-定义PCF8591的读写地址-/#defineWRITEADDR0x90/写地址#defineREADADDR0x91/读地址/-声明全局函数-/voidPcf8591SendByte(unsignedcharchannel);unsignedcharPcf8591ReadByte();voidPcf8591DaConversion(unsignedcharvalue);例子原理图及程序 voidmain()unsignedintadNum5;floatvalue0;LcdInit();while(1)/-显示电位器电压-/Pcf8591SendByte(0);/发送电位器转换命令adNum0=Pcf8591ReadByte()*2;/将前一次转换结果读走LcdWriteCom(0x80+0x46);/发送显示坐标LcdWriteData(0+adNum3/1000);/发送显示数据LcdWriteData(0+adNum3%1000/100);LcdWriteData(0+adNum3%100/10);LcdWriteData(0+adNum3%10);Pcf8591SendByte(1);/发送热敏转换命令adNum0=Pcf8591ReadByte()*2;/读取电位器转换结果value0=adNum0/2*0.01953;/转为电压值adNum0=value0*100;/保留两位小数LcdWriteCom(0x80);LcdWriteData(0+adNum0%1000/100);LcdWriteData(.);LcdWriteData(0+adNum0%100/10);LcdWriteData(0+adNum0%10);LcdWriteData(V);Pcf8591SendByte(2);/发送光敏转换命令adNum1=Pcf8591ReadByte()*2;/ADC1读取热敏例子原理图及程序 LcdWriteCom(0x86);LcdWriteData(0+adNum1/1000);LcdWriteData(0+adNum1%1000/100);LcdWriteData(0+adNum1%100/10);LcdWriteData(0+adNum1%10);Pcf8591SendByte(3);/发送外部输入电压转换命令adNum2=Pcf8591ReadByte()*2;/ADC2读取光敏LcdWriteCom(0x80+0x40);LcdWriteData(0);LcdWriteData(0+adNum2/1000);LcdWriteData(0+adNum2%1000/100);LcdWriteData(0+adNum2%100/10);LcdWriteData(0+adNum2%10);adNum3=Pcf8591ReadByte()*2;/ADC3读取外部输入电压 adNum4=adNum0;Pcf8591DaConversion(adNum4/2);/DAC数模转换例子原理图及程序 /*函数名:Pcf8591SendByte*函数功能:写入一个控制命令*输入:channel(转换通道)*输出:无*/voidPcf8591SendByte(unsignedcharchannel)I2C_Start();I2C_SendByte(WRITEADDR,1);/发送写器件地址I2C_SendByte(0x40|channel,0);/发送控制寄存器I2C_Stop();/*函数名:Pcf8591ReadByte*函数功能:读取一个转换值*输入:无*输出:dat*/unsignedcharPcf8591ReadByte()unsignedchardat;I2C_Start();I2C_SendByte(READADDR,1);/发送读器件地址dat=I2C_ReadByte();/读取数据I2C_Stop();/结束总线returndat;例子原理图及程序 /*函数名:Pcf8591DaConversion*函数功能:PCF8591的输出端输出模拟量*输入:value(转换的数值)*输出:无*/voidPcf8591DaConversion(unsignedcharvalue)I2C_Start();I2C_SendByte(WRITEADDR,1);/发送写器件地址I2C_SendByte(0x40,1);/开启DA写到控制寄存器I2C_SendByte(value,0);/发送转换数值I2C_Stop();谢谢观赏结束结束
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号