ADC模数转换器和DAC数模转换器基础
A/D(Analog → Digital)
三步曲:采样 → 量化 → 编码
| 步骤 | 作用 | 关键公式/概念 |
|---|---|---|
| 采样 | 把时间连续的信号变成离散点 | 采样定理:fs ≥ 2 fmax |
| 量化 | 把连续幅度切成最小台阶 Δ | Δ = Vref / 2ⁿ |
| 编码 | 台阶编号写成 n 位二进制 | 输出数字码 |
转换公式(理想线性 ADC):
Digital Output = (Vin / Vref) * (2^N - 1)
Vin:输入模拟电压
Vref:参考电压(ADC 的基准)
N:ADC 的分辨率(位数,如 12 位)
2^N - 1:最大数字值(如 12 位 ADC 最大值为 4095)
例子:
输入: 0–3.3 V,12 位 ADC → Δ = 3.3 V / 4096 ≈ 0.8mv
采样值 1.65 V → 落在第 2048 级 → 输出 0x0800
D/A(Digital → Analog)
逆向三步:解码 → 保持 → 平滑
| 步骤 | 作用 | 常用电路 |
|---|---|---|
| 解码 | 把数字码变成开关量 | R-2R 电阻网络或电流舵 |
| 保持 | 零阶保持器(ZOH) | DAC 输出阶梯波 |
| 平滑 | 滤除镜像频率 | 低通 RC/LC 滤波 → 平滑曲线 |
模拟信号 ——→[S/H]——→[ADC]——→ 数字码 ——→[DAC]——→[LPF]—— 重建模拟。
总结:ADC 把曲线‘切片’成编号;DAC 把编号‘叠片’成曲线,滤波后还原。
关键指标对照
| 指标 | A/D | D/A |
|---|---|---|
| 分辨率 | n 位 | n 位 |
| 转换速率 | 采样率 SPS | 更新率 MSPS |
| 误差源 | 量化噪声、采样抖动 | 建立时间、毛刺、线性误差 |
| 常见结构 | SAR、Δ-Σ、Flash | R-2R、电流舵、Δ-Σ |
STM32 ADC 关键特性
- 分辨率:
表示 ADC 能区分的最小电压变化量。
常见:12 位(最常用,值范围 0-4095)。部分型号支持 10 位、8 位或 6 位(通过配置降低分辨率可提高速度)。
最小可分辨电压 (LSB - Least Significant Bit): Vref / (2^N - 1)。例如,Vref=3.3V,12 位 ADC,LSB ≈ 0.8mV。
2.参考电压 (Vref+, Vref-):
最关键参数之一! 决定了 ADC 的输入范围和精度。
Vref+:通常连接到稳定的电源(如专用 VREF 引脚接 3.3V 或 2.5V 基准源)或内部基准(精度较差)。
Vref-:通常接地 (GND)。
输入电压范围: Vin 必须在 Vref- 到 Vref+ 之间。超出范围可能损坏 ADC 或得到错误值(饱和在 0 或 4095)。
- 通道:
STM32 有多个 ADC 模块(如 ADC1, ADC2, ADC3)。
每个 ADC 有多个模拟输入通道(如 16, 19 个等,具体看型号)。
通道可以连接:
~~~~~~ 外部引脚: (GPIO 配置为模拟输入 GPIO_Mode_AIN) 用于测量外部传感器电压。
~~~~~~ 内部信号源: 如内部温度传感器、内部参考电压 (VREFINT)、电池电压 (VBAT)。
- 转换时间:
完成一次 ADC 转换所需的时间。
公式: Tconv = Sampling Time + Conversion Time。
采样时间 (TSAMPLE): ADC 内部电容对输入电压进行充电以达到稳定状态的时间。可软件配置(标准库中 ADC_SampleTime 参数),时间越长,抗噪声能力越强,但转换越慢。
转换时间 (TCONV): 固定时间,取决于分辨率(位数)。例如,12 位转换需要 12 个 ADC 时钟周期。
总转换速率: Fadc_clock / (Sampling_Cycles + Conversion_Cycles)。ADC 时钟频率 (Fadc_clock) 由系统时钟分频得到(需配置 RCC).
- 触发源:
什么事件启动一次 ADC 转换?
软件触发: 程序主动调用函数(如 ADC_SoftwareStartConvCmd())启动转换。简单,但实时性差。
硬件触发: 由其他外设(如 TIM 定时器、EXTI)的信号自动启动转换。关键用于周期性采样或同步操作!
例如:用 TIM 定时器每 1ms 触发 ADC 采样一次,实现精确时间间隔的数据采集。
- 转换模式:
单次转换: 触发一次,只转换一个指定通道,然后停止。适合单次读取。
连续转换: 启动后,ADC 会自动连续不断地转换同一个通道(无需重复触发)。适合监控一个快速变化的信号。
扫描模式:用于转换多个通道。配置一个通道序列(如 Ch0, Ch1, Ch3, Ch8)。触发一次(单次扫描)或持续触发(连续扫描),ADC 会按顺序自动转换序列中的所有通道。
DMA 搭档: 扫描模式强烈建议配合 DMA 使用!DMA 能自动将每个通道的转换结果搬运到内存数组,避免 CPU 频繁中断读取,提高效率.
- 数据对齐:
转换结果是 12 位的数字,但存储在 16 位的寄存器中。
右对齐: 结果放在寄存器的低 12 位(0x0FFF),高 4 位为 0。最常用,直接读取就是 0-4095。
左对齐: 结果放在寄存器的高 12 位(0xFFF0)。读取后需要右移 4 位才能得到 0-4095,有时用于快速处理(舍弃低精度位)。
- 校准:
出厂后,ADC 可能存在微小的增益和偏移误差。
STM32 ADC 提供内部自校准功能。
重要步骤! 上电后、开始使用 ADC 前,务必执行一次校准(调用 ADC_Calibration() 相关函数)。
校准值存储在 ADC 内部,后续转换会自动补偿.
- 注入通道 vs 规则通道:
规则通道: 常规转换通道,用于主任务。最多 16 个通道组成一个序列(扫描模式)。
注入通道: 类似“插队”通道。用于高优先级、突发的转换任务(如过压保护)。
最多 4 个注入通道。
当注入通道被触发时,会中断当前正在进行的规则通道转换,优先执行注入通道转换,完成后恢复规则通道转换。且有自己的独立数据寄存。
配置流程:
时钟/GPIO -> ADC 参数初始化 -> 通道配置 -> 校准 -> (DMA) -> 使能 -> 启动 -> 获取结果
典型应用场景
传感器读取: 温度(热敏电阻、热电偶、DS18B20 模拟输出)、光照(光敏电阻)、压力、湿度、气体浓度等模拟输出传感器。
电池电压监测: 通过电阻分压测量电池电压 (VBAT 或外部电路)。
音频采集: (需高采样率 ADC 和 DMA)。
电位器/旋钮位置检测。
电源监控: 测量系统内部或外部电源电压
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)