登录/注册

PCF8591怎么用

更多

PCF8591 是一款常用的、价格低廉的 8位 模数/数模转换器 (ADC/DAC) 芯片,通过 I2C 总线 与微控制器(如 Arduino, Raspberry Pi, STM32 等)通信。它包含 4个 ADC 输入通道1个 DAC 输出通道

核心特点:

  1. ADC (模拟转数字):
    • 4 个单端输入通道 (AIN0, AIN1, AIN2, AIN3)。
    • 可配置为 2 路差分输入 (差分模式比较两个输入端之间的电压差)。
    • 8 位分辨率 (0-255 对应模拟电压范围)。
    • 转换速率取决于 I2C 速度和操作方式。
  2. DAC (数字转模拟):
    • 1 个输出通道 (AOUT)。
    • 8 位分辨率。
  3. 接口: I2C 总线 (地址可通过硬件引脚 A0-A2 配置,通常默认 0x48)。
  4. 电源: 典型工作电压 2.5V - 6V。

使用方法步骤 (以 ADC 读取为例):

  1. 硬件连接 (以 Arduino 为例):

    • VCC: 连接到 3.3V 或 5V (与控制器逻辑电平匹配)。
    • GND: 连接到控制器 GND。
    • SCL: 连接到控制器的 I2C 时钟引脚 (Arduino Uno: A5 / SCL)。
    • SDA: 连接到控制器的 I2C 数据引脚 (Arduino Uno: A4 / SDA)。
    • A0, A1, A2: 用于设置 I2C 地址的硬件地址引脚。全部接地 (GND) 表示地址为 0x48 (最常见配置)。连接到 VCC 或悬空 (内部有上拉) 会改变地址位。
    • 模拟输入: 将要测量的模拟信号连接到 AIN0 - AIN3 中的一个。
    • 模拟输出: AOUT 引脚可以连接示波器或其它电路来观察 DAC 输出。
    • (可选) OSC: 外部时钟输入,一般不用,悬空。
    • (可选) EXT: 内部/外部基准电压选择,使用内部基准电压时接地。强烈建议接一个稳定的参考电压到 VREF 引脚 (例如 2.5V, 3.3V, 5V,与 VCC 一致即可) 以获得更准确的测量结果。
      PCF8591      Arduino (Uno)
      -------------------------
      VCC    -----> 5V/3.3V
      GND    -----> GND
      SCL    -----> A5 (SCL)
      SDA    -----> A4 (SDA)
      A0     -----> GND
      A1     -----> GND
      A2     -----> GND
      VREF   -----> (可选,但推荐) VCC 或 独立稳定的参考电压源
      AIN0   -----> 模拟信号源 0 (如电位计中间引脚)
      ...           ...
      AOUT   -----> (可选) 示波器/电路
  2. 软件编程 (Arduino 示例 - 读取 AIN0):

    核心是使用 Wire 进行 I2C 通信。你需要向 PCF8591 发送一个 控制字 (Control Byte) 来选择哪个通道进行 ADC 转换并启动转换,然后读取转换结果。

    #include <Wire.h>
    
    #define PCF8591_ADDR 0x48 // 默认硬件地址 (A0=A1=A2=GND)
    
    void setup() {
      Wire.begin();          // 初始化 I2C 总线
      Serial.begin(9600);   // 初始化串口用于输出结果
    }
    
    void loop() {
      // 1. 发送控制字: 启动 ADC, 选择通道0 (0x40), 保持默认设置 (如非自动递增)
      Wire.beginTransmission(PCF8591_ADDR);
      Wire.write(0x40); // 控制字: 模拟输出使能(最高位0, DAC输出可用), 选择通道0(00), 非自动递增(00)
      Wire.endTransmission();
    
      // 2. 短暂延时(给芯片转换时间,约 100μs - 几ms, 实测调整)
      delay(10);
    
      // 3. 请求读取 2 个字节 (PCF8591 会在发送新数据前先发送 *上一次* 的转换结果)
      Wire.requestFrom(PCF8591_ADDR, 2); // 请求 2 字节
    
      // 4. 读取并丢弃第一个字节 (它包含上一次转换的值,通常我们不需要)
      if (Wire.available()) {
        Wire.read();
      }
    
      // 5. 读取第二个字节 (这是当前请求的实际转换结果)
      if (Wire.available()) {
        int adcValue = Wire.read();
        Serial.print("AIN0: ");
        Serial.println(adcValue); // 输出 ADC 原始值 (0-255)
    
        // 可选:转换为电压值 (假设 VREF 连接到了 5V)
        float voltage = (adcValue / 255.0) * 5.0; // 5.0 换成你实际使用的VREF电压值
        Serial.print("Voltage: ");
        Serial.print(voltage, 2); // 保留两位小数
        Serial.println(" V");
      }
      delay(500); // 延时半秒
    }

    控制字说明 (0x40):

    • 0x40 的二进制: 0100 0000
    • Bit 7 (最高位): Output Enable (模拟输出使能)0 = DAC 输出寄存器内容有效 (输出到 AOUT),1 = DAC 输出高阻态 (默认)。 读取 ADC 时通常会设成 0,这样如果需要 DAC 输出还能用。如果只关心输入且不需要输出,也可以设成 1。
    • Bit 6-5: 模拟输入编程
      • 00: 选择通道 0 (AIN0)
      • 01: 选择通道 1 (AIN1)
      • 10: 选择通道 2 (AIN2)
      • 11: 选择通道 3 (AIN3)
    • Bit 4: 自动递增 (Auto-Increment) 使能0 = 禁用 (本例中),读取保持通道不变。1 = 使能,每次读取后通道号自动加 1 (用于快速轮询多个通道)。
    • Bit 3-2: 模拟输入模式 (本例未用,通常为 00 表示单端输入):
      • 00: 四路单端输入
      • 01: 三路差分输入 (AIN0-AIN1, AIN2-GND, AIN3-GND? 实际模式依具体型号手册)
      • 10: 单端 AIN0 & AIN1, 差分 AIN2-AIN3
      • 11: 两路差分输入 (AIN0-AIN1, AIN2-AIN3)
    • Bit 1-0: 保留,必须设为 00
  3. 使用 DAC 输出 (Arduino 示例 - AOUT 输出锯齿波):

    #include <Wire.h>
    
    #define PCF8591_ADDR 0x48
    
    void setup() {
      Wire.begin();
    }
    
    void loop() {
      for (int dacValue = 0; dacValue < 256; dacValue++) {
        // 1. 发送控制字 (启用 DAC 输出:Bit7=0) 和要输出的数字值 (DAC 值)
        Wire.beginTransmission(PCF8591_ADDR);
        Wire.write(0x40);    // 控制字: Output Enable (Bit7=0), 选择任意通道(本例ADC无关紧要), 其他默认
        Wire.write(dacValue); // DAC 输出寄存器值 (0-255)
        Wire.endTransmission();
        delay(1); // 控制波形速度
      }
    }
    • 控制字 (0x40) 的第 7 位 (Output Enable) 必须设为 0 (0x4X0x0X),否则 AOUT 会进入高阻态。
    • 第二个字节 (dacValue, 0-255) 直接写入 DAC 的寄存器,立即更新 AOUT 引脚上的模拟电压 (Vout = (dacValue / 255) * VREF)。

