揭秘STM32F373内置SDADC:高精度测量的硬件设计与代码实操
简介面向STM32F373嵌入式开发者的SDADC工程资源包适合正在学习或评估16位高精度模拟采集、双通道同步采样及多通道数据转换的工程师。资源围绕STM32F373的SDADC模块展开包含应用层驱动与ST标准外设库源码可帮助读者梳理启动转换、采样保持、逐次逼近、结果读取的完整流程并在此基础上进行传感器读取、数据采集等二次开发。压缩包共159个文件以.c源文件、.h头文件为主同时包含.o目标文件、.d依赖文件、Keil工程配置uvproj/uvopt、编译链接脚本及生成的hex/axf固件整体体积约3.16MB便于直接打开工程查看或烧录验证。已有1860人学习下载。借助工程内SDADC相关代码与配置开发者可快速掌握自动校准、噪声抑制、多级采样时间等特性的使用方式为工业控制、环境监测或医疗设备中的数据采集部分提供可复用参考。1. 为什么是STM32F373 SDADC一块被低估的高精度测量芯片做嵌入式这几年被问得最多的一个问题是“工控仪表里做高精度采样用啥方案最省心”以前我一般推荐外挂独立ADC芯片比如ADS1220这类性能不错但外围电路复杂还得写驱动。直到有一次做便携式医疗仪器被功耗和PCB面积逼到墙角才认真研究了STM32F373这颗带SDADC的芯片用完之后只有一个感受原来ST早在F3系列里就把高精度采集这条路给铺好了只是很多人没注意到。STM32F373最特别的地方是它内部集成了3个16位Sigma-Delta ADC也就是SDADCSigma-Delta Analog-to-Digital Converter。这颗芯片其他配置其实中规中矩Cortex-M4F内核、72MHz主频、16KB SRAM但加上SDADC之后整个定位就完全不一样了。它直接面向称重传感器、电流检测、温度采集、医疗监护、电能计量这类需要高分辨率、低噪声测量的场景最高16位有效分辨率多种增益可配连信号调理电路都能省掉一大截。SDADC和普通ADC最大的区别在于工作原理。普通逐次逼近型SARADC像是用一把尺子一次量到底速度快但刻度有限SDADC则是用量化器疯狂过采样再通过数字滤波器把噪声平均掉相当于用低精度量了成千上万次最后算出一个非常稳定的高精度结果。代价是转换时间变长采样率和分辨率之间存在直接权衡适合对速率要求不高、对精度要求极高的场合。STM32F373的SDADC在15Hz输出速率下可以实现接近16位的有效分辨率这个表现在同价位MCU里相当能打。如果你正在做传感器信号采集、小信号放大测量或者想用一颗芯片同时搞定控制和数据采集F373的SDADC值得认真研究一下。这篇内容我会从硬件设计、寄存器配置、实际踩坑三个维度把我在项目中用下来确认有效的经验完整还原出来尽量做到看完就能上手。1.1 核心需求解析F373定位在哪个环节先说清楚F373适合用在什么位置。它不是什么场景都能替换但在高精度低速采样这个细分区间里非常顺手。我那次做的是便携式血糖检测仪和体温监测模块前端传感器输出的是微弱电压信号幅度大概在正负几十毫伏到几百毫伏之间需要精确测量并实时计算。用传统方案传感器信号先进仪表放大器再进ADC还得配基准源、运放、滤波电路一整套下来光元件就十来个。换成F373之后SDADC自带可编程增益放大器PGA增益可以从1倍到32倍可调内部还有偏置校准寄存器很多的信号调理工作直接就在芯片内部完成了。这样不仅省掉了外置运放和精密电阻连模拟前端的设计工作量也大幅下降。另一个关键点是F373的SDADC支持差分输入模式。对于桥式传感器这类输出共模电压高、差模信号小的场景差分输入天然就能抑制共模干扰这一优势在实际环境的强干扰测试里非常明显。整机做EMC摸底的时候SDADC通道在电快速瞬变脉冲群干扰下的读数漂移远小于我之前用单端SAR方案的表现。所以如果你需要连续监测小信号做高精度直流测量或者系统里已有传感器桥路F373这套方案性价比很高。但如果说你要采样的是高频信号比如上百kHz的波形分析那SDADC反而发挥不出优势此时选SAR型ADC或者片内快速ADC更合适。1.2 SDADC与普通ADC方案的硬核对比很多人在选型时纠结一个问题芯片内部都带ADC了为什么还要再搞一个SDADC这里我把两者的差异彻底讲透。SAR ADC是逐次逼近型输入信号进来后内部电容阵列通过比较器逐位逼近转换速度快单次转换可以到每秒几百万次但分辨率一般做到12位到16位线性度受电容匹配限制想再提高就得用激光调校或者更复杂的架构成本自然水涨船高。SDADC走的是另一条路。它用一个非常粗粒度的量化器可能只有1位或几位配合高性能的数字滤波器对输入信号做极大倍数的过采样。比如内部调制器频率是2.4MHz你想得到15Hz的输出速率相当于每个输出点做了16万次以上的调制采样。这个过程的本质是用时间换精度把所有量化噪声通过噪声整形推到高频段再用数字滤波器滤掉。这两种方案做对比的话有三个最直观的差距。一是分辨率SAR常见12到16位SDADC轻松到16位起步有效分辨率表现更好。二是抗噪能力SAR对参考电压噪声、电源噪声的敏感度高ADC采到的瞬时值是点采样毛刺容易直接带进结果SDADC因为有过采样和数字滤波输出的其实是长时间窗口内的统计平均对随机噪声有天然抑制作用。三是外围复杂度SAR要达到高精度外部基准和驱动运放要求非常高SDADC虽然同样对基准有要求但由于内部增益和滤波的存在容错空间大不少。当然SDADC不是没有短板速率就是最大限制。输出速率从15Hz到3.4kHz可调这个范围和SAR动不动几百kHz的采样率完全不在一个量级。所以最佳做法是各取所长F373同时有SAR ADC和SDADC高速信号用SAR慢速高精度信号用SDADC互不干扰。我在实际项目里就是用SAR采样电池电压做保护逻辑用SDADC采集传感器数据做精确计量一颗芯片兼顾两种需求。2. 硬件设计要点把F373的高精度底子发挥出来芯片选型只是第一步SDADC的精度最终能发挥出多少硬件设计占了七成功劳。我第一次画F373板子时低估了模拟电源和参考电压对SDADC的影响结果读数噪声比手册标称值差了将近一个数量级后来一步步排查才发现问题出在电源纹波上。这里把关键设计点梳理一下对照检查能少走很多弯路。2.1 供电与参考电压高精度的根基所在SDADC内部虽然有抑制电源噪声的能力但这不代表可以随意供电。VDDA模拟电源建议配置为2.7V到3.6V之间并且必须和VDD分开走线各自靠近芯片引脚放置去耦电容。常规做法是在VDDA引脚附近放一个1μF和100nF的组合1μF负责低频储能100nF负责高频去耦。特别注意STM32F373的VDDA和VDD之间有内部连接如果模拟部分对精度要求高最好在外部用磁珠或者小电阻串接隔离进一步阻止数字开关噪声串入模拟域。VREF参考电压引脚更不能马虎。我上次踩坑就是VREF直接接的VDDA结果电源一波动采集值就跟着飘。后来换成了独立的参考源芯片比如REF3033这类低噪声、低压差的基准SDADC的稳定性立刻有了质的改善。手册给的建议是VREF在2.0V到VDDA之间要想获得超低噪声表现独立基准源基本是标配尤其是测量精度要求在万分之五以上的场合。SDADC的模拟输入引脚同样需要注意引脚复用配置。F373的SDADC输入通道分布在多个端口上但并非所有引脚都能承担高精度输入某些引脚靠近高频数字信号线耦合干扰会更严重。布局时模拟输入走线尽量短而粗避开MCU晶体引脚、PWM输出引脚、SPI/I2C通信线这些干扰源。如果PCB空间允许模拟输入走线的两侧铺地铜带形成类共面波导结构能非常有效降低环境干扰耦合。2.2 差分输入与增益配置的实践经验SDADC的输入配置支持单端和差分两种模式高精度应用强烈建议使用差分输入。以桥式传感器为例传感器输出的正负极分别接SDADC的正负输入引脚共模电压会同时出现在两个输入端做差分运算后被有效抵消实际上SDADC内部对共模抑制能力很好尤其在低频段。单端模式下信号线另一端接器内部参考点干扰抑制能力就差不少常用于输出本身是单端信号且环境相对干净的场合。增益选择也需要根据信号量程精打细算。SDADC的PGA增益有1、2、4、8、16、32几档最大差分输入范围是正负(VREF/增益)左右。理论上讲信号幅度越接近满量程量化误差占比越小测量精度越高。但实际使用要注意增益过高容易让PGA输出饱和尤其是传感器存在零点偏移时初始信号幅度可能已经接近PGA的允许极限。我通常的做法是先用示波器摸清传感器满量程输出范围混入零漂余量后再选择能让最大信号达到量程80%左右的增益档位。举个例子某压力传感器满量程输出约20mVVREF3.3V若选增益32满量程对应内部电压约0.64V只占了量程的大约19%这种情况下其实应该优先检查传感器偏移量而不是盲目增益。还有一点如果传感器输出范围特别大或者说共模电压偏高可以在输入端加简单的阻容滤波和偏置电阻网络做电平搬移和带宽限制保证信号落在SDADC允许的输入范围内。2.3 时钟与滤波被忽略的噪声来源SDADC内部调制器需要高频时钟F373的SDADC时钟来源可以来自系统时钟分频或者特定的时钟源正常配置时调制器频率在2.4MHz左右。不要想当然地认为内部时钟就万事大吉如果系统主频恰好有强干扰谐波落在SDADC带宽附近会在输出上表现为明显毛刺。我遇到过一种情况系统PWM频率是72kHz和SDADC某档位的滤波陷波点接近结果输出端出现规律性波动。后来直接把PWM频率偏移一点或者重新选择滤波器带宽问题就消失了。数字滤波器是SDADC核心优势之一F373支持Sinc3和快速Sinc滤波器。Sinc3滤波器稳定时间长但分辨率最高适用于低速高精度测量快速Sinc滤波器建立速度快适用于多通道扫描或者输出速率较高的场景。实际项目中如果只测量一路信号就用Sinc3加最高过采样率把精度榨干如果需要两路以上通道轮询则需要根据通道切换频率仔细评估滤波建立时间避免串扰。还有一处细节经常被忽略即使SDADC内部有滤波模拟输入前端也需要做RC低通滤波。因为调制器采样过程类似开关电容对外呈现的动态阻抗会受输入源阻抗影响。串接一个几十欧到几百欧的电阻再加10nF到100nF电容到地能有效隔离源阻抗稳定调制器输入端电压。注意电阻值不宜过大否则会和SDADC内部输入漏电流产生误差电压一般1kΩ以内比较安全。3. 代码层面实操F373 SDADC的初始化与数据读取如果不谈代码前面的硬件设计就只是纸上谈兵。F373的SDADC配置逻辑和普通ADC差异很大初始化流程分好几步不能简单调用一次Read函数就完事。我用标准外设库和HAL库都折腾过最终确认了一套稳定可靠的配置流程代码同样可以用在F378等同样带SDADC的型号上只需做少量寄存器名调整。3.1 一个能直接用的SDADC初始化配置这里先给出一段初始化代码基于STM32标准外设库主频72MHzSDADC1使用内部时钟连续转换模式差分输入PGA增益8倍Sinc3滤波器void SDADC_Init_Example(void) { SDADC_InitTypeDef sdadc_init; SDADC_FilterConfigTypeDef sdadc_filter; GPIO_InitTypeDef gpio_init; // 使能时钟SDADC、GPIOA、GPIOB RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDADC1, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB, ENABLE); // 配置SDADC输入引脚为模拟输入 GPIO_StructInit(gpio_init); gpio_init.GPIO_Mode GPIO_Mode_AN; gpio_init.GPIO_Pin GPIO_Pin_0 | GPIO_Pin_1; // 通道4/5差分输入 GPIO_Init(GPIOA, gpio_init); // SDADC基础配置 SDADC_StructInit(sdadc_init); sdadc_init.SDADC_InputMode SDADC_InputMode_Diff; sdadc_init.SDADC_Gain SDADC_Gain_8; sdadc_init.SDADC_CommonMode SDADC_CommonMode_VREF2; // 共模为VREF/2 sdadc_init.SDADC_ContinuousMode DISABLE; SDADC_Init(SDADC1, sdadc_init); // 配置数据输出速率和滤波器 SDADC_FilterConfigStructInit(sdadc_filter); sdadc_filter.SDADC_Filter SDADC_Filter_Sinc3; sdadc_filter.SDADC_FilterOversampling SDADC_FilterOversampling_64; SDADC_FilterConfig(SDADC1, sdadc_filter); // 配置注入通道 SDADC_InjectedChannelConfig(SDADC1, SDADC_Channel_4, SDADC_Channel_4, DISABLE); // 校准上电之后必须执行否则精度会大打折扣 SDADC_CalibrationInit(SDADC1); while(SDADC_GetFlagStatus(SDADC1, SDADC_FLAG_CALIBON) SET); while(SDADC_GetFlagStatus(SDADC1, SDADC_FLAG_CALIBOFF) SET); }这段代码有几个关键点需要解释。首先是SDADC_Channel_4F373的SDADC通道号与引脚对应关系比较绕同一组差分输入同时占用连续通道号比如A0/A1对应通道4/5A2/A3对应通道6/7。配置注入通道时传入的两个参数分别是通道号和通道选择位编码方式参考参考手册的寄存器描述我第一次配置时搞错了通道对应关系读出来的数据全在乱跳后来对着手册逐位核对才定位到问题。其次是校准流程。SDADC内部有偏移校准电路上电或者每次改增益之后都应该触发校准否则零点偏移会直接叠加到测量结果里。校准命令发出后需要等待CALIBON变高再变低然后CALIBOFF过程结束才算完成。实际测试中跳过校准环节测量零点会偏移大约几十个LSB对16位系统来说这个量级是致命的。3.2 启动转换和读取结果的标准姿势配置完成之后启动转换可以有两种方式软件触发或者定时器触发。高精度测量场景我推荐用定时器触发因为采样率由硬件严格保证不受主程序调度抖动影响这对后级数字滤波一致性非常关键。// 使能SDADC注入通道 SDADC_InjectedChannelCmd(SDADC1, ENABLE); // 软件触发启动注入转换 SDADC_SoftwareStartInjectedConv(SDADC1); // 等待转换完成 while(SDADC_GetFlagStatus(SDADC1, SDADC_FLAG_INJEOC) RESET); // 读取转换结果16位有符号数 int16_t raw SDADC_GetInjectedConversionValue(SDADC1, SDADC_Channel_4); // 转换成实际电压值V raw / 32768 * VREF / Gain float voltage (float)raw / 32768.0f * 3.3f / 8.0f;注意SDADC_GetInjectedConversionValue返回的数据类型是int16_t不是无符号数。因为差分输入模式下输出可以表示正负信号负数结果在寄存器里以二进制补码形式存在。换算成实际电压时用满量程2048个码值对应VREF/Gain所以除数是32768。这里很容易犯的错误是把有符号数强转成无符号类型再换算出来的电压会完全不对。还有一点SDADC结果寄存器中数据是左对齐还是右对齐可以通过配置寄存器调整。标准外设库的读取函数默认按右对齐方式处理如果自己操作寄存器需要确认SDADC_CONF1寄存器的DATFMT位。配置成右对齐、有符号格式与代码里的换算公式才能保持一致。3.3 多通道扫描需要特别关注的建立时间问题SDADC没法像普通ADC那样无缝切换通道因为每次切换后数字滤波器需要重新建立建立时间取决于滤波器阶数和过采样率。如果使用Sinc3滤波器、64倍过采样、输出速率约600Hz从通道切换到数据稳定至少需要4到5个输出周期也就是说切通道后要等几毫秒才能采到有效数据。很多人在多通道读取时踩坑切换通道立即读取第一帧数据全是错的后面几帧慢慢收敛到正常值。我做的方案是开启SDADC的定时器触发模式利用定时器周期做通道轮询每个通道在触发前先配置好通道号然后用软件标记跳过前几帧无效数据。示例流程如下// 伪代码定时器中断中轮询两路差分通道 static uint8_t scan_channel 0; static uint8_t settle_count 0; void TIM_IRQHandler(void) { if (scan_channel 0) { // 切换通道前先配置通道号 SDADC_InjectedChannelConfig(SDADC1, SDADC_Channel_4, SDADC_Channel_4, DISABLE); scan_channel 1; } else { // 切换到通道6/7 SDADC_InjectedChannelConfig(SDADC1, SDADC_Channel_6, SDADC_Channel_6, DISABLE); scan_channel 0; } settle_count 0; } // 在主循环中读取结果忽略前N帧 void SDADC_Process(void) { if (settle_count 4) { settle_count; return; } int16_t ch0 SDADC_GetInjectedConversionValue(SDADC1, SDADC_Channel_4); int16_t ch1 SDADC_GetInjectedConversionValue(SDADC1, SDADC_Channel_6); // 使用数据... }这个方案的缺点是有效采样率被建立时间稀释了但换来的好处是每通道数据都稳定可靠。实际需求里低速高精度测量场景对总采样率要求不高几毫秒的建立时间完全可以接受。如果单通道模式则不需要这么复杂只需保证每次启动转换前配置好通道转换完成后读取即可。4. 实测标定与噪声性能数据说话配置代码跑通之后最重要的环节是实测验证。这里我记录了用F373 SDADC配合3.3V基准在差分输入、增益8、Sinc3滤波器、64倍过采样条件下的实际表现以及几个典型误差来源的处理方法。4.1 短路噪声与有效分辨率实测先把输入端短路到共模电平采集1000个连续样本计算标准差这是评估ADC底噪最直接的方法。我测到的情况是在600Hz输出速率下16位原始码的标准差约8到10个LSB对应有效分辨率大概13到14位把输出速率降到15Hz档再看看标准差能压到2到3个LSB有效分辨率可以达到15位以上。这里有个重要的实操心得SDADC追求高分辨率输出速率是最大的杠杆。如果你需要20位级别的测量平滑度宁可把速率降到最低档也不要事后做软件滑动平均因为前者是噪声整形加数字滤波的物理极限后者只是把真实噪声和数据一起抹平响应速度还慢。我在做体温监测时就选择了52Hz左右的输出速率配合软件每32个点再取均值最终显示温度波动稳定在0.01摄氏度以内效果非常理想。另外强烈建议做直流测量时在PCB上预留一个靠近模拟输入的测试点方便用六位半万用表校验。我调试时经常同时记录SDADC原始码和万用表读数对比换算后的电压差异可以快速发现参考电压不准、增益误差这类系统性问题。4.2 传感器偏置与温漂补偿的标定方法SDADC内部有偏置校准寄存器可以消除传感器初始偏移。但温漂问题只靠一次校准解决不了工业场景下环境温度变化几十度传感器零点和满量程都会飘移。我的做法是在PCB上预留一个精密电阻分压产生的零参考通道每次开机先测量该通道作为零偏参考值然后在软件里对所有测量通道做差值运算。这样即使参考电压或运放漂移了零参考通道也会同步漂移通过扣除即可消除掉大部分公共误差。粗略标定时用两点法就够记录零点输出码和满量程输出码线性插值得到转换系数。精确标定时可能需要多点拟合尤其是传感器本身非线性明显时。SDADC本身线性度很高误差主要来自传感器所以在软件端做查表线性化实测效果要比只做满量程缩放好得多。我在一个称重方案中用5点标定加分段线性插值整机精度从百分之二提升到了百分之一以内改动只是软件算法没有动任何硬件。4.3 数字滤波与软件均值什么时候该双管齐下前面说过不要盲目用软件均值代替SDADC自身的滤波那什么时候应该叠加软件滤波经验是看噪声类型。SDADC的Sinc3滤波器擅长抑制白噪声但是对于低频漂移、周期性干扰比如50Hz工频感应效果有限。如果测量信号本身极慢比如温度、液位这类可以在SDADC输出后加一阶IIR低通滤波时间常数选几秒可以明显压低残留波动。IIR滤波器的系数选择要小心。一个常用的一阶低通公式是y[n] alpha * x[n] (1 - alpha) * y[n-1]alpha越小滤波越强但响应越慢。我一般根据实际信号带宽来选例如体温信号带宽低于0.1Hzalpha取0.01到0.05就够了如果测量的是缓慢变化的压力信号alpha可以取0.1左右兼顾响应速度和稳定性。还有一个细节SDADC输出的原始数据已经包含了数字滤波结果再做软件滤波时注意整型溢出。16位原始数据加上滤波累积值需要用32位变量存储最后再右移归一化。直接拿16位变量做累加很容易因为溢出产生周期性跳变我在移植代码时就遇到过这个鬼问题数据明明有滤波却偶尔冒出尖峰调试了半天才发现是累加变量溢出。5. 常见问题与排查技巧实录把我在F373 SDADC调试过程中遇到的典型问题整理成表格并给出排查路径。这里的每一个问题都来自实际调试不是网上抄来的。现象可能原因排查方法读数全部为0或固定满量程引脚复用未配置为模拟模式输入超出共模范围检查GPIO复用设置用万用表测输入引脚电压数据乱跳有明显毛刺数字滤波建立未完成就读取电源纹波过大检查通道切换后的建立时间示波器看VDDA纹波零点偏移数百个LSB未执行校准校准后修改了增益档位每次改变增益后重新校准检查校准等待流程信号正确但整体偏小增益配置错误输入信号源阻抗太高检查增益寄存值输入前端RC取值是否过大致使分压两路通道读数互相串扰通道切换建立时间不足PCB布局上通道间距过近增加建立时间加强输入走线间距和地隔离FAST模式数据波动增大Sinc滤波器选择错误输出分辨率下降根据需要选择Sinc3和对应的过采样率5.1 通道配置错乱读懂通道号与引脚的映射关系F373的SDADC通道复用表非常容易看错。比如SDADC1的通道4/5对应PA0/PA1通道6/7对应PA2/PA3但到了SDADC2上同样的引脚可能映射到不同通道编号。用标准外设库时寄存器配置的通道选择位不是简单填写数字序号就完事的需要查参考手册中SDADC_CSR寄存器描述确认每一位对应的实际通道。排查这类问题最快的方法是将SDADC输入引脚分别接到VREF和GND看读取结果是否分别接近正满量和负满量这样一层层倒推很快能定位到映射错误还是线路错误。如果结果正确但正值和负值不对称再检查共模电压设置是否正确。5.2 校准不彻底导致零点漂移那些年我踩过的坑校准问题是最容易被忽视又最影响结果的坑。我第一次调试时参考例程只有启动校准代码没有等待校准完成标志导致紧接着启动转换实际使用的还是未校准的配置。更隐蔽的问题是SDADC一旦切换增益档或者共模配置之前的校准结果就失效了必须重新校准。校准的时序逻辑我建议写成函数封装配置好通道和增益后调用校准函数并等待两个标志位完成然后再启动转换。代码里要保留校准完成判断的超时保护不然一旦标志异常程序会死等在那里这是嵌入式调试常见的低级错误但一旦碰到会非常浪费时间。还有一个经验校准完成后不要立刻读取数据给内部电路几百微秒的稳定时间。虽然手册未必明确要求但实测中校准结束立即读取的几帧数据偶尔会偏大等一段时间后回归正常。稳妥起见我通常在启动转换前加一个1ms延时彻底避免边界毛刺。5.3 高速率模式下的精度取舍一个容易被忽略的寄存器F373 SDADC的FAST模式通过配置SDADC_CONF2寄存器中的FAST位启用。启用后调制器频率升高输出速率可以更快但代价是噪声性能下降。我做过对照实验同一种输入信号在FAST模式下的噪声底噪比普通模式大约高出一倍多。因此如果没有特殊的高速需求平时尽量保持FAST关闭只在需要3.4kHz以上输出速率时才考虑开启。另外SDADC_CONF2寄存器里还有BCT位用于双通道同时采样配置。如果做的是多通道同步采样需求必须认真阅读这一位的说明否则两个通道的数据可能出现相位偏差。我做的便携式设备没有同步需求但如果你做的是功率分析这类需要电压电流同步采样的应用务必优先确认这个寄存器的配置。6. 写在最后的个人体会F373这颗芯片的SDADC确实称得上是一套“隐藏技能”用好了一颗MCU就能同时完成控制和精密测量整机成本和开发周期都能显著下降。不过它也有自己的性格对电源和参考电压敏感通道建立时间不能着急配置步骤比普通ADC繁琐。这些细节在第一次接触时容易劝退人但搞懂原理之后它反而成了稳定可靠的伙伴因为数字滤波带来的抗噪能力是很多外置ADC方案都难以媲美的。最后再分享一个让我印象深刻的调试经历。有一次产品环境试验中设备在继电器频繁吸合时出现测量值跳变排查了很久以为SDADC硬件出问题了最后发现罪魁祸首居然是软件定时器采样用软件触发中断里又恰好执行了耗时较长的Flash操作导致采样间隔抖动进而让滤波器输出出现异常。换成定时器硬件触发后问题彻底消失。这件事让我深刻体会到SDADC的高精度不仅依赖于硬件设计也和软件架构息息相关采样时序一旦不稳定再好的模拟性能也会被浪费掉。如果你正打算在项目里使用STM32F373 SDADC希望这些经验能帮你少走弯路。测量这件事细节决定成败多一点耐心去抠每个环节最后得到的数据质量会给你惊喜。本文还有配套的精品资源点击获取