STM32F373 SDADC高精度采集解析

AI助手已提取文章相关产品:

STM32F373 SDADC 技术深度解析

在工业传感器、医疗设备和精密测量仪器的设计中,微伏级信号的稳定采集始终是一个令人头疼的挑战。传统的SAR ADC虽然响应快、成本低,但在面对热电偶几十μV/°C的输出或称重传感器毫伏级差分信号时,常常受限于噪声、非线性和温漂问题。这时,Σ-Δ架构的高精度ADC便成为破局的关键。

意法半导体(STMicroelectronics)推出的STM32F373系列MCU,正是为此类应用量身打造——它集成了三个独立的16位Σ-Δ ADC模块(SDADC),不仅具备出色的信噪比和分辨率,还内置可编程增益放大器(PGA)、数字滤波器和同步机制,使得开发者能在单一芯片上实现完整的高精度模拟前端解决方案。

这不仅仅是一次外设功能的叠加,更是一种系统级设计思维的转变:从“MCU + 外部ADC + 放大电路”的传统模式,转向“集成化、低噪声、软件可控”的新型架构。而SDADC正是这一演进的核心所在。


Σ-Δ ADC的工作原理与常见的逐次逼近型ADC完全不同。它不追求单次快速转换,而是通过 过采样 噪声整形 来换取极高的分辨率。简单来说,它的核心思想是“用速度换精度”。

以STM32F373中的SDADC为例,其内部采用的是一个一阶Σ-Δ调制器结构:

  1. 输入信号经过PGA放大后进入积分器;
  2. 积分器持续累积输入电压;
  3. 比较器将积分结果与参考电平比较,输出一位比特流(bitstream);
  4. 这个1位数据被反馈回模拟域,形成闭环控制;
  5. 最终输出是一个高速脉冲密度调制(PDM)信号,其中“1”的密度正比于输入电压大小。

举个直观的例子:如果输入接近正满量程,那么bitstream中“1”会非常密集;如果是零输入,则“1”和“0”大致各占一半;负信号则表现为“0”占主导。这种看似粗糙的1位输出,其实包含了完整的模拟信息。

但真正的魔法发生在后续的 数字滤波与抽取 阶段。STM32F373的SDADC采用了两级滤波结构:

第一级是 Sinc³滤波器 ,本质上是一个三阶CIC(级联积分梳状)滤波器。它无需乘法运算,资源开销小,非常适合嵌入式实现。更重要的是,Sinc³滤波器具有天然的陷波特性能——当降采样率设置得当时,其频率响应会在50Hz或60Hz处形成深谷,恰好可以抑制工频干扰,这对工业现场的应用极为关键。

第二级是 FIR补偿滤波器 ,用于修正Sinc³滤波器在通带内的幅频响应衰减。原始Sinc³滤波会导致低频段增益下降,影响动态范围。通过加载一组预计算的FIR系数,可以在数字域重新拉平响应曲线,提升整体SNR和ENOB(有效位数)。用户甚至可以根据实际需求自定义这些系数,实现个性化的滤波特性。

最终,经过这两级处理的数据会被降采样为16位定点值,并可通过DMA自动传输至内存,完全解放CPU负担。


这种架构带来的优势是显而易见的。我们来看一组典型参数:

  • 分辨率 :最高可达16位,ENOB实测可达15.5位
  • 输入类型 :全差分设计,支持±VINAx / ±VINBx输入对
  • PGA增益 :1×、2×、4×、8×可选(部分型号支持更高)
  • 数据速率 :从10 SPS到80 kSPS灵活调节
  • 信噪比 :>90 dB @ 20 SPS,足以分辨几微伏的变化
  • INL/DNL :±4 LSB / ±1.5 LSB,线性度表现优异
  • 同步能力 :多个SDADC可由定时器统一触发,实现时间对齐采样

这些指标意味着什么?想象一个电子秤应用:桥式应变片输出仅0~30 mV的差分信号,在室温下可能每变化1°C就产生数百微伏的漂移。如果没有足够高的分辨率和良好的共模抑制能力,根本无法做到克级甚至毫克级的稳定读数。

而STM32F373的SDADC正好提供了这样的能力。其差分输入结构本身就具备优秀的CMRR(共模抑制比),能有效过滤掉长导线引入的电磁干扰;内部PGA可以直接将微弱信号放大至接近满量程,最大化利用ADC的动态范围;再加上Sinc滤波器对50/60 Hz的精准抑制,整个系统无需复杂的外部滤波电路就能获得干净稳定的输出。

更进一步,你可以用第二个SDADC连接一个PT100温度传感器,实时监测环境温度,并在软件中进行零点漂移补偿。两个ADC之间可以通过定时器同步启动,确保采集的时间一致性。这一切都发生在同一颗MCU内部,无需额外的DSP或FPGA。


下面是一个典型的初始化代码片段,展示了如何配置SDADC进行连续采集:

#include "stm32f3xx_hal.h"

SDADC_HandleTypeDef hsdadc1;
DMA_HandleTypeDef hdma_sdadc1;

