共计 2251 个字符,预计需要花费 6 分钟才能阅读完成。
在嵌入式系统开发中,信号采集的精度至关重要。特别是使用模数转换器(ADC)时,量化噪声是一个不可忽视的问题。今天我们就来详细聊聊 ADC 量化噪声的计算公式,以及如何在嵌入式系统中应用这些知识来提升信号采集的质量。

背景痛点
ADC 量化噪声是数字信号处理中不可避免的噪声源,它会对精密测量电路产生显著影响。比如在温度传感器、压力传感器等应用中,量化噪声可能导致数据漂移,影响系统整体精度。
常见的误区包括:
- 忽视有效位数(ENOB)的影响,认为 ADC 标称位数就是实际可用位数
- 低估量化噪声对系统信噪比(SNR)的贡献
- 未考虑参考电压稳定性对量化噪声的影响
公式解析
量化噪声的 RMS 值计算公式为:
$$ RMS = \frac{Q}{\sqrt{12}} $$
其中 Q 表示最低有效位(LSB)对应的电压值,计算公式为:
$$ Q = \frac{V_{ref}}{2^N} $$
这里,$V_{ref}$ 是 ADC 的参考电压,N 是 ADC 的分辨率位数。
推导过程:
- 假设输入信号在量化间隔内均匀分布
- 量化误差的范围是±Q/2
- 计算误差的方差得到 RMS 值
代码实现
下面是一个符合 MISRA- C 规范的 C 语言实现示例,包含动态参考电压校准和噪声峰峰值计算:
/**
* @brief 计算 ADC 量化噪声的 RMS 值
* @param vref 参考电压 (mV)
* @param bits ADC 分辨率位数
* @return 量化噪声 RMS 值 (mV)
*/
float calculate_quantization_noise_rms(float vref, uint8_t bits)
{const float q = vref / (float)(1UL << bits);
return q / sqrtf(12.0f);
}
/**
* @brief 计算 ADC 量化噪声的峰峰值
* @param vref 参考电压 (mV)
* @param bits ADC 分辨率位数
* @return 量化噪声峰峰值 (mV)
*/
float calculate_quantization_noise_pp(float vref, uint8_t bits)
{const float q = vref / (float)(1UL << bits);
return q; // 峰峰值≈1LSB
}
硬件考量
PCB 布局对 ADC 性能有重大影响。以下是几个关键点:
- 电源去耦 :在 ADC 电源引脚附近放置 0.1μF 和 1μF 电容组合
- 地平面分割 :保持模拟地和数字地分离,单点连接
- 信号走线 :缩短模拟信号走线,避免与数字信号平行走线
示意图:
+-------------+ +-------------+
| 模拟部分 |-------| ADC 芯片 |
+-------------+ +-------------+
|| ||
====||==================||==== 模拟地
|| ||
+-------------+ +-------------+
| 数字部分 |-------| MCU/ 逻辑 |
+-------------+ +-------------+
避坑指南
以下是三个常见错误及解决方案:
- 未做多次采样平均
- 问题:单次采样结果受噪声影响大
-
解决:实现 16-64 次采样平均算法
-
忽略 ADC 输入阻抗匹配
- 问题:信号源阻抗过高导致采样误差
-
解决:添加缓冲放大器或降低采样速率
-
参考电压不稳定
- 问题:Vref 波动直接影响量化精度
- 解决:使用精密基准电压源,加强电源滤波
验证方法
使用示波器 FFT 功能实测噪声频谱的步骤:
- 将 ADC 输出接入示波器
- 设置示波器为高分辨率采集模式
- 打开 FFT 功能,设置合适的频率范围
- 观察基底噪声水平,确认是否与理论计算一致
动手实验
下面提供一个 STM32H7 的 ADC 配置示例,供读者实测不同采样率下的噪声变化:
void ADC_Config(void)
{
ADC_HandleTypeDef hadc1;
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
hadc1.Init.Resolution = ADC_RESOLUTION_16B;
hadc1.Init.ScanConvMode = DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc1.Init.LowPowerAutoWait = DISABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR;
hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
hadc1.Init.OversamplingMode = DISABLE;
HAL_ADC_Init(&hadc1);
}
实验建议:
- 固定输入电压(如使用基准电压源)
- 分别测试 125ksps、1Msps、5Msps 采样率
- 记录输出数据的标准差,比较理论值与实测值
通过本文的介绍,相信大家对 ADC 量化噪声有了更深入的理解。在实际项目中,合理应用这些知识可以有效提升信号采集系统的性能。
正文完
