当前位置: 首页 > news >正文

AD5621(单通道缓冲电压输出DAC)芯片的详细用法

目录

一,硬件电路与接线

二、软件写入信号(基于 SPI 协议)

1. 数据帧格式

2. SPI 时序控制(图 2)

3. 异常处理

二、ESP32-PICO 软件模拟 SPI 控制 AD5621 代码

1.硬件接线

2.ESP32-PICO软件模拟SPI代码


一,硬件电路与接线

核心引脚定义与供电

引脚名称功能描述
1SYNC同步信号(低有效),下拉启动 SPI 通信,16 位数据传输后上升沿更新 DAC 寄存器
2SCLK串行时钟(最大 30MHz),数据在下降沿采样
3SDIN串行数据输入(16 位,MSB 优先),前 2 位为控制位(PD1/PD0),后 12 位为 DAC 码
4VDD电源(2.7V~5.5V),需就近并联 0.1μF 陶瓷电容(高频去耦)+10μF 钽电容(低频储能)
5GND地,裸露焊盘(EP)必须直接接地以降低热阻
6VOUT轨到轨电压输出(0V~VDD),直接驱动负载(2kΩ+200pF 以内)

供电设计

单电源供电,VDD 建议通过 LC 滤波(如 10Ω+10μF)抑制噪声,避免与大电流模块共地;

基准电压直接取自 VDD,无需外部参考源,输出公式:VOUT​=VDD​×4096D​(D=0∼4095)


二、软件写入信号(基于 SPI 协议)

1. 数据帧格式

控制位(前 2 位)

PD1PD0模式说明
00正常模式输出缓冲激活,电流 75μA(5V 典型)
01掉电 1kΩ 接地电流 0.2μA(3V 典型),用于快速恢复
10掉电 100kΩ 接地更低漏电流,适合高阻抗负载
11三态(高阻)输出悬空,需外部上拉 / 下拉

数据位(后 12 位):12 位 DAC 码(0x000~0xFFF),MSB 在前,补零至 16 位。

示例:输出 2.5V(VDD=5V),代码 \(D=2.5/5 \times 4096=2048\),对应 16 位帧为 0b00_0000_0000_0000(控制位 00 + 0x0800),这里相当于做一个量程转换。


2. SPI 时序控制(图 2)

写操作步骤

拉低 SYNC(t8≥20ns),启动传输;

SCLK 下降沿逐位发送 16 位数据(t5≥5ns 建立时间,t6≥4.5ns 保持时间);

第 16 个下降沿后,拉高 SYNCDAC 寄存器更新(t7=0ns);

SYNC 高电平持续≥20ns,准备下次传输。


3. 异常处理

SYNC 中断:若传输中提前拉高 SYNC(t9≥13ns),当前数据被丢弃,避免无效更新;

掉电恢复:从掉电模式(如 1kΩ 接地)恢复需 13μs(5V),需在代码中加入延迟或状态标志。


二、ESP32-PICO 软件模拟 SPI 控制 AD5621 代码

1.硬件接线
AD5621 引脚功能ESP32-PICO GPIO(可自定义)说明(基于 AD5621.pdf 引脚定义)
SYNC同步信号(低有效)GPIO2拉低启动通信,16 位数据发送后拉高更新 DAC 输出
SCLK串行时钟GPIO4软件手动控制电平,空闲低(CPOL=0),下降沿采样数据
SDIN串行数据输入GPIO5软件输出数据位(MSB 优先),需与 SCLK 时序同步
VDD电源3.3V 或 5V符合文档 2.7V~5.5V 供电范围,需与代码VDD变量一致
GNDGND必须共地,AD5621 裸露焊盘(EP)需同步接地
VOUT模拟输出-(接负载 / 示波器)输出范围 0V~VDD,文档建议负载≤2kΩ(并联电容≤200pF)