void MX_SDADC1_Init(void)
{
    hsdadc1.Instance = SDADC1;
    hsdadc1.CommonConfig.CommonMode = SDADC_COMMON_MODE_INDEPENDENT;
    hsdadc1.CommonConfig.ClockAbsenceDetection = SDADC_CLOCK_ABSENCE_DISABLE;

    if (HAL_SDADC_Init(&hsdadc1) != HAL_OK) {
        Error_Handler();
    }

    SDADC_ChannelConfTypeDef sConfig = {0};
    sConfig.InputMode = SDADC_INPUT_MODE_DIFF_P_SE_N;     // 正端差分,负端单端
    sConfig.Gain = SDADC_GAIN_4;                          // 增益4倍
    sConfig.Offset = 0;
    sConfig.SincOrder = SDADC_SINC3_ORDER;                // Sinc³滤波
    sConfig.DecimationRate = 128;                         // 降采样率=128 → ~20 SPS
    sConfig.ConversionMode = SDADC_CONVERSION_CONTINUOUS;

    if (HAL_SDADC_ConfigChannel(&hsdadc1, &sConfig, SDADC_CHANNEL_0) != HAL_OK) {
        Error_Handler();
    }

    uint32_t adc_buffer[16];
    HAL_SDADC_Start_DMA(&hsdadc1, SDADC_CHANNEL_0, (uint32_t*)adc_buffer, 16);
}

void HAL_SDADC_ConvCpltCallback(SDADC_HandleTypeDef* hsdadc)
{
    for (int i = 0; i < 16; i++) {
        int16_t raw = (int16_t)(adc_buffer[i] & 0xFFFF);
        float voltage = (float)raw * 0.000122;            // 假设Vref=2.5V → LSB=~122μV
        Process_Voltage(voltage);
    }
}

这段代码看似简洁,背后却隐藏着不少工程细节:

  • DecimationRate 设置为128时,配合默认时钟可得到约20 SPS的输出速率,适合静态测量;
  • 使用DMA而非轮询或中断方式读取数据,避免了高频中断带来的CPU负载;
  • 回调函数中提取的是低16位,因为高位可能包含状态标志;
  • 电压换算系数需根据实际基准源重新校准,不能直接套用理论值。

尤其值得注意的是, 初始几帧数据往往不稳定 ,建议在正式采集前丢弃前几个样本,或者启用“偏置校准”功能自动扣除零点误差。


回到实际应用场景。假设你要设计一款高精度电子秤,系统框图大致如下:

[称重传感器(桥式应变片)]
         ↓(mV级差分信号)
   → PA0/PA1 → SDADC1(PGA=64)
   → PB0/PB1 → SDADC2(用于温度补偿)
         ↓
[STM32F373 MCU]
   ├── ARM Cortex-M4 Core
   ├── 数字滤波 & 数据处理
   ├── 温度补偿算法
   └── UART/I²C → 显示屏或主机

工作流程也很清晰:

  1. 传感器输出接入SDADC1的差分引脚;
  2. 启用PGA=64,将0~30 mV信号放大至0~1.92 V;
  3. SDADC以20 SPS速率持续采样,Sinc³滤波器自动抑制50Hz工频干扰;
  4. 主程序执行滑动平均滤波,去除随机噪声;
  5. 另一路SDADC监控温度,结合查表法或多项式拟合进行零点补偿;
  6. 最终重量结果显示在LCD上。

整个过程中,你几乎不需要外接任何精密运放或仪表放大器,也不需要独立的ADC芯片。所有的信号调理、滤波、补偿都可以在片内完成。这不仅降低了BOM成本,也减少了故障点和PCB面积。

当然,要想发挥出SDADC的最佳性能,硬件设计也不能马虎:

  • 电源隔离 :务必使用独立的模拟供电引脚(VDDA),并配合π型滤波(LC或RC);
  • 地平面分割 :模拟地与数字地应单点连接,通常在靠近VSSA处汇合;
  • 走线规范 :差分对要等长、紧耦合,远离高频数字信号线;
  • 输入保护 :可在输入端加TVS二极管防静电,RC低通滤波防射频干扰;
  • 基准选择 :内部2.5V基准温漂约为±30 ppm/°C,若要求更高稳定性,可外接REF3125等精密基准。

还有一个容易被忽视的点: 滤波器响应时间 。由于Sinc³滤波器属于FIR类型,其群延迟与降采样率成正比。例如在10 SPS模式下,一次完整响应可能需要上百毫秒。因此,在需要快速响应的应用中(如电池电压突变检测),应适当提高输出速率,哪怕牺牲一点分辨率。


可以说,STM32F373的SDADC并不是为了取代所有类型的ADC,而是精准地瞄准了一个特定领域: 低速、高精度、强干扰环境下的模拟信号采集 。在这个细分赛道上,它展现出了惊人的综合竞争力。

无论是压力变送器、RTD温度测量、医疗生物电信号前端,还是电池管理系统中的电压监测,只要涉及微弱信号的长期稳定采集,SDADC都能提供一种“少即是多”的解决方案——用最少的外围元件,达成专业级的测量效果。

更重要的是,随着边缘智能的发展,越来越多的传感节点需要在本地完成信号预处理和特征提取。STM32F373配备的Cortex-M4内核带有浮点单元(FPU),完全可以运行复杂的滤波算法(如卡尔曼滤波)、非线性校正或机器学习模型。这意味着,你不仅能“看得清”,还能“想得明”。

未来,这类高度集成的高精度MCU将在物联网感知层扮演越来越重要的角色。它们不再是简单的控制器,而是融合了模拟前端、数字处理和通信能力的“微型测量站”。而STM32F373的SDADC,正是这条技术路径上的一个重要里程碑。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

您可能感兴趣的与本文相关内容

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值