重要注意事项:

  1. I2C 地址: 确认硬件地址引脚 (A0, A1, A2) 的连接,以确定实际地址 (默认为 0x48)。
  2. 参考电压 (VREF): 强烈建议连接一个稳定的 VREF! 内部基准可能不够稳定/准确。测量的电压范围和 DAC 输出范围都直接依赖于 VREF 引脚上的电压。VREF 必须在 VCCAGND 之间。
  3. 输入电压范围: 模拟输入电压 绝对不能超过 VCC 和 GND 的范围,否则可能损坏芯片!理想范围是 GND 到 VREF (通常连接到 VCC)。
  4. 转换速率和延迟: ADC 转换需要时间,在发送控制字 (Wire.endTransmission()) 后需要等待足够的时间 (delay()delayMicroseconds()) 再进行读数,否则读到的是旧数据或无效数据。所需时间取决于硬件和配置,需查阅手册或实测。
  5. 返回值滞后: 当你发起一次读取请求时 (Wire.requestFrom),返回的第一个字节的数据 是上一次启动的转换的结果,而不是当前这次请求的结果。这就是为什么示例代码通常读取并丢弃第一个字节,再读第二个字节作为真正所需的当前值。
  6. 供电和接地: 确保良好的 VCC 和 GND 连接,模拟部分和数字部分的接地最好在一点汇合。

