基本概念
模拟量:任何两个数字之间都有无限个中间值,所以称之为连续变化的量,也就是模拟量。
数字量:数字间有一定的间隔,不是连续的,即离散的量称之为数字量。
A/D:Analog to Digital Converter,用模数转换器实现模拟量到数字量的转换,简称ADC。
D/A:Digital to Analog Converter,用数模转换器实现数字量到模拟量的转换,简称DAC。
A/D的主要指标
1、ADC的位数:1个n位的ADC表示这个ADC共有2的n次方个刻度。
2、基准源:也叫做基准电压,是ADC的参考基准。
3、分辨率:数字量变化一个最小刻度,模拟信号的变化量,定义为满刻度量程与2n-1的比值。
4、INL(积分非线性度)和DNL(差分非线性度)
INL是指ADC器件在所有数值上对应的模拟值,和真实值之间误差最大的那个点的误差值,单位是LSB。LSB(Least Significant Bit)是最低有效位的意思,它实际上对应的就是ADC的分辨率。
DNL是指ADC相邻两个刻度之间最大的差异,单位也是LSB。
5、转换速率:是指ADC每秒能进行采样转换的最大次数,单位是sps。
PCF8591
硬件信息
1\2\3\4是4路模拟输入
5\6\7是I2C总线的硬件地址
引脚8是数字BND
9和10为I2C总线的SDA和SCL
12是时钟选择引脚,高电平时外部时钟输入,低电平时内部时钟
14为基准源
15是DAC的模拟输出
16是供电电源VCC
13是模拟地AGND
AD无法测量超过其Vref基准源的电压信号
软件信息
对PCF8591进行初始化,需要三个字节:
第一字节:器件地址。
7位表示地址(头四位为0b1001,后三位为A2\A1\A0,接地就为0),一位表示读写方向(0b1001000)
第二字节:PCF8591控制字。
第7、3位:0
6:DA使能,为1使能
4、5:将4路模拟输入配置成单端模式和差分模式
2:自动增量控制位
0、1:通道选择位
第三字节:D/A数据寄存器。
表示模拟输出的电压值
代码
//读取当前ADC转换值chn为ADC通道号0~3
unsigned char GetADCValue(unsigned char chn)
{
unsigned char val;
I2CStart();
if(!I2CWrite(0x48<<1))//寻址PCF8591,如未应答则停止操作并返回0
{
I2CStop();
return 0;
}
I2CWrite(0x40|chn);//写入控制字节,选择转换通道
I2CStart();
I2CWrite((0x48<<1)|0x01); //寻址PCF8591,指定后续为读操作
I2CReadACK(); //先空读一个字节,提供采样转换时间
val=I2CReadNAK(); //读取刚刚转换完的值
I2CStop();
return val;
}
A/D差分输入信号
主要是抗干扰能力强
两路信号的差值就是所要的信号
一路信号被干扰最终计算就会有偏差
4、5位都是1的时候,4路模拟被配置为2路差分模式
D/A输出
8位D/A代表:0~255
假如代表0~2.55V的话,发送100就代表1V
void SetDACOut(unsigned char val)//设置DAC输出值,VAL为设定值
{
I2CStart();
if(!I2CWrite(0x48<<1))
{
I2CStop();
return;
}
I2CWrite(0x40); //写入控制字节
I2CWrite(val); //写入DA的值
I2CStop();
}