PCF8591怎么用
PCF8591 是一款常用的、价格低廉的 8位 模数/数模转换器 (ADC/DAC) 芯片,通过 I2C 总线 与微控制器(如 Arduino, Raspberry Pi, STM32 等)通信。它包含 4个 ADC 输入通道 和 1个 DAC 输出通道。
核心特点:
- ADC (模拟转数字):
- 4 个单端输入通道 (AIN0, AIN1, AIN2, AIN3)。
- 可配置为 2 路差分输入 (差分模式比较两个输入端之间的电压差)。
- 8 位分辨率 (0-255 对应模拟电压范围)。
- 转换速率取决于 I2C 速度和操作方式。
- DAC (数字转模拟):
- 1 个输出通道 (AOUT)。
- 8 位分辨率。
- 接口: I2C 总线 (地址可通过硬件引脚 A0-A2 配置,通常默认 0x48)。
- 电源: 典型工作电压 2.5V - 6V。
使用方法步骤 (以 ADC 读取为例):
-
硬件连接 (以 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 -----> (可选) 示波器/电路 -
软件编程 (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-AIN311: 两路差分输入 (AIN0-AIN1, AIN2-AIN3)
- Bit 1-0: 保留,必须设为
00。
-
使用 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 (0x4X或0x0X),否则 AOUT 会进入高阻态。 - 第二个字节 (
dacValue, 0-255) 直接写入 DAC 的寄存器,立即更新 AOUT 引脚上的模拟电压 (Vout = (dacValue / 255) * VREF)。
- 控制字 (
重要注意事项:
- I2C 地址: 确认硬件地址引脚 (A0, A1, A2) 的连接,以确定实际地址 (默认为
0x48)。 - 参考电压 (VREF): 强烈建议连接一个稳定的 VREF! 内部基准可能不够稳定/准确。测量的电压范围和 DAC 输出范围都直接依赖于 VREF 引脚上的电压。VREF 必须在
VCC和AGND之间。 - 输入电压范围: 模拟输入电压 绝对不能超过 VCC 和 GND 的范围,否则可能损坏芯片!理想范围是 GND 到 VREF (通常连接到 VCC)。
- 转换速率和延迟: ADC 转换需要时间,在发送控制字 (
Wire.endTransmission()) 后需要等待足够的时间 (delay()或delayMicroseconds()) 再进行读数,否则读到的是旧数据或无效数据。所需时间取决于硬件和配置,需查阅手册或实测。 - 返回值滞后: 当你发起一次读取请求时 (
Wire.requestFrom),返回的第一个字节的数据 是上一次启动的转换的结果,而不是当前这次请求的结果。这就是为什么示例代码通常读取并丢弃第一个字节,再读第二个字节作为真正所需的当前值。 - 供电和接地: 确保良好的 VCC 和 GND 连接,模拟部分和数字部分的接地最好在一点汇合。
常见应用:
- 读取电位计、光敏电阻、热敏电阻、压力传感器等输出的模拟电压。
- 读取模拟传感器信号 (需注意信号幅度可能需要放大或衰减)。
- 产生可编程的模拟电压信号 (如控制LED亮度、作为简单函数信号发生器的基础)。
- 测量电池电压。
- 低成本的多通道数据采集。
通过理解 I2C 通信、控制字设置和注意关键的硬件连接点,你就可以轻松地在项目中使用 PCF8591 来实现模拟信号的输入和输出功能了。
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通过IIC进行通信
目录标题前言PCF8591有什么用ADC转换功能及其源码DAC输出功能及其源码具体例程前言PCF8591通过IIC进行通信本章内容涉及到IIC通
PCF8591硬件接口相关资料分享
文章目录PCF8591硬件接口(电路图引脚图)PCF8591硬件接口(电路图引脚图)PCF8591 是一个单电源低功耗的8位 CMOS 数据采集
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
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- dtmb信号覆盖城市查询
- EDA是什么?有什么作用?
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 如何进行编码器的正确接线?接线方法介绍
- 什么是场效应管?它的作用是什么?
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- amoled屏幕和oled区别
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 苹果笔记本macbookpro18款与19款区别
- 通讯隔离作用
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机