PCF8591芯片
首先要先了解下AD/DA数模转换:
模拟量:自然界连续变化的物理量。(温度,压力)
数字量:计算机中处理的不是连续变化的量,离散性的数字量。
A/D转换器:完成模拟量至数字量的转换。
D/A转换器:完成数字量至模拟量的转换。
A/D转换器主要技术指标
1.分辨率
ADC的分辨率指使输出数字量变化一个相邻数码所需输入模拟电压的变化量。常用二进制的位数表示。例如:12位的ADC的分辨率就是12位,或者说分辨率为满刻度FS的1/2^12.
2.量化误差
ADC把模拟量变为数字量,用数字量近似表示模拟量,这个过程称为量化。量化误差是ADC的有限位数对模拟量进行量化而引起的误差。实际上,要准确表示模拟量,ADC的位数需很大甚至无穷大。一个分辨率有限的ADC的阶梯状转换特性曲线与具有无限分辨率的ADC转换特性曲线(直线)之间的最大偏差即是量化误差。
3.偏移误差
偏移误差指输入信号为0时,输出信号不为0的值,所以有时又称为零值误差。假定ADC没有非线性误差,则其转换特性曲线各阶梯中点的连线必定是直线,这条直线与横轴相交点所对应的输入电压值就是偏移误差。
4.满刻度误差
满刻度误差又称增益误差。ADC的满刻度误差是指满刻度输出数码所对应的实际输入电压与理想电压之差。
5.线性度
线性度有时又称非线性度,它是指转换器实际的转换特性与理想直线的最大误差。
6.绝对精度
在一个转换器中,任何数码所对应的实际模拟量输入与理论模拟输入之差的最大值,称为绝对精度。对于ADC而言,可以在每一个阶梯的水平中点进行测量,它包括了所有的误差。
7.转换速率
ADC的转换速率是能够重复进行数据转换的速度,即每秒转换的次数。而完成一次A/D转换所需时间(包括稳定时间),则是转换速率的倒数。
A/D转换器的转速速度主要取决于转换电路的类型,不同类型的A/D转换器的转换速度相差很大。
1.双积分A/D转换器的转换速度最慢,需几百毫秒左右;
2.逐次逼近式A/D转换器的转换速度较快,需十几微秒;
3.并行比较型A/D转换器的转换速度最快,仅需几十纳秒。
逐次逼近式原理图
PCF8591
是具有IIC接口的8位A/D和D/A转换芯片,具有4路模拟输入、1路DAC输出和一个IIC总线接口。
功能特性:
- 单电源供电
- 通过3个硬件地址引脚编址
- 8位逐次逼近式A/D转换
- 片上跟踪与保持电路,采样速率取决于IIC总线速度
- 4路模拟输入可编程为单端输入和差分输入
- 自动增量通道选择
- 带一个模拟输出的乘法DAC
AIN0~AIN3:模拟量输入通道
AOUT:模拟输出通道
A0~A2:硬件设备地址
VDD:电源正极
VSS:电源负极
VREF:参考电压输入
EXT:振荡器输入时,内部/外部的切换开关
OSC:振荡器输入/输出
SCL:IIC BUS时钟输入
SDA:IIC BUS数据输入/输出
AGND:模拟地,模拟信号和基准电源的参考地
PCF8591设备地址
在IIC总线协议中,设备地址是起始信号后第一个发送的字节,在蓝桥杯单片机设计与开发使用的CT107D中硬件地址引脚A0,A1,A2都接地,那么PCF8591的设备地址的读操作地址为:0X91;写操作的地址为:0X90。
PCF8591控制寄存器
发送的第二个将被存储在控制寄存器,用于控制器件功能。控制寄存器的高半字节用于允许模拟输出,和将模拟输入编程为单端或差分输入。低半字节选择一个由高半字节定义的模拟输入通道。如果自动增量(auto-increment)标志置1,每次A/D转换后通道号将自动增加。
蓝桥杯单片机中两路模拟信号都为单端输入,光敏电阻接AIN1,通道1,控制寄存器应写入0X01;电位器接AIN3,通道3,控制寄存器应写入0X03.
PCF8591 A/D转换设计流程
1.发送写设备地址,选择IIC总线上的PCF8591器件
2.发送控制字节,选择模拟量输入模式和通道
3.发送读设备地址,选择IIC总线上的PCF8591器件
4.读取PCF8591中目标通道的数据
ADC转换功能:
读取电位器
uchar Read_AIN3()//采样可变电阻Rb2的电压
{
uchar dat;
IIC_Start();
IIC_SendByte(0X90);//写设备地址
IIC_WaitAck();//等待从机应答
IIC_SendByte(0X03);//写控制字节
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0X91);//读设备地址
IIC_WaitAck();
dat = IIC_RecByte();//读取通道3的数据
IIC_Ack(0);//产生非应答信号
IIC_Stop();
return dat;
}
读取光敏
uchar Read_RD1()
{
uchar dat1;
IIC_Start();
IIC_SendByte(0X90);//写设备地址
IIC_WaitAck();//等待从机应答
IIC_SendByte(0X01);//写控制字节
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0X91);//读设备地址
IIC_WaitAck();
dat1 = IIC_RecByte();//读取通道3的数据
IIC_Ack(0);//产生非应答信号
IIC_Stop();
return dat1;
}
DAC转换
void OUT_DAC(uchar dat)
{
IIC_Start();
IIC_SendByte(0X90);
IIC_WaitAck();
IIC_SendByte(0X40);//允许D/A输出
IIC_WaitAck();
IIC_SendByte(dat);//要转换的数字量(0-255)0v-5v
IIC_WaitAck();
IIC_Stop();
}