IIC通信驱动PCF8591模块(ADC/DAC操作)

前言

PCF8591通过IIC进行通信

本章内容涉及到IIC通信相关知识,请在看之前,先阅读这篇文章 IIC通信以及AT24C02使用

1.PCF8591有什么用

PCF8591是八位的A/D和D/A转换器,通过I2C总线串行输入/输出,并且通过3个硬件地址引脚编址,具有4个模拟输入通道,1个输出通道和1个串行I2C总线接口。3个地址引脚A0,A1和A2用于硬件编程地址。如图蓝桥杯仿真如下:
PCF8591
A0,A1,A2是地址脚,通常有八种组合方式,即最多可以连8个PCF8591。

发送第一个字节:芯片的地址
I2C
在蓝桥杯中,A0,A1,A2都接地,所以只有一个PCF8591,最后一位用于控制读写。

①ADC转换功能及其源码

发送的第二个字节:芯片的基础设置
ADC
第七位:默认为0; 第六位:如果为1,则为DA模式,如果为0,则为AD模式;
第五位,第四位:输出模式,默认为00; 第二位:默认为0(自动增量位,一般不用考虑);
第一位,第零位:通道选择位;
通道选择
选择哪一个A/D通道口,00对应通道0,01对应通道1,10对应通道2,11对应通道3.

首先进行写操作,先进行芯片寻址,0x90->写操作,然后选择哪一个A/D通道,0x01即为AIN1。

void write_ad(void)
{
	int i;
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x03);
	IIC_WaitAck();
	IIC_Stop();
	for (i=0;i<1000;i++);
}

然后是读操作:

unsigned char read_ad(void)
{
	unsigned char temp;
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	temp = IIC_RecByte();
	IIC_Ack(0);
	IIC_Stop();
	
	return temp;
}

只有一个IIC_Start();但发送的第一个字节还是先寻址芯片地址,0x91->读操作,读取到的结果temp经过换算——temp*5/256=所测出的模拟值。

②DAC输出功能及其源码

发送第一个字节:依旧是芯片地址
发送的第二个字节:0x40 —> 即允许D/A转换(模拟输出)
第三个字节:发送你要转换的数字量

扫描二维码关注公众号,回复: 11340412 查看本文章
void Out_DAC(unsigned char Digital)
{
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x40);
	IIC_WaitAck();
	IIC_SendByte(Digital);
	IIC_WaitAck();
	IIC_Stop();
}

输入的数字里 255=5V,以此类推

注意:在读取AD值时,最好有一个延迟且写入数字量后不能立马读取AD,需要先初始化ADC

2.具体例程

蓝桥杯仿真滑动变阻器ADC转换,点击下载,提取码:klqg

猜你喜欢

转载自blog.csdn.net/name_longming/article/details/106245996