关于单片机内部ADC采样率,采样精度的理解与计算整理 - 实践

news/2025/10/20 20:41:47/文章来源:https://www.cnblogs.com/slgkaifa/p/19153601

关于单片机内部ADC采样率,采样精度的理解与计算整理 - 实践

一、采样精度:由 “分辨率” 决定,代表 “能区分的最小电压变化”

采样精度本质是 ADC 对输入电压的 “细分能力”,由代码中的ADC_Resolution_12b(12 位分辨率)决定:

  • 12 位分辨率意味着:ADC 会把输入的 “满量程电压”(通常是参考电压,如 3.3V)分成 2^12 = 4096 等份。
  • 最小可区分电压(精度)= 参考电压 ÷ 4096。例如:若参考电压是 3.3V,精度就是 3.3V ÷ 4096 ≈ 0.805mV,即输入电压变化≥0.805mV 时,ADC 才能识别出差异。

分辨率越高(如 16 位),精度越高,但转换速度会变慢(需要更多时间处理)。你的代码用 12 位,是精度和速度的常见折中。

二、采样频率(采样率):单位时间内完成的采样次数,由 “时钟 + 采样时间 + 通道数” 共同决定

采样频率(单位 Hz)= 1 秒内 ADC 能完成的 “有效采样次数”,直接影响 “能否捕捉高速变化的信号”(如快速变化的电压)。结合你的代码配置,计算过程如下:

1. 先确定 ADC 的工作时钟

代码中 ADC_Prescaler_Div8 表示 ADC 时钟由 APB2 总线时钟分频得到(STM32 中 ADC 挂载在 APB2):

  • 假设 APB2 总线时钟为 84MHz(STM32F4 系列典型值),则 ADC 时钟 = 84MHz ÷ 8 =10.5MHz(即 ADC 的基础工作频率)。
2. 计算单个通道的 “采样 + 转换时间”

ADC 每次采样分两步:

  • 采样时间:代码中 ADC_SampleTime_480Cycles 表示 “每个通道的采样时间” 为 480 个 ADC 时钟周期(采样时需要保持输入电压稳定,时间越长,抗干扰越好,但速度越慢)。
  • 转换时间:12 位分辨率的 ADC,固定需要 12 个 ADC 时钟周期(将采样的模拟量转换为数字量)。

因此,单个通道的总时间= 采样时间 + 转换时间 = 480 + 12 = 492 个 ADC 时钟周期。

3. 计算多通道扫描的总时间

你的代码配置了:

  • ADC_ScanConvMode = ENABLE(扫描模式,按顺序转换多个通道);
  • ADC_NbrOfConversion = 2(需要转换 2 个通道:PC0 对应 ADC_Channel_10,PC1 对应 ADC_Channel_11)。

因此,一次完整扫描(2 个通道)的总时间= 2 × 单个通道总时间 = 2 × 492 = 984 个 ADC 时钟周期。

4. 最终采样频率(分两种情况)

