尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

STM32外扩ADC:用CD74HC4067模拟开关实现16路数据采集

STM32外扩ADC:用CD74HC4067模拟开关实现16路数据采集 1. 引言为什么需要外扩 ADC最近在做一块基于 STM32 的数据采集板需求其实不复杂一块主控同时采集十几路模拟信号用于监测不同传感器节点的电压变化。看了一圈 MCU 自带的 ADC 通道数发现完全不够用——单片机的 ADC 引脚通常就那么几个即使有 16 个通道的型号也会被其他功能占用大半根本腾不出来。这时候就得靠外扩方案来解决了。市面上常见的多路 ADC 扩展方案无非三种一是换更高端、ADC 通道更多的 MCU成本直接上来二是用独立 ADC 芯片比如 ADS1115、MCP3561 这些精度高但价格也高而且 I2C/SPI 接口通信还需要额外调试三是用多路模拟开关芯片做通道切换也就是标题里提到的 CD74HC4067成本低、电路简单、控制逻辑直白特别适合“通道数不够但精度要求又不是极高”的场景。我最终选了 CD74HC4067。这颗芯片在嵌入式圈子里口碑不错16 路模拟输入、4 位地址线控制、导通电阻典型值 70Ω 左右价格几毛钱一片属于典型的“花小钱办大事”方案。但实际调试过程中我也踩了两个不太容易察觉的坑折腾了大半天才搞清楚原因。这篇文章就把整个方案的实现细节、代码逻辑和调试过程中遇到的那些坑都记录下来给准备用这颗芯片做多路采集的朋友们一个参考。先说清楚这篇笔记适合什么人看你正好在做多路模拟量采集的项目手头 MCU 的 ADC 通道不够用或者你在 CD74HC4067 和 MCU 之间怎么接、代码怎么写、采样值为什么跳来跳去这些问题上卡住了那这篇内容应该能帮你省不少时间。2. CD74HC4067 芯片原理与选型思路2.1 芯片内部结构和工作机制CD74HC4067 本质上是一个单刀 16 掷的模拟开关内部由四个地址选择引脚 S0-S3 和一个使能引脚通常标注为 E 或者 INH控制。当使能引脚拉低时芯片处于工作状态S0-S3 组成的 4 位二进制地址对应选择一路输入通道将 COMMON 引脚公共端与对应通道导通当使能引脚拉高时所有通道全部断开输出呈现高阻态。用生活化的方式理解它就像火车站里的 16 条站台轨道你通过控制 4 个道岔开关S0-S3把列车模拟信号从某一条站台引导到唯一的出口COMMON 引脚。同一时刻只有一条轨道是接通的其他 15 条全部隔离。这个芯片最让我满意的一点是导通电阻的一致性做得不错。不同通道之间的导通电阻差异通常在几欧姆以内对于分压电路、传感器信号采集这种场景来说误差完全在可接受范围内。当然如果你要采集的是高精度微弱信号导通电阻引起的压降误差就需要列入考虑这种场景我会更推荐用单独的模拟开关加运放缓冲的方案。2.2 和独立 ADC 芯片的方案对比在定方案之前我认真对比过独立 ADC 芯片的方案对比维度CD74HC4067 MCU 内置 ADC独立 ADC 芯片如 ADS1115单路成本很低芯片几毛钱较高几块到几十块通道数量16 路输入非常充裕通常 4 路多路需级联控制接口GPIO 直接控制简单粗暴I2C/SPI需要额外调试采样速度受限于开关切换时间和 ADC 转换速度取决于芯片转换速率精度受导通电阻影响中等精度高精度内部有 PGA 放大器扩展灵活性可通过多片级联扩展到更多通道级联麻烦地址线有限制实际项目里传感器输出的电压范围在 0-3.3V精度要求 12 位就够这种情况下 CD74HC4067 的性价比非常突出。而且控制逻辑极其简单不需要初始化 I2C 或 SPI 外设直接用 GPIO 拉高拉低就行对一些资源紧张的 MCU 来说特别友好。2.3 什么时候不适合用这颗芯片这里也想说点反面经验。如果你在做高精度数据采集要求分辨率达到 16 位以上或者信号本身是微伏级别的CD74HC4067 的导通电阻和漏电流就可能成为精度瓶颈。另外如果输入信号频率很高比如音频信号、高速传感器输出模拟开关的带宽限制和切换时间会成为新的瓶颈这时候老老实实选独立 ADC 或多通道同步采样的 MCU 更合适。还有一个容易忽略的问题CD74HC4067 是单端开关公共端 COMMON 通常接 ADC 输入每个通道的信号参考地要和系统共地。如果是差分信号就得用两片 CD74HC4067 分别切换正负极复杂度会上升不少。3. 硬件电路设计与关键细节3.1 经典接线方式硬件连接其实不复杂。我的具体接法是这样的S0、S1、S2、S3 分别接 MCU 的四个 GPIO 引脚我用的 PB0-PB3用于通道选择E使能引脚接另外一个 GPIOPB4低电平有效COMMON 引脚接 MCU 的 ADC 输入引脚我用的是 PA1也就是 ADC1 的通道 116 路输入通道分别接各路传感器信号。需要注意的是如果传感器信号电压范围和 MCU 的 ADC 参考电压不匹配需要在 COMMON 引脚和 ADC 输入端之间加分压电阻或者运放调理电路。我这里所有信号都在 0-3.3V 范围内所以直接接过去就行。3.2 电源去耦与参考电压处理这个坑我一开始没有意识到CD74HC4067 的模拟开关导通电阻和芯片的工作电压有关系VCC 电压越稳定通道一致性越好。因此 VCC 和 GND 之间必须加上 100nF 去耦电容并且尽量靠近芯片引脚放置。另外MCU 的 ADC 参考电压也很重要。如果开发板上已经有基准电压芯片那直接用如果是用 VDDA 作为参考电压就一定要确保 VDDA 的纹波足够小。我在调试过程中发现 ADC 采集值一直有小幅跳动排查了半天发现是参考电压被一个开关电源的纹波污染了后来在 VDDA 引脚附近加了 LC 滤波才解决。这里可以给一个实用建议在设计 PCB 时模拟部分和数字部分的地要单点连接模拟电源走线和数字电源走线分开敷铜可以有效减少数字信号对模拟信号的干扰。3.3 通道切换稳定时间的重要性很多人第一次用 CD74HC4067 的时候容易忽略一个问题通道切换之后模拟信号需要一定时间才能稳定下来。芯片内部的开关动作虽然很快几十纳秒级别但信号通路上寄生电容、外部滤波电容都会影响最终的稳定时间。具体来说我在 COMMON 引脚到 MCU 的 ADC 输入之间加了一个 100nF 的滤波电容用于滤除高频噪声。但这就导致一个问题切换通道后这个电容需要重新充电/放电到新的信号电压如果上一路电压是 3.3V这一路是 0.1V电容放电就需要时间。如果通道切换后立即启动 ADC 转换采集到的值明显偏大要等几百微秒才恢复正常。因此软件上必须在切换完通道后延时一段时间再启动 ADC 转换。延时多少合适取决于你加的滤波电容大小和信号源阻抗。我实测过100nF 电容情况下延时 50 微秒左右基本就能稳定但为了保险起见我用的是 100 微秒。4. 软件实现与核心代码解析4.1 基础功能实现GPIO 控制 单通道采集先放一个最基础的实现逻辑用伪代码描述// 定义通道选择引脚 #define S0_PIN GPIO_PIN_0 #define S1_PIN GPIO_PIN_1 #define S2_PIN GPIO_PIN_2 #define S3_PIN GPIO_PIN_3 #define EN_PIN GPIO_PIN_4 #define GPIO_PORT GPIOB // 选择指定通道 void MUX_SelectChannel(uint8_t channel) { // 通道范围 0-15 HAL_GPIO_WritePin(GPIO_PORT, S0_PIN, (channel 0x01) ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIO_PORT, S1_PIN, (channel 0x02) ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIO_PORT, S2_PIN, (channel 0x04) ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIO_PORT, S3_PIN, (channel 0x08) ? GPIO_PIN_SET : GPIO_PIN_RESET); } // 读取指定通道的 ADC 值 uint16_t MUX_ReadChannel(uint8_t channel) { MUX_SelectChannel(channel); delay_us(100); // 等待信号稳定 HAL_ADC_Start(hadc1); HAL_ADC_PollForConversion(hadc1, 10); return HAL_ADC_GetValue(hadc1); }这一段逻辑本身不复杂但有一点需要在项目初始化时额外注意所有控制引脚的初始电平必须明确设置。我在初始化代码中先拉高 EN 引脚禁用芯片等所有 GPIO 配置完成后再拉低 EN使能芯片避免在初始化过程中出现通道误选的情况。这个细节在后面第一个调试坑里会详细展开。4.2 多路循环扫描与数据滤波实际项目中很少只采集一路信号通常是 16 路通道循环扫描。我在循环采集的基础上加了均值滤波每个通道连续采集 8 次去掉最大值和最小值后取平均效果比单次采集稳定很多#define SAMPLE_COUNT 8 uint16_t MUX_ReadChannelFiltered(uint8_t channel) { uint32_t sum 0; uint16_t samples[SAMPLE_COUNT]; uint16_t min_val 0xFFFF, max_val 0; for (int i 0; i SAMPLE_COUNT; i) { samples[i] MUX_ReadChannel(channel); if (samples[i] min_val) min_val samples[i]; if (samples[i] max_val) max_val samples[i]; } for (int i 0; i SAMPLE_COUNT; i) { sum samples[i]; } sum - min_val; sum - max_val; return (uint16_t)(sum / (SAMPLE_COUNT - 2)); }这种去极值平均滤波的实现方式很经典能有效去除偶发的尖峰干扰同时保留信号的快速变化特征。如果你的信号变化比较平缓也可以直接滑动平均滤波代码更简单。不过要注意滤波会增加采样时间。以单次 ADC 转换耗时 10 微秒、加上通道切换延时 100 微秒计算单通道采集一次需要约 120 微秒做 8 次采集加去极值平均单通道大约 1 毫秒16 路完整扫一圈大约 16 毫秒刷新率 60Hz 左右完全满足我的项目需求。4.3 ADC 采用 DMA 方式的变通方案热门搜索词里多次出现“stm32 hal 库 adc 单通道 dma 多次采样”说明大家普遍希望用 DMA 来降低 CPU 占用。但 CD74HC4067 的通道切换必须由 GPIO 控制DMA 方式没法直接实现“按顺序自动切换外部开关”的操作因为 DMA 传输只负责把 ADC 转换结果搬走不会去动 GPIO。如果你确实想用 DMA一个可行的变通方案是在 DMA 传输模式下启动 ADC 连续采样但每次要切换通道时主动调用MUX_SelectChannel()切换 GPIO然后等待稳定后再让 DMA 开始搬运数据。这相当于把“通道切换数据搬运”拆成两个阶段DMA 只负责第二阶段的数据存储。实际操作下来这个方法能减少 CPU 在搬运数据上的开销但复杂度和收益不成正比。对于一般项目我建议直接用查询方式采集就够了16 路全扫 60Hz 的刷新率已经非常可观。4.4 采样值换算与电压计算采集到原始 ADC 值后需要转换成实际电压。以 STM32 的 12 位 ADC 为例float MUX_GetVoltage(uint16_t adc_value) { // 12 位 ADC参考电压 3.3V return (float)adc_value * 3.3f / 4095.0f; }这里有个容易犯的错误ADC 参考电压如果不是 3.3V而是外部基准电压芯片提供的 2.5V 或者 4.096V换算系数就要对应改成 2.5 或 4.096。我在调试过程中就吃过这个亏——板子上有一个 2.5V 基准电压芯片但我一开始没注意直接按 3.3V 换算导致所有电压读数偏高了 30% 左右。这个错误在单一通道下很难发现因为看起来每个通道的数值都“有规律”直到用万用表实测某一通道电压才暴露问题。4.5 扩展多片 CD74HC4067 级联的实现思路如果 16 路还不够用可以用多片 CD74HC4067 级联。最常见的做法是使用 MCU 的一个 GPIO 作为多路选择高位比如通过一个简单的 2-4 译码器如 74HC139控制每片芯片的 EN 引脚单片机 IO 从 4 位变成 6 位就能扩展到 64 路。不过实际项目中我并不建议把通道数无限扩大。原因有两个一是模拟开关导通电阻会叠加信号源内阻通道越多干扰越大二是软件扫描周期会拉长实时性下降。如果确实需要 64 路以上且对精度有要求建议考虑多片 ADC 芯片并行采集或者直接用带更多通道的专业数据采集卡。5. 调试中的两个大坑5.1 第 1 个坑S 引脚初始化顺序导致首通道数据异常这个坑的现场是这样的我把代码烧录进去后所有 16 个通道的数据都能读出来但通道 0 的值始终比实测电压高出一截其他通道都是正常的。一开始我以为通道 0 的传感器信号有问题用万用表直接量传感器输出电压正常。又怀疑是 PCB 走线问题仔细检查了通道 0 的走线也没有发现问题。后来反复看代码终于在初始化函数里发现了问题我在配置 GPIO 之前先执行了MUX_SelectChannel(0)而此时四个 S 引脚的默认电平是浮空状态。根据数据手册CD74HC4067 的地址输入引脚内部没有上下拉电阻浮空时电平不确定芯片实际选择的通道可能是随机的。而我的初始化代码在初始化 ADC 外设之前先把 EN 引脚拉低使能了芯片导致 MCU 在 GPIO 还没完全配置好的时候芯片就已经处于一个不确定的工作状态。更隐蔽的是后续代码中调用MUX_SelectChannel(0)时确实会把 S0-S3 的电平拉到位但因为实际电路板上的通道 0 接到了 ADC 引脚上而 ADC 初始化之前这个引脚处于浮空状态外部噪声已经将滤波电容充到了一个非零电压。等通道 0 真正被选中时电容上的残余电压和当前信号叠加导致第一次转换结果偏高。虽然我的代码里加了 100 微秒的稳定延时但稳定是相对的——如果电路的输入阻抗很高电容放电速度慢100 微秒根本不够。解决方式在系统初始化的一开始就把所有 GPIO 引脚配置为推挽输出模式并明确把 EN 引脚拉高禁用芯片然后再依次配置 S0-S3 引脚的电平状态最后等所有引脚状态稳定后才把 EN 拉低使能芯片。同时在首次读取任意通道之前先做一次“虚拟通道选择”也就是切换两次不同的通道后再正式采集。这个方法的本质是让内部模拟开关和外部滤波电容先“动一动”打破初始状态可能存在的电荷残留。这里也总结一个通用经验用模拟开关这类芯片时任何使能引脚都必须放在其他控制引脚初始化之后再使能顺序千万不能反。别小看这个顺序我在好几个项目里都见到过类似问题症状五花八门但根源都是初始化顺序不对。5.2 第 2 个坑通道悬空导致的串扰和漂移第二个坑是典型的“浮空输入”问题。我的 16 路通道中有几个通道并没有接传感器信号处于完全悬空状态。在调试过程中我发现这些悬空通道的 ADC 读数值不是固定的而是不规则跳动并且相邻已接信号通道的值也会受到影响出现周期性的小幅度波动。这个现象背后的机制并不复杂模拟开关在关断状态时并非绝对开路而是存在一个较小的漏电流数据手册上标称典型值为 100nA 级别。当某个通道悬空时漏电流会在芯片内部形成一个微弱的耦合路径信号电压变化会通过寄生电容串扰到邻近通道上。另外悬空引脚本身相当于一根天线环境中的 50Hz 工频干扰和空间电磁噪声都会耦合进去。解决方式三个措施结合起来彻底解决了这个问题一是硬件上对所有悬空通道加上下拉电阻。我用的 10kΩ 下拉电阻接到 GND确保悬空通道在电气上有一个确定的电平不会处于完全浮空状态。如果后续还要接传感器这个电阻也不会对信号产生明显影响——和传感器的输出阻抗相比10kΩ 的负载效应很小。二是软件上在扫描循环中跳过已知的悬空通道不启动 ADC 转换直接返回 0 或者返回一个无效标志。这样既避免了无意义的数据也缩短了整体扫描时间。三是 PCB 设计层面模拟开关的相邻通道走线之间增加地线隔离guard trace在铺铜时将模拟输入引脚用地包围起来。这个属于版图优化范畴能显著减少通道间的寄生耦合。如果你的 PCB 空间允许强烈建议加上。这种“悬空通道串扰”的问题如果你只是随便点几下调试还好一旦要做量产级的稳定数据采集就必须提前把通道状态管理好。我的习惯是在应用层建立一个通道配置表哪些通道有效、哪些通道无效、每个通道输入量程是多少都放在一个结构体数组里管理这样无论是调试还是后期维护都清晰很多。6. 数据精度提升与软硬件协同排查6.1 量化误差和系统误差到底从哪来ADC 采集的误差来源通常是多方面的CD74HC4067 加入之后又多了一个变数。以我的实测数据为例在 3.3V 参考电压、12 位分辨率下每个 LSB 对应的电压是 3.3V/4096≈0.8mV。而 CD74HC4067 的导通电阻 70Ω 在信号源内阻 10kΩ 的分压电路中会造成约 0.7% 的误差这比量化误差大得多。误差来源典型量级消除/抑制方式量化误差±0.5 LSB多次采样取平均导通电阻引起的分压误差0.1%~1%输入端加缓冲运放参考电压纹波数 mVLC 滤波、基准芯片通道串扰变化不定下拉电阻、地隔离采样时序不稳定少量 LSB固定延时、软件滤波在实际项目中如果你发现 ADC 采集值的波动范围超过 5 个 LSB首先要排查参考电压纹波和信号源稳定性而不是怀疑算法和芯片。我在调试中见过不少人把时间花在优化滤波器上结果问题出在板子供电纹波过大——滤波算法再怎么优化也解决不了硬件毛刺。6.2 用已知电压标准校准全链路为了评估整个采集链路CD74HC4067 MCU ADC的实际精度我用一个高精度可编程电源输出准确的电压值分别接入几个通道然后用最终换算出的电压值和电源显示值进行对比。实测记录了一组数据电源输出 (V)通道 A 采集值 (V)通道 B 采集值 (V)误差 (mV)0.0000.0030.0022-30.5000.4980.4991-21.0000.9960.9973-41.5001.4971.4963-42.0001.9941.9955-62.5002.4962.4954-53.0002.9912.9909-103.3003.2873.28911-13可以看出在 0-2.5V 范围内全链路精度大约在 6mV 以内对于常规传感器采集已经够用。但在接近满量程时误差明显增大原因是参考电压精度和芯片导通电阻在较高电压下的非线性共同导致。如果对高电压段精度有硬性要求可以考虑在软件上做分段线性校准先测出每个通道在几个已知电压点的实际偏差然后用插值法修正读数。6.3 示波器在调试中的关键作用调试过程中示波器帮了我大忙。特别是排查第一个坑的时候我用示波器同时抓取 COMMON 引脚的波形和 S0 引脚的电平一眼就能看出在 GPIO 初始化的瞬间COMMON 引脚上的电压是异常跳跃的而不是平静地跟随通道 0 的电平。另外在验证通道切换延时是否充足时示波器同样直观把探头接在 COMMON 引脚上切换通道后观察波形稳定需要的时间直接读出为一个阶梯状的上升/下降曲线稳定时间一目了然。这个数据比翻数据手册、盲目拍脑袋定延时靠谱得多。建议大家在调试模拟开关类电路时示波器探头的接地夹尽量短直接夹在靠近芯片 GND 引脚的地方避免地环路引入额外噪声。带宽也不用太高100MHz 的示波器完全够用。7. 工程化改进与扩展方向7.1 通道状态管理表的软件架构前面提到过通道配置表这里展开说说。当系统有十几路甚至几十路输入时一定要避免在业务代码里到处硬编码通道编号。我现在的做法是在数据采集模块中定义一个结构体数组typedef struct { uint8_t channel_id; // 对应 CD74HC4067 的通道号 0-15 uint8_t is_enabled; // 是否启用 float scale_factor; // 电压换算系数 float offset; // 零点偏移 char description[16]; // 信号描述便于日志输出 } MuxChannelConfig_t; const MuxChannelConfig_t channel_config[16] { {0, 1, 1.0f, 0.0f, temp_sensor}, {1, 1, 1.0f, 0.0f, pressure_A}, {2, 0, 1.0f, 0.0f, unused}, // ... };这样做的收益在后期维护时非常明显传感器换型号、通道改接法只需要修改配置表不用动采集逻辑。有时候我甚至会把配置表放到一个独立的源文件中方便多人协作开发时不产生冲突。7.2 多线程/定时器驱动的采样架构如果 MCU 端跑的是裸机程序或者 RTOS建议把通道扫描放进定时器中断或独立任务中而不是在主循环中轮询。我自己用的是 STM32 的定时器触发方式定时器每 20 毫秒触发一次中断在中断服务函数中按顺序切换并采集下一路通道采集结果写入一个环形缓冲区。主程序需要数据时直接从缓冲区读取最近一次采样值。这种“后台持续采样、前台按需读取”的架构能有效避免主循环中其他耗时操作影响采样节奏也能让采样周期非常均匀。注意中断服务函数里的延时不能用阻塞式delay_us()否则会阻塞其他中断。建议用状态机的方式实现每次进入中断只做一件事要么切换通道要么启动采集要么处理数据通过一个内部状态变量推进流程。7.3 用多片 CD74HC4067 扩展时的地址方案如果将来需要从 16 路扩展到 64 路多片级联时的地址管理更要注意。简单方案是在每一片芯片上并联相同的 S0-S3 引脚但每片的 EN 引脚由独立 GPIO 控制。这样 MCU 需要 4 根地址线加 4 根片选线总共 8 个 GPIO 就能控制 64 路。当然也可以配合译码器来减少片选引脚数量74HC139 这类双 2-4 译码器就能用两个 GPIO 扩展出 8 个片选信号。多片级联后软件扫描层的逻辑也要跟着调整把“片选通道号”统一编码成一个逻辑通道号。比如逻辑通道号 0-15 对应第一片16-31 对应第二片依此类推。7.4 与“ADC 信噪比”相关的优化思路热搜词里出现了“ADC 信噪比”这个指标在精密采集系统里经常被提到。信噪比SNR表示有效信号幅度与噪声幅度的比值。使用 CD74HC4067 这种模拟开关方案时影响信噪比的主要因素是开关导通电阻产生的热噪声以及控制信号通过寄生电容耦合到模拟通路上的数字噪声。提升信噪比的方法有几个模拟部分和数字部分的电源分开控制引脚串接 100Ω-1kΩ 的电阻减缓控制信号边沿的陡峭度减小耦合尖峰ADC 采样之前在模拟通路上加 RC 低通滤波器截止频率设置在信号带宽的 3-5 倍左右。这些方法组合使用信噪比可以获得明显改善。8. 实测记录与经验总结这次用 CD74HC4067 扩展 16 路 ADC 采集的项目从画原理图到最终软硬件联调跑通前后花了三天时间。第一天画板子和写驱动第二天调试遇到了那两个坑第三天做整体数据校验和精度测试。不算顺利但收获也不少。硬件侧的关键经验去耦电容别省VCC 和 GND 之间 100nF 是底线有条件再加一个 10µF 的电解电容悬空通道必须处理下拉电阻是最简单有效的方法布局布线时注意模拟信号和数字信号的隔离ADC 输入走线尽量短而粗如果需要更高的精度在 COMMON 引脚和 MCU ADC 之间加一级运放缓冲用电压跟随器隔离导通电阻的影响。软件侧的关键经验初始化顺序必须严格GPIO 推挽输出 → S 引脚电平设置 → EN 拉低使能 → ADC 初始化 → 首次虚拟切换通道切换后必须延时延时时间以实测波形稳定为准多次采样滤波不能省去极值平均是性价比很高的方案建立通道配置表把通道管理从业务逻辑中剥离出来采样周期要规划好16 路全扫的目标刷新率决定了单通道的最大耗时预算。根据我个人的实际体会用 CD74HC4067 这类模拟开关扩展 ADC 通道最大的价值在于用极低的成本解决了“通道数量不够”的问题。它不擅长处理高精度、高速率、差分信号的场景但如果你只做常规传感器采集、监控多路电压状态这个方案简单稳定又省钱非常值得掌握。最后再分享一个小技巧调试完成后可以利用空闲的通道接一路已知的基准电压比如用电阻分压从参考电压引出 1.65V作为整个采集链路的周期性自检信号。主程序每隔一段时间采集一次这个自检通道如果读数偏差超过预设阈值说明链路可能出现问题可以主动上报异常。这个小小的设计能让系统在长期运行时的可靠性提高不少。
返回列表