常见应用:

通过理解 I2C 通信、控制字设置和注意关键的硬件连接点,你就可以轻松地在项目中使用 PCF8591 来实现模拟信号的输入和输出功能了。

PCF8591

PCF8591 - 8-bit A/D and D/A converter - NXP Semiconductors

2022-11-04 17:22:44

Linux驱动开发-编写PCF8591(ADC)芯片驱动

PCF8591是一个IIC总线接口的ADC/DAC转换芯片,功能比较强大,这篇文章就介绍在Linux系统里如何编写一个PCF8591的驱动,完成ADC数据采集,DAC数据输出。

2022-09-17 15:16:01

如何将PCF8591 ADC模块与Raspberry Pi连接

 在本教程中,我们将学习如何将 PCF8591 ADC/DAC 模块与 Raspberry Pi 连接。

2022-08-26 15:58:31

基于8051的Proteus仿真-PCF8591模数与数模转换

基于8051的Proteus仿真-PCF8591模数与数模转换实验

资料下载 jinyi7016 2022-05-12 10:18:36

单片机:PCF8591 应用程序

文章目录PCF8591 应用程序PCF8591 应用程序PCF8591 的通信接口是 I2C,那么编程肯定是要符合这个协议的。单片机对

资料下载 杨火亭 2022-01-18 10:38:24

蓝桥杯单片机组IIC总线PCF8591

一,PCF8591——ADC先上干货//Control_byte:控制字节u8 read_pcf8591(Control_byte)//读pcf8591

资料下载 佚名 2021-12-14 19:01:08

PCF8591模数与数模转换实验的程序和工程文件免费下载

本文档的主要内容详细介绍的是PCF8591模数与数模转换实验的程序和工程文件免费下载。

资料下载 佚名 2020-09-08 18:08:07

PCF8591模数与数模转换的Proteus仿真电路图免费下载

本文档的主要内容详细介绍的是PCF8591模数与数模转换的Proteus仿真电路图免费下载。

资料下载 佚名 2020-01-14 15:05:04

PCF8591 ADC与Arduino连接的方法

在本教程中,我们将检查 如何将 PCF8591 ADC/DAC 模块与 Arduino 连接。

2022-08-26 15:18:20

PCF8591通过IIC进行通信

目录标题前言PCF8591有什么用ADC转换功能及其源码DAC输出功能及其源码具体例程前言PCF8591通过IIC进行通信本章内容涉及到IIC通

2022-01-20 06:56:28

PCF8591硬件接口相关资料分享

文章目录PCF8591硬件接口(电路图引脚图)PCF8591硬件接口(电路图引脚图)PCF8591 是一个单电源低功耗的8位 CMOS 数据采集

2021-12-10 07:59:26

PCF8591是什么?怎样去设计PCF8591电路?

PCF8591是什么?怎样去设计PCF8591电路?如何去编写ADC/DAC模块函数代码?

2021-07-19 08:56:50

PCF8591的原理图与电路图解析

PCF8591是一个单电源低功耗的8位CMOS数据采集器件,其接口电路的工作原理图,PCF8591原理图与PCF8591电路图。

2020-02-20 01:18:03

微雪电子ADC DAC AD DA转换PCF8591 PCF8591T简介

PCF8591 AD DA转换模块 I2C接口 8位精度 四通道AD 单通道DA 电压输出型 型号 PCF8591 AD DA Board

2019-12-30 09:59:01

正点原子开拓者FPGA:ADDA实验(PCF8591

PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行I²C总线接口。PCF

2019-09-10 06:04:00

7天热门专题 换一换
相关标签