别再死记硬背了!用Arduino和ADC0804芯片,5分钟搞懂AD转换的采样保持到底在干啥

张开发
2026/4/17 9:52:32 15 分钟阅读

分享文章

别再死记硬背了!用Arduino和ADC0804芯片,5分钟搞懂AD转换的采样保持到底在干啥
用Arduino和ADC0804芯片5分钟直观理解AD转换的采样保持原理记得第一次在教科书上看到采样保持电路这个词时我盯着那几张抽象的原理图看了半小时还是一头雾水。直到后来用ADC0804芯片配合Arduino做了个简单的电压测量实验才突然明白那些看似复杂的专业术语到底在描述什么。今天我们就用最直观的方式通过实际电路和代码来观察采样保持的完整过程。1. 实验准备认识你的硬件伙伴在开始动手前我们先快速了解下今天要用到的两个核心硬件Arduino开发板和ADC0804模数转换芯片。Arduino相信大家都不陌生这个开源硬件平台以其易用性著称即使没有电子工程背景也能快速上手。而ADC0804则是经典的8位逐次逼近型ADC芯片虽然现在有更多高性能ADC可选但它简单的引脚设计和稳定的性能使其成为学习AD转换原理的理想选择。ADC0804关键引脚说明引脚名称类型功能描述VIN()输入模拟信号正输入端VIN(-)输入模拟信号负输入端单端接地DB0-DB7输出8位数字输出CS输入片选信号低电平有效RD输入读使能低电平有效WR输入写/启动转换低电平有效INTR输出转换结束中断低电平有效提示ADC0804的工作电压为5V与Arduino的IO电平完全兼容这大大简化了我们的电路设计。实验还需要一个10kΩ电位器作为模拟信号源几根杜邦线以及一个USB数据线为Arduino供电。硬件成本总共不超过50元但能获得的价值远超这个数字。2. 电路连接从原理图到面包板现在让我们把理论转化为实际电路。ADC0804与Arduino的连接并不复杂但有几个关键点需要注意电源连接ADC0804的VCC接Arduino的5V输出AGND和DGND都连接到Arduino的地参考电压Vref/2接2.5V可以用两个5kΩ电阻分压获得控制信号连接CS引脚直接接地始终使能芯片WR连接到Arduino的D2引脚RD连接到Arduino的D3引脚INTR连接到Arduino的D4引脚数据线连接DB0-DB7分别连接到Arduino的D5-D12模拟输入VIN()连接电位器的中间引脚VIN(-)接地电位器两端分别接5V和地// 简单的连接测试代码 void setup() { pinMode(2, OUTPUT); // WR pinMode(3, OUTPUT); // RD pinMode(4, INPUT); // INTR Serial.begin(9600); } void loop() { digitalWrite(2, LOW); // 启动转换 delayMicroseconds(10); digitalWrite(2, HIGH); while(digitalRead(4) HIGH); // 等待转换完成 digitalWrite(3, LOW); // 读取数据 // 这里添加读取DB0-DB7的代码 digitalWrite(3, HIGH); delay(100); }这个基础代码框架展示了如何启动转换和读取结果。在实际实验中我们会进一步完善它来实现波形观测功能。3. 代码实现让采样过程可视化为了真正理解采样保持的原理我们需要看到电压是如何被捕捉并保持的。Arduino的串口绘图器(Serial Plotter)功能将成为我们的秘密武器它能实时显示电压变化让抽象的概念变得触手可及。下面是完整的实验代码const int WR_PIN 2; const int RD_PIN 3; const int INTR_PIN 4; const int DATA_PINS[] {5,6,7,8,9,10,11,12}; void setup() { for(int i0; i8; i) { pinMode(DATA_PINS[i], INPUT); } pinMode(WR_PIN, OUTPUT); pinMode(RD_PIN, OUTPUT); pinMode(INTR_PIN, INPUT); digitalWrite(WR_PIN, HIGH); digitalWrite(RD_PIN, HIGH); Serial.begin(115200); } void loop() { // 启动转换 digitalWrite(WR_PIN, LOW); delayMicroseconds(1); digitalWrite(WR_PIN, HIGH); // 等待转换完成 while(digitalRead(INTR_PIN) HIGH); // 读取结果 digitalWrite(RD_PIN, LOW); int adcValue 0; for(int i0; i8; i) { adcValue | (digitalRead(DATA_PINS[i]) i); } digitalWrite(RD_PIN, HIGH); // 转换为电压值(0-5V) float voltage adcValue * (5.0 / 256.0); // 发送到串口绘图器 Serial.println(voltage); // 控制采样率 delay(10); }上传这段代码后打开Arduino IDE的串口绘图器(Tools Serial Plotter)然后慢慢旋转电位器。你会看到一个相当平滑的电压变化曲线——这说明我们的ADC工作正常但还看不到采样保持的效果。4. 揭示采样保持调整代码观察细节要看到采样保持的实际效果我们需要做两处关键修改提高采样率减少loop()中的delay时间让采样更密集添加原始模拟值同时输出电位器的直接读数作为对比修改后的核心代码如下void loop() { // 读取原始模拟值(A0引脚接电位器) int rawAnalog analogRead(A0); float rawVoltage rawAnalog * (5.0 / 1024.0); // ADC0804转换 digitalWrite(WR_PIN, LOW); delayMicroseconds(1); digitalWrite(WR_PIN, HIGH); while(digitalRead(INTR_PIN) HIGH); digitalWrite(RD_PIN, LOW); int adcValue 0; for(int i0; i8; i) { adcValue | (digitalRead(DATA_PINS[i]) i); } digitalWrite(RD_PIN, HIGH); float adcVoltage adcValue * (5.0 / 256.0); // 同时输出两个电压值 Serial.print(rawVoltage); Serial.print(,); Serial.println(adcVoltage); delay(5); // 更快的采样周期 }现在串口绘图器会显示两条曲线一条是电位器的直接读数连续变化的模拟信号另一条是经过ADC0804转换后的数字值。当你快速旋转电位器时可以清楚地看到模拟信号是连续变化的平滑曲线数字信号呈现阶梯状每个台阶就是采样保持的结果每个台阶的持续时间取决于我们的采样率这个简单的实验完美展示了采样保持的两个关键阶段采样时刻ADC捕获当前电压值台阶的起点保持阶段在下次采样前输出保持这个值不变台阶的水平部分5. 深入理解从现象到本质通过前面的实验我们已经直观地看到了采样保持的效果。现在让我们更深入地理解背后的原理和技术细节。采样保持电路的核心组件采样开关通常是一个MOSFET晶体管在采样时刻短暂导通保持电容存储采样时刻的电压值ADC0804内部约100pF缓冲放大器高输入阻抗防止电容过快放电在ADC0804内部这个过程的时序如下WR引脚变低时启动转换并闭合采样开关采样开关在极短时间内(约1μs)闭合对输入电压采样采样开关断开电容开始保持电压逐次逼近逻辑开始工作比较器将保持的电压转换为数字值转换完成INTR引脚变低读取数据时RD引脚变低数字值输出到DB0-DB7实际工程中的考量采样时间必须足够长以确保电容充电到准确值保持衰减由于电容漏电保持的电压会缓慢下降孔径时间从采样命令发出到开关完全断开的时间孔径抖动孔径时间的不确定性会导致采样时刻波动// 测量采样保持衰减的代码示例 void measureHoldDecay() { // 设置一个固定电压 float setVoltage 2.5; // 例如通过精密基准源 // 启动转换 digitalWrite(WR_PIN, LOW); delayMicroseconds(1); digitalWrite(WR_PIN, HIGH); // 延迟不同时间后读取 for(int i0; i100; i) { delayMicroseconds(10); // 每次增加10μs digitalWrite(RD_PIN, LOW); int val 0; for(int j0; j8; j) { val | (digitalRead(DATA_PINS[j]) j); } digitalWrite(RD_PIN, HIGH); float voltage val * (5.0 / 256.0); Serial.print(i*10); Serial.print(,); Serial.println(voltage, 4); // 4位小数精度 } }这个进阶实验可以测量ADC0804的保持衰减特性帮助我们理解实际器件与理想模型的差异。

更多文章