IIC器件之PCF8591数据手册详解(DATA SHEET)

4 篇文章 1 订阅
本文详细介绍了PCA8591芯片的工作原理和使用方法,包括模拟输入输出接口、器件地址、控制字节设置、DAC和ADC模式的操作。在DAC模式中,阐述了数据发送时序和电压计算公式,并提供了STM32的示例代码。而在ADC模式下,指出了数据读取的注意事项和结果计算方式,同样给出了STM32的读取示例。该文对于理解和应用PCA8591芯片进行模拟信号处理具有指导价值。
摘要由CSDN通过智能技术生成

一、引脚解读

在这里插入图片描述

AOUT 芯片DA输出接口
AIN0 芯片模拟输入接口0
AIN1 芯片模拟输入接口1
AIN2 芯片模拟输入接口2
AIN3 芯片模拟输入接口3
SCL IIC串行时钟线
SDA IIC串行数据线
VDD 正电源电压
VSS 负电源电压
VREF 电压参考输入
AGND 模拟地
A0、A1、A2 可编程位器件地址

二、器件地址

在这里插入图片描述
4位固定位,3位可编程位,1位读写位。

三、控制字节

在这里插入图片描述

3.1 X1、X0

表示选择AD采集的通道
在这里插入图片描述

3.2 X2

是否自动变更采集通道
在这里插入图片描述

3.3 X4、X5

模拟输入的模式:
4通道单独输入;
通道0、1、2跟通道3比较后输入;
通道0、1单独输入,通道2跟通道3比较后输入;
通道0跟通道1比较后输入,通道2跟通道3比较后输入;
在这里插入图片描述

四、DAC模式

4.1 数据发送时序

如图所示,先发送控制字节,再发送数据字节;
在这里插入图片描述

4.2 DAC结果计算公式

uint8_t value = v * 255 / (VREF-VAGND);

4.3 stm32为例,输出dac模拟电压

int PCF8591SendByte(unsigned char value)
{   
	IIC_Start();    
	IIC_Send_Byte(ADDR_PCF8591<<1);  
	if(IIC_Wait_Ack() != 0){
		//printf("wait ack error\r\n");
		return -1;
	}
	IIC_Send_Byte(0x40);  
	if(IIC_Wait_Ack() != 0){
		//printf("wait ack error\r\n");
		return -1;
	}	
	IIC_Send_Byte(value);
	if(IIC_Wait_Ack() != 0){
		//printf("wait ack error\r\n");
		return -1;
	}	
	IIC_Stop();
	return 1;
}
void dacOut(float v)
{
	 uint8_t value = v * 255 / VBASE;	
	 PCF8591SendByte(value);
}

五、ADC模式

5.1 数据发送时序

在这里插入图片描述

5.2 ADC结果计算公式

float v=  value  / 255.0 * (VREF-VAGND)

5.3 重要说明

1、ADC读取结果前必须已经发送控制字节,选择对应的ADC采集模式和采集通道。
2、IIC读取的第一个数据为上次测量的结果

5.4 stm32为例,读一次测量结果

int PCF8591ReadByte(unsigned char addr)
{
	int value;
	IIC_Start();
	IIC_Send_Byte(ADDR_PCF8591<<1);	
	if(IIC_Wait_Ack() != 0){
		//printf("wait ack error\r\n");
		return -1;
	}
	
	IIC_Send_Byte(addr);
	if(IIC_Wait_Ack() != 0){
	//printf("wait ack error\r\n");
		return -1;
	}
	IIC_Stop();
	
	
	IIC_Start();
	
	IIC_Send_Byte(0x91);
	if(IIC_Wait_Ack() != 0){
		//printf("wait ack error\r\n");
		return -1;
	}
	Delay_ms(10);
	
	value = IIC_Read_Byte(1); //上次测量的结果
	
	value = IIC_Read_Byte(0);
	
	IIC_Stop();                  
	
	return value;

}
float adcReadV(char addr)
{
	float v = -1;
	int value;
	value = PCF8591ReadByte(addr);
	if(value != -1){
		v=  value  / 255.0 * 5;
	}	
	return v;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值