一、相关概念与基础知识
AD转换:模拟信号(电压值)到数字信号(8位0-255),为输入。
DA转换:数字信号(8位0-255)到模拟信号(电压值),为输出。
在蓝桥杯开发板上,参考电压为5V,PCF8591寄存器为8位。
设当前模拟信号为X(0-5),对应数字信号为Y(0-255),有计算公式 。
二、PCF8591的控制字
第7位:默认0。
第6位:如果进行DA模拟输出,置1。
第5、4位:AD模拟输入选择,选择00四路单端输入即可。
第3位:默认0。
第2位:自动增益选择,置0即可。
第1、0位:A/D通道选择,由原理图可知,00为空引脚,用于后续扩展或DA输出,01为光敏,10为LM324,11为电位器。
三、芯片手册须知
1.通信协议是IIC,数据手册没有提供时序,可以参照AT24C02编写。
2.器件地址
3.控制字:相关已在上文叙述。
四、代码实现
//=====PCF8591 AD输入函数=====//
unsigned char PCF8591_Read(unsigned char control)
{
unsigned char temp = 0;
I2CStart();
I2CSendByte(0x90); //器件地址为10010000,即0x90
I2CWaitAck();
I2CSendByte(control); //写控制字和读取的通道
I2CWaitAck();
I2CStart();
I2CSendByte(0x91);
I2CWaitAck();
temp = I2CReceiveByte();
I2CSendAck(1);
I2CStop();
return temp;
}
//=====PCF8591 DA输出函数=====//
void PCF8591_Write(unsigned char dat)
{
I2CStart();
I2CSendByte(0x90); //器件地址为10010000,即0x90
I2CWaitAck();
I2CSendByte(0x43); //控制字,输出时第6位置1,电位器通道11是否必要存疑,等有万用表测试一下
I2CWaitAck();
I2CSendByte(dat); //输出的电压数字信号值
I2CWaitAck();
I2CStop();
}
//使用示例
V_IN1 = PCF8591_Read(0x43); //开启DA输出的同时,AD读取11电位器通道
V_IN2 = PCF8591_Read(0x03); //只进行AD读取11电位器通道
PCF8591_Write(204); //DA输出204对应的电压值到J3的19
五、注意事项
1.在进行模拟量与数字量的换算时,在运算顺序上应先乘再除,防止中间数值过小被忽略。
2.例如采样AIN1(光敏)通道电压,并转换实际电压值,在数码管上显示,注意数据类型的使用。
unsigned char AIN1 = 0; //存储读取到的原始字节数据0-255
float AIN1_F = 0; //利用公式计算电压值,使用浮点类型
unsigned int AIN1_smg = 0; //数码管显示使用int类型存储,此处将小数点乘10^n为整数便于显示
3.控制字决定了是AD还是DA还是都要、AD的通道(光敏、电位器)。DA输出Write参数是写入的二进制数值0-255,AD输入Read参数是读取的通道是哪个,而读取通道就是控制字设置的,所以就是把控制字作为参数发送,然后再return得到读到的电压值0-255。
注:本笔记仅作个人学习使用。