news 2026/5/7 12:53:39

简单理解:为什么有些ADC采样要设置延时

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
简单理解:为什么有些ADC采样要设置延时

ADC 完整采样流程(从物理信号到数字输出,含量化 / 编码)

核心前置概念(先理清底层逻辑)

术语通俗解释
模拟信号传感器 / 引脚输入的连续电压(如 0~3.3V,可取值 1.234V、2.567V 等任意值)
采样硬件在某一时刻 “抓取” 模拟电压的瞬时值(相当于 “给电压拍快照”)
保持把抓取的瞬时电压暂存到电容中,供后续量化使用(避免电压波动影响)
量化把连续的模拟电压按固定 “步长” 划分,转换成离散的整数区间(如 1.234V→1527)
编码把量化后的整数区间,转换成二进制数字(如 1527→0101 1110 0111),是量化的最终硬件输出

你问的这个问题直击 ADC 采样的核心!ADC 采集时设置延时(比如Delay_ms(100)),不是 ADC 硬件本身需要延时才能完成采样,而是从 “工程实用性、系统资源、数据有效性” 三个维度的必要设计 —— 咱们结合你之前的软件触发 + 轮询采样场景,把原因拆得明明白白:

一、核心原因 1:控制采样频率,避免数据冗余

ADC 硬件的采样速度极快(比如 12 位 ADC 单次采样仅需几微秒到几十微秒),但实际应用中,我们根本不需要这么高频的采样:

  • 举个例子:你采集的是普通电压信号(如传感器输出),这个信号的变化频率通常是 “每秒几次到几十次”(比如环境温度变化、电池电压变化);
  • 若不设置延时,MCU 会以 “每秒几万次甚至几十万次” 的频率采样 —— 结果就是采集到大量重复、无意义的数据(比如同一电压值被采 1000 次);
  • 设置Delay_ms(100)后,采样频率被固定为10Hz(每秒 10 次),刚好匹配实际信号的变化速度,既保证数据有效,又不会产生冗余数据。
类比理解:

就像你给静止的水杯拍照,不需要每秒拍 1000 张(全是一样的),每秒拍 10 张就足够 —— 延时就是 “控制拍照的间隔”。

二、核心原因 2:降低 CPU 占用率,保障系统其他功能

你的 ADC 采样代码是while(1)无限循环,若没有延时:

while (1) { ADC_SoftwareStartConvCmd(adcx, ENABLE); // 启动采样(微秒级完成) while (!(adcx->SR & (1 << 1))); // 等待完成(微秒级) ConvertedData = adcx->DR; // 读数据(微秒级) printf("value:%x\r\n", ConvertedData); // 打印(微秒级) // 无延时 → 立刻回到循环开头,重复执行 }
  • MCU 主频通常是几十 MHz 到几百 MHz,上述循环全程仅需几十微秒就能完成一次,意味着每秒会循环几万次;
  • 后果:CPU 100% 被这个循环占用,无法处理其他任务(比如串口接收指令、按键响应、定时器中断、LED 闪烁等),整个系统会 “卡死” 在采样上;
  • 设置Delay_ms(100)后,CPU 在这 100ms 内无需执行采样逻辑,可空闲出来处理其他事务,系统整体响应性大幅提升。

三、核心原因 3:避免外设(如串口)过载

你采样后会通过printf打印数据到串口,串口的传输速度是固定的(比如波特率 9600,每秒仅能传输约 960 个字符):

  • 若不延时,采样频率极高,printf会被频繁调用,串口缓冲区会瞬间被填满,导致数据丢失、打印乱码;
  • 延时 100ms 后,打印频率降到 10Hz,串口有足够时间传输数据,不会出现过载问题。

四、补充:这些场景下 “延时不是必须的”

不是所有 ADC 采样都要加延时,只有 “轮询 + 简单场景” 需要,以下场景可去掉或替换:

  1. 中断触发采样:配置 ADC 采样完成中断,采样完成后触发中断、读取数据,主循环无需轮询,自然不用延时;
  2. 操作系统(RTOS)场景:用 “任务延时”(如vTaskDelay(100))替代Delay_ms(100),任务会被挂起,CPU 可执行其他任务,延时更高效;
  3. 高速数据采集:比如采集音频、高频信号,需要高采样率(如 1kHz 以上),可减小延时(如Delay_ms(1)),但仍需控制频率避免系统过载。

五、和 ADC 硬件本身的区别(关键澄清)

⚠️ 重要:Delay_ms(100)是 “采样间隔延时”,不是 “等待 ADC 完成采样的延时”—— 你代码中while (!(adcx->SR & (1 << 1)))才是等待 ADC 硬件完成采样的逻辑(微秒级),这和 “100ms 间隔延时” 是两回事:

  • 等待采样完成:必须有,否则会读到无效数据;
  • 采样间隔延时:工程设计需要,控制频率、降负载。

总结

ADC 采集设置延时的核心目的是:

  1. 控频率:匹配实际信号变化速度,避免冗余数据;
  2. 降负载:释放 CPU 资源,保障系统其他功能运行;
  3. 保外设:避免串口等外设因高频操作过载。

简单说:延时不是 ADC 硬件的 “刚需”,而是让采样功能 “融入整个系统” 的工程设计 —— 没有延时,采样功能能跑,但整个系统会出问题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 6:05:31

git push代码前验证:在PyTorch-CUDA-v2.7中进行一致性测试

git push代码前验证&#xff1a;在PyTorch-CUDA-v2.7中进行一致性测试为什么你的本地训练“能跑”&#xff0c;到了服务器却失败&#xff1f; 你有没有遇到过这样的场景&#xff1a;在自己的笔记本上调试好模型&#xff0c;信心满满地 git push 提交代码&#xff0c;结果 CI 流…

作者头像 李华
网站建设 2026/5/3 10:01:07

Markdown笔记整合代码:在PyTorch-CUDA-v2.7中导出Jupyter成果

在PyTorch-CUDA-v2.7中高效整合Jupyter笔记与代码&#xff1a;从实验到成果导出的完整实践 你有没有经历过这样的场景&#xff1f;模型训练终于跑通了&#xff0c;准确率也上去了&#xff0c;但当你想把整个过程整理成报告时&#xff0c;却发现代码散落在多个脚本里&#xff0c…

作者头像 李华
网站建设 2026/5/1 9:48:13

计算机毕业设计springboot游泳馆管理系统 基于 SpringBoot 的泳池综合运营平台 智慧泳馆一体化服务系统

计算机毕业设计springboot游泳馆管理系统6f19233b &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。在“互联网体育”的大趋势下&#xff0c;传统游泳馆的手工登记、纸质票务、Exc…

作者头像 李华
网站建设 2026/4/23 16:16:22

大模型微调技术介绍篇

大模型必须要微调&#xff08;Fine-tuning&#xff09;&#xff0c;例如一个预训练好的大模型就像一个刚从医学院以优异成绩毕业的全科医生&#xff08;通才&#xff09;&#xff0c;他掌握了非常广泛和深厚的医学知识&#xff08;语法、事实、推理能力等&#xff09;。 但是&a…

作者头像 李华
网站建设 2026/4/30 17:11:23

计算机毕业设计springboot七彩花都线上鲜花订购平台 SpringBoot花语心愿在线订花商城 SpringBoot云端花坊鲜花零售平台

计算机毕业设计springboot七彩花都线上鲜花订购平台rzb8b4z2 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。在“互联网花卉”浪潮推动下&#xff0c;传统花店急需一条低成本、高…

作者头像 李华
网站建设 2026/5/1 10:04:53

辽宁对外经贸学院毕业论文开题报告

辽宁对外经贸学院毕业论文开题报告姓 名学 号学 院管理学院专 业信息管理与信息系统年级班级2021级XX班学校指导教师企业指导教师论文题目东升白酒销售管理系统分析与设计选题依据与意义1、选题的学术价值、应用价值&#xff08;1&#xff09;学术价值东升白酒销售…

作者头像 李华