2.ESP32-PICO软件模拟SPI代码
#include <Arduino.h>// 1. 软件模拟SPI引脚定义(可根据实际接线修改)
const int AD5621_SYNC = 2;   // SYNC引脚
const int AD5621_SCLK = 4;   // SCLK引脚
const int AD5621_SDIN = 5;   // SDIN引脚
const float VDD = 3.3;       // AD5621供电电压(3.3V/5V,需与硬件一致)
// 正常模式控制码(AD5621.pdf图41:前2位控制位PD1=0、PD0=0,对应正常工作)
const uint16_t NORMAL_MODE = 0b00 << 14;// 2. 初始化软件SPI引脚
void AD5621_SPI_Init() {pinMode(AD5621_SYNC, OUTPUT);pinMode(AD5621_SCLK, OUTPUT);pinMode(AD5621_SDIN, OUTPUT);// 初始状态:SYNC拉高(禁止通信),SCLK拉低(空闲低,符合CPOL=0)digitalWrite(AD5621_SYNC, HIGH);digitalWrite(AD5621_SCLK, LOW);
}// 3. 软件模拟SPI发送16位数据(核心:AD5621.pdf时序要求——下降沿采样)
// 数据帧格式:2位控制位 + 12位DAC数据 + 2位忽略位(MSB优先)
void AD5621_SPI_Send16Bits(uint16_t data) {// 步骤1:拉低SYNC,启动通信(AD5621.pdf图2:SYNC低电平有效)digitalWrite(AD5621_SYNC, LOW);delayMicroseconds(1);  // 确保SYNC低电平稳定(满足文档t8≥20ns)// 步骤2:逐位发送16位数据(MSB优先,从bit15到bit0)for (int i = 15; i >= 0; i--) {// ① 输出当前数据位到SDIN(先准备数据,满足文档t5≥5ns建立时间)uint8_t dataBit = (data >> i) & 0x01;digitalWrite(AD5621_SDIN, dataBit);delayMicroseconds(1);  // 数据建立时间(远大于文档要求的5ns)// ② SCLK拉高(上升沿,AD5621不采样,符合CPHA=1)digitalWrite(AD5621_SCLK, HIGH);delayMicroseconds(1);  // 满足文档t2≥5ns(SCLK高电平持续时间)// ③ SCLK拉低(下降沿,AD5621采样SDIN数据,核心时序)digitalWrite(AD5621_SCLK, LOW);delayMicroseconds(1);  // 满足文档t3≥5ns(SCLK低电平持续时间)}// 步骤3:拉高SYNC,更新DAC输出(AD5621.pdf第14章:SYNC拉高触发更新)digitalWrite(AD5621_SYNC, HIGH);delayMicroseconds(1);  // 确保更新完成
}// 4. 计算DAC数据并发送(基于AD5621.pdf输出电压公式:Vout = VDD × D/4096)
void AD5621_SetVoltage(float targetVoltage) {uint16_t dacCode;// 电压范围保护(避免超出AD5621 0V~VDD输出范围)if (targetVoltage < 0.0) {dacCode = 0;} else if (targetVoltage > VDD) {dacCode = 4095;  // 12位DAC最大数据(全1码)} else {dacCode = (uint16_t)(targetVoltage / VDD * 4096);}// 构建16位数据帧(控制位2位 + DAC数据12位 + 忽略位2位)uint16_t dataFrame = NORMAL_MODE | (dacCode << 2);// 发送数据帧AD5621_SPI_Send16Bits(dataFrame);// 串口调试(可选,验证数据)Serial.print("DAC代码:");Serial.print(dacCode);Serial.print(" | 目标电压:");Serial.print(targetVoltage);Serial.print("V | 实际输出:");Serial.print((float)dacCode / 4096 * VDD, 3);Serial.println("V");
}// 5. 初始化与主循环
void setup() {Serial.begin(115200);  // 串口调试(波特率115200)AD5621_SPI_Init();     // 初始化软件SPISerial.println("AD5621软件SPI初始化完成,开始输出电压...");
}void loop() {// 循环输出不同电压(每隔2秒切换,可根据需求修改)AD5621_SetVoltage(0.0);    // 输出0Vdelay(2000);AD5621_SetVoltage(1.0);    // 输出1Vdelay(2000);AD5621_SetVoltage(2.0);    // 输出2Vdelay(2000);AD5621_SetVoltage(VDD);    // 输出最大电压(与VDD一致)delay(2000);
}