采样频率 = 1 秒 ÷ 一次扫描的总时间(单位:秒)。ADC 时钟周期 = 1 ÷ 10.5MHz ≈ 95.24ns(即每个时钟周期的时间)。一次扫描的总时间 = 984 × 95.24ns ≈ 93.7μs(微秒)。

  • 若开启连续转换(ContinuousConvMode=ENABLE:转换完 2 个通道后会立即开始下一次转换,此时总采样频率= 1 ÷ 93.7μs ≈10.67kHz(即每秒完毕约 10.67 次 “2 通道扫描”)。每个通道的采样频率也是 10.67kHz(因为两个通道同时被扫描)。

  • 你的代码是单次转换(ContinuousConvMode=DISABLE:每次应该手动触发(如软件触发)才会转换一次,此时采样频率由 “触发频率” 决定(例如每秒触发 1000 次,采样频率就是 1kHz)。

总结

  • 采样精度:12 位分辨率,对应约 0.805mV(3.3V 参考下),即能区分的最小电压变化。
  • 采样频率:由 ADC 时钟、采样时间、通道数决定。你的配置下,连续模式最大约 10.67kHz(2 通道同时采样),单次模式取决于触发频率。

容易说:精度是 “测得多准”,频率是 “测得有多快”。

void ADC1_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);//1、GPIO初始化,PC0、PC1模拟模式GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AN;//模拟GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_0|GPIO_Pin_1;GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_NOPULL;GPIO_Init(GPIOC,&GPIO_InitStruct);//2、ADC公共初始化ADC_CommonInitTypeDef ADC_CommonInitStruct;ADC_CommonInitStruct.ADC_DMAAccessMode      = ADC_DMAAccessMode_Disabled;//DMA访问模式不使用ADC_CommonInitStruct.ADC_Mode               = ADC_Mode_Independent;//单重模式用单个ADC,ADC_CommonInitStruct.ADC_Prescaler          = ADC_Prescaler_Div8;//分频ADC_CommonInitStruct.ADC_TwoSamplingDelay   = ADC_TwoSamplingDelay_20Cycles;//两次采样时间间隔-针对多个ADCADC_CommonInit(&ADC_CommonInitStruct);//3、ADC初始化ADC_InitTypeDef ADC_InitStruct;ADC_InitStruct.ADC_ContinuousConvMode					=DISABLE;//单次采样or连续采样,触发一次,转换一次。ADC_InitStruct.ADC_DataAlign							=ADC_DataAlign_Right;//一般右对齐ADC_InitStruct.ADC_ExternalTrigConvEdge					=ADC_ExternalTrigConvEdge_None;//框图与门不打开-软件触发ADC_InitStruct.ADC_ExternalTrigConv                     = ADC_ExternalTrigConv_T1_CC1;//ADC_InitStruct.ADC_NbrOfConversion						=2;//转换的通道数ADC_InitStruct.ADC_Resolution							=ADC_Resolution_12b;//分辨率ADC_InitStruct.ADC_ScanConvMode							=ENABLE;//通道(使用扫描模式),序列转换ADC_Init(ADC1,&ADC_InitStruct);//4、规则通道配置ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_480Cycles);ADC_RegularChannelConfig(ADC1,ADC_Channel_11,2,ADC_SampleTime_480Cycles);//5、使能EOC置位ADC_EOCOnEachRegularChannelCmd(ADC1,ENABLE);//每次转换结束,EOC都置1//6、ADC使能ADC_Cmd(ADC1,ENABLE);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/941578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

整体架构与数据流

下面给出对题目及当前代码求解方法的系统、深入解析,涵盖三问建模逻辑、数据流、关键算法、假设与局限、以及改进建议。内容按“题目需求 -> 代码实现 -> 差异/假设 -> 评估/改进”结构展开,方便你写论文或…

【上青了】

【上青了】赶紧把面板记录一下先,怕下次又又又掉了 没什么好讲的,本来上场打完就差 11 分,这场只要正常发挥就没问题变色,所以也没什么激动,该激动的上次都激动完了,哎哎哎 要说就是这次状态还行,不算差,前面 …

[VIM] reverse multiple lines in VIM

推荐方法: If you’re on a Unix-like system (FreeBSD, Linux, macOS), use :14,19!tac.来自chatgptTo reverse the display order of lines 51 to 54 in Vim, you can use the :g and :tac-style command combinati…

DeviceNet 转 Ethernet/IP:三菱 Q 系列 PLC 与欧姆龙 CJ2M PLC 在食品饮料袋装生产线包装材料余量预警的通讯配置案例

案例背景 DeviceNet 转 Ethernet/IP在食品饮料行业,包装生产线涉及多种设备,如灌装机、贴标机、封口机等。不同设备可能采用不同的工业总线协议,为了实现整个包装生产线的自动化控制和数据共享,需要将采用 Etherne…

【大模型】【扫盲】几种不同的微调方法

四种微调方式Full 对预训练模型的所有参数进行微调,让模型从底层到顶层的所有参数都参与更新,彻底适配下游任务 优点:模型对任务的适配性最强,在数据充足、任务复杂时效果通常最优 缺点:资源消耗极大(千亿参数模…

Tuack 生成比赛题目 PDF 笔记

Part 1. Tuack 的基本介绍 Tuack,是一个由来自 THU 的大佬 Mulab11 开发的,用于造算法竞赛题目的工具。 你可以用它:导出 PDF、Markdown、HTML 等多种不同格式,NOI、CPC 等不同风格的题面。 简单的出题人自评测功能…

在 wrapper 类里实现重载方法

现有包装类 Wrapper 欲覆盖 inner 的方法 g class A{void f(){g();}void g(){} }class Wrapper extends A{A inner;void f(){inner.f() // 不调用 Wrapper.g}void g(){ // override g} }inner 通过 this.g 调用时仍然会…

Vue 项目 AI 文档增量更新工具操作手册

一、工具目标 通过 AI 自动生成 Vue 组件 / JS 工具的工程化解释文档,并支持增量更新(仅处理新增 / 修改的文件),避免重复劳动,提升团队文档效率。 二、环境准备前置条件 已初始化的 Vue 项目(Vue 2 或 Vue 3 均…

P7521 [省选联考 2021 B 卷] 取模 分析

题目概述 给你 \(n\) 个数 \(a_i\)。 求:\(\max_{i\ne j\ne k}(a_i+a_j)\bmod a_k\)。 分析 好题! 我一开始看到是无从下手的。 但是细想一下,关键点在于 \(a_k\),所以的说,枚举 \(a_k\) 是必不可少的。 然后我们…

4060显卡也能玩转AI改图!Flux.1 Kontext Dev GGUF版本超详细入门教程 - 实践

4060显卡也能玩转AI改图!Flux.1 Kontext Dev GGUF版本超详细入门教程 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fam…

提升生产力:8个.NET开源且功能强大的快速开发框架

提升生产力:8个.NET开源且功能强大的快速开发框架今天大姚给大家分享8个.NET开源、免费、功能强大的快速开发框架。助你提高开发生产效率、避免996!!! Vue.NetCore 一款基于Vue(提供Vue2/Vue3版本)和.Net Core前…

Mac版PDF Squeezer v4.5.1安装教程(DMG文件下载+详细步骤)​

Mac版PDF Squeezer v4.5.1安装教程(DMG文件下载+详细步骤)​​PDF Squeezer​ 是一款 ​Mac 专用​ 的 PDF 压缩工具,可以 ​快速减小 PDF 文件大小,同时尽量保持文件清晰度,适合 ​邮件发送、云端存储或节省空间…

使用c++14标准实现函数注册包装

调用方式bool res = FunctionRegistry::callFromFuncMap1<bool, type1&, type2*, type3,... >(...),其中第一个bool为返回值类型,第二个开始后面均为参数列表类型,可用于注册算子,包装函数指针等。 #inc…

【VSCode中Java创建环境安装的三个层级之Maven篇】(Windows版)

【VSCode中Java创建环境安装的三个层级之Maven篇】(Windows版)2025-10-20 20:15 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !imp…

黑马程序员Java基础笔记

目录类执行顺序继承方法重写构造器多态抽象类接口枚举类字符串内部类匿名内部类拆箱与装箱克隆浅克隆:深克隆:正则表达式Lambda方法引用静态方法引用实例方法引用特定类型方法引用构造器引用泛型通配符集合Collectio…

实用指南:linux磁盘空间爆满排查与清理

实用指南:linux磁盘空间爆满排查与清理pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

实用指南:socketpair深度解析:Linux中的“对讲机“创建器

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

详细介绍:从零开始的C++学习生活 2:类和对象(上)

详细介绍:从零开始的C++学习生活 2:类和对象(上)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas",…

【aigc】chrome-devtools-mcp怎么玩? - 指南

【aigc】chrome-devtools-mcp怎么玩? - 指南2025-10-20 20:02 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: b…