传感器自学笔记第二章——PCF8591 A/D模块

PCF8591 A/D模块**

作者:gwd 日期:2019.06.20

一:学习要点

  1. 读取A/D转换值时,理解手册容易出错,应该参考IIC选择/随机读取的“伪”写方式读取,先发送一次开始、写地址、控制字之后再次开始、读地址最后读取一个字节的数据;
  2. 在使用中如果需要用D/A的输入作为A/D的被测信号,切记A/D控制字Bit6应该置1(允许模拟量输出),防止程序执行到A/D检测函数时,关闭模拟量的输出造成模拟量的输出不连续,程序运行效果与预期不符;

二 : 手册分析
1.PCF8591具有4个模拟输入,一个输出和一个串行IIC总线接口;3个地址引脚用于编程硬件地址;允许将最多8个器件连接至IIC总线;8位模数转换和8位数模转换。
2.由下图推测需要用IIC协议读取DAC、ADC寄存器
传感器自学笔记第二章——PCF8591 A/D模块_第1张图片
3. 引脚与接线图
传感器自学笔记第二章——PCF8591 A/D模块_第2张图片
传感器自学笔记第二章——PCF8591 A/D模块_第3张图片
4.地址:如下图,每片PCF8591通过发送有效地址到器件来激活,在IIC总线协议中,地址必须是起始条件后作为第一个字节发送,地址字节最后一位用于设置数据传输方向;
传感器自学笔记第二章——PCF8591 A/D模块_第4张图片
5. 控制字:(如下图)发送到 PCF8591的第二个字节将被存储在控制寄存器,用于控制器件功能。控制寄存器的高半字节用于允许模拟输出,和将模拟输入编程为单端或差分输入。低半字节选择一个由高半字节定义的模拟输入通道,如果自动增量(auto-increment )标志置 1,每次 A/D 转换后通道号将自动增加。控制寄存器的所有位在上电复位后被复位为逻辑 0。
传感器自学笔记第二章——PCF8591 A/D模块_第5张图片
6.D/A转换: 发送给 PCF8591的第三个字节被存储到 DAC 数据寄存器,并使用片上 D/A 转换器转换成对应的模拟电压。输出特性如下图。
传感器自学笔记第二章——PCF8591 A/D模块_第6张图片
7.A/D转换: 手册关于这部分的描述不太明了,简单说分为X步,第一步:发送start信号后,紧接着发送一次器件地址(“写”地址最后一位是0);第二步:发送控制字;第三步:重新发送start信号后,紧接着发送发送一次器件地址(“读”地址最后一位是1);第四步:读取一个字节的A/D转换数据。这样写是根据IIC通信协议的伪写格式,不明白的可自行百度。A/D输出特性(如下图)。
传感器自学笔记第二章——PCF8591 A/D模块_第7张图片
三:程序
代码功能:PCF8591的D/A通道A0输出电压逐渐增大,指示灯逐渐变亮,用杜邦线连接A0与A/D通道AI3,利用PCF8591的A/D功能检测D/A输出的电压。现象:如下图串口不断输出0.000V-5.000V电压值。
传感器自学笔记第二章——PCF8591 A/D模块_第8张图片
PCF8591.C
#include “PCF8591.h”

void WR_OneByte2Pcf8591(unsigned char address,unsigned char cmd,unsigned char dat)
{
nop();
iic_start();
nop();
iic_sendbyte(address);
nop();
iic_sendbyte(cmd);
nop();
iic_sendbyte(dat);
}

int RD_OneByte2Pcf8591(unsigned char address,unsigned char cmd)
{
int num = 0;
iic_start(); //address=0x41
iic_sendbyte(address);
iic_sendbyte(cmd);
iic_start(); //address=0x41
iic_sendbyte(address|0x01);
num = iic_rcvbyte_nack();
return (num);
}

源程序下载链接(PCF8591读取、写入、串口打印功能):链接:https://pan.baidu.com/s/1avdG11K2TWbcark7SiYvfQ
提取码:dkms

你可能感兴趣的:(传感器自学笔记第二章——PCF8591 A/D模块)