第7周 PCF8591 板块


:books: PCF8591模块学习笔记总结 ( ̄ω ̄)

一、PCF8591模块基础 (* ̄︶ ̄)

1.1 模块简介

PCF8591是一个8位AD/DA转换芯片,通过I2C总线进行通信。

关键引脚:

  • SDA:数据线(Serial Data)
  • SCL:时钟线(Serial Clock)
  • AIN0-3:4个模拟输入通道(重点关注 AIN1 和 AIN3)
  • A0-A2:地址选择引脚
  • AOUT:模拟输出引脚

二、I2C通信协议要点 ( ̄▽ ̄)ゞ

2.1 主从设备判断

谁控制时钟线SCL,谁就是主设备!

2.2 通信信号

  • 起始信号:必须的!
  • 结束信号:可选
  • 应答信号:可选

三、控制字节格式 ( ̄~ ̄;)

这是PCF8591的核心配置!

Bit 7 | Bit 6 | Bit 5-4 | Bit 3 | Bit 2 | Bit 1-0
0 | 使能 | 模式 | 自动 | 保留 | 通道选择

重要说明:

  • Bit 6:0 = AD模式,1 = DA模式
  • Bit 4-5:蓝桥杯中默认为 0

四、AD转换(模拟→数字) o( ̄▽ ̄)d

4.1 功能说明

AD转换就是把电信号转换成离散数字形式(0-255)

4.2 代码实现

unsigned char Ad_Read(unsigned char addr)
{
unsigned char temp; // 存储读取的ADC数据

  // ========== 第一步:写入要读取的通道地址 ==========
  IIC_Start();              // 发送I2C起始信号
  IIC_SendByte(0x90);       // 发送PCF8591的写地址(0x90 = 1001000 + 0写)
  IIC_WaitAck();            // 等待PCF8591应答

  IIC_SendByte(addr);       // 发送通道选择字节(选择ADC通道0-3)
  IIC_WaitAck();            // 等待PCF8591应答

  // ========== 第二步:读取ADC转换结果 ==========
  IIC_Start();              // 发送重复起始信号(不发送停止信号,直接重新开始)
  IIC_SendByte(0x91);       // 发送PCF8591的读地址(0x91 = 1001000 + 1读)
  IIC_WaitAck();            // 等待PCF8591应答

  temp = IIC_RecByte();     // 读取一个字节的ADC数据(0-255)
  IIC_SendAck(1);           // 发送非应答信号(NACK,1表示结束读取)

  // ========== 第三步:结束通信 ==========
  IIC_Stop();               // 发送I2C停止信号

  return temp;              // 返回读取到的ADC值

}

关键地址:

  • 0x41:光敏电阻通道
  • 0x43:滑动变阻器通道

五、DA转换(数字→模拟) ( ̄▽ ̄)/

5.1 功能说明

DA转换就是将离散数字形式转换成电信号(0-255 → 0-5V)

5.2 代码实现

void Da_Write(unsigned char dat)
{
// ========== 第一步:启动I2C通信 ==========
IIC_Start(); // 发送I2C起始信号
IIC_SendByte(0x90); // 发送PCF8591的写地址(0x90 = 1001000 + 0写)
IIC_WaitAck(); // 等待PCF8591应答

  // ========== 第二步:发送控制字节,使能DAC ==========
  IIC_SendByte(0x41);       // 发送控制字节0x41(0100 0001 = 使能DAC输出)
  IIC_WaitAck();            // 等待PCF8591应答

  // ========== 第三步:发送DAC数据 ==========
  IIC_SendByte(dat);        // 发送DAC数据(0-255),控制输出电压
  IIC_WaitAck();            // 等待PCF8591应答

  // ========== 第四步:结束通信 ==========
  IIC_Stop();               // 发送I2C停止信号,DAC开始输出电压

}


六、实用技巧 ( ` ω´ )

6.1 电压转换公式

// AD读取:0-255 → 0-5V
float voltage = Ad_Read(0x43) / 51.0;

// DA输出:0-5V → 0-255
Da_Write(voltage * 51);

6.2 测试方法

Da_Write(127); // 输出约2.5V
用万用表测量 J13的A/D D/A引脚来验证输出电压!


七、核心知识点总结 o( ̄▽ ̄)d

  1. PCF8591 = 8位AD/DA转换芯片,使用I2C通信
  2. I2C地址:写地址 0x90,读地址 0x91
  3. AD转换:电信号 → 数字(0-255)
  4. DA转换:数字(0-255)→ 电信号
  5. 控制字节 0x41:使能DAC输出
  6. 通道地址:0x41(光敏)、0x43(滑动变阻器)
  7. 电压范围:0-5V ↔ 0-255(除以或乘以51转换)

八、注意事项 ( ̄へ ̄)

  1. AD读取需要两次通信:先写通道地址,再读数据
  2. DA输出需要使能:必须发送控制字节 0x41
  3. 数据范围:0-255,超出范围会溢出!
  4. 电压转换:记得除以或乘以 51!
  5. 测试验证:用万用表测量实际输出电压

1 个赞