1. 软件模拟 SPI 时序

AD5621.pdf 要求 SPI 时序为CPOL=0(SCLK 空闲低)、CPHA=1(下降沿采样),代码中通过以下步骤实现:

SCLK 初始状态AD5621_SPI_Init()中设置digitalWrite(AD5621_SCLK, LOW),符合 “空闲低” 要求;

数据采样边沿:每发送 1 位数据时,先将数据位输出到 SDIN(准备数据),再拉高 SCLK(上升沿,不采样),最后拉低 SCLK(下降沿,AD5621 采样数据),完全匹配文档图 2 时序;

时序参数满足delayMicroseconds(1)(1 微秒 = 1000 纳秒)远大于文档要求的 “建立时间 t5≥5ns”“SCLK 高电平 t2≥5ns”“SCLK 低电平 t3≥5ns”,确保时序稳定。

2. 数据帧格式

AD5621.pdf 图 41 明确 16 位输入寄存器格式为 “2 位控制位 + 12 位 DAC 数据 + 2 位忽略位”:

控制位:NORMAL_MODE = 0b00 << 14(对应正常工作模式,禁止掉电);

DAC 数据:12 位dacCode左移 2 位,填充 “忽略位”,确保数据对齐寄存器;

示例:目标电压 1.65V(VDD=3.3V),dacCode=2048(0x800),数据帧 = 0b00_100000000000_00(0x8000),完全符合文档格式。

http://www.dtcms.com/a/391265.html

相关文章:

  • vLLM的面试题
  • 最优控制3 -- 动态规划-一个解析解的例子
  • 深入分析大众点评 Ajax 接口:直接请求 JSON 数据高效获取评论
  • 京东零售张科:DataAI Infra会成为驱动未来的技术基石
  • Java 运维中的一些常用命令
  • 用 go-commons 打造一套最小可行监控体系
  • 广东省省考备考(第一百零二天9.19)——言语(拔高突破第二节课)
  • 在vscode中,在powershell 下,如何进入子目录?
  • 易语言源码怎么制作软件 易语言源码和模块怎么做成软件
  • 4-2〔O҉S҉C҉P҉ ◈ 研记〕❘ WEB应用攻击▸目录遍历漏洞-B
  • 【Javaweb】http协议-请求与响应
  • 内网穿透系列十三:wstunnel 一款通过 Websocket 或 HTTP2 隧道传输的内网穿透工具
  • 【开关电源篇】自激振荡开关电源原理详解-从模块解析到故障维修
  • SpringBoot+Vue实现图片上传
  • C++ 函数指针与排序策略
  • 12分钟讲解Python核心理念
  • 01数据结构-串和KMP算法
  • 前端性能优化实用方案(三):骨架屏提升30%用户感知速度
  • NVR设备ONVIF接入平台EasyCVR视频融合平台智慧小区视频监控一站式建设方案
  • window XP环境下配置VC6.0的Win32汇编语言开发环境
  • 【算法】0_算法工程师常见算法题
  • 免费插件分享 | BaseTool
  • sk04.【scikit-learn基础】--『监督学习』之 线性回归
  • Ubuntu终端切换WiFi
  • eBest渠道商管理软件:快消品渠道数字化的“破局利器”
  • 基于protues的电子时钟仿真与模拟
  • FastProperty 高效的属性读写设置
  • 【开题答辩全过程】以 基于Java的失物招领平台为例,包含答辩的问题和答案
  • 【7/20】前后端整合:Vue.js 调用 Express API,操作 MongoDB 数据,实现用户管理系统
  • 【8/20】用户认证基础:JWT 在 Express 中的实现,实现安全登录