ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

CD74HC4067扩展STM32 ADC通道:16路模拟采集的硬件设计与调试复盘

2026/9/8 9:30:15 拓冰建站 浏览量
CD74HC4067扩展STM32 ADC通道:16路模拟采集的硬件设计与调试复盘 这块板子是去年底开始做的当时的需求其实很简单一块主控板要同时采集12路电池电压和4路温度信号满打满算16路模拟量。手上这颗STM32虽然自带ADC但可用通道数掰着手指头数都不够总不能为了几路模拟量去换一颗引脚更多的型号毕竟改硬件封装、改PCB布局的代价实在太大。于是我把目光放到了CD74HC4067这颗16通道模拟多路复用器上——用4根GPIO就能把单路ADC变成16路成本几毛钱原理也直白。方案听起来很美好实际调试的过程中却踩了两个不大不小的坑折腾了两个晚上才彻底搞明白。这篇笔记把整个设计思路、接线方式、驱动代码以及那两个坑的完整复盘写下来给后面打算用同一颗芯片做ADC通道扩展的朋友做个参考。整篇内容适合正在做嵌入式采集电路、想用最小成本扩展ADC通道的开发者也适合第一次用模拟多路复用器的新手。我会尽量把硬件选型、软件时序和调试过程串成一条线来讲尽量说人话碰到关键参数会直接给出计算过程和实测数据。1. 为什么选CD74HC4067扩展ADC通道的三种思路对比1.1 需求场景复盘看似简单实则尴尬的16路采集很多项目都有这种尴尬阶段模拟量通道数量不上不下比MCU内置ADC通道多几个但又没多到需要专门上一颗高精度采集芯片。我这个项目就是典型——12路电池电压监测加4路NTC温度总共16路而主流STM32的ADC外设一般是10到16个外部通道去掉被占用的引脚真正能自由使用的可能只有6到8路。这个时候摆在面前的方案有三条换MCU、加外部ADC芯片、加模拟多路开关。换MCU意味着SDK、工程、PCB几乎全要动而且为了多几路ADC去选一颗高引脚封装成本和时间都不划算项目迭代的时候尤其忌讳这种伤筋动骨的做法。加外部ADC芯片倒是正经路子但I2C接口的ADS1115一次转换时间动辄几毫秒SPI接口的高速ADC又贵还得额外处理参考电压、转换时序对只需要12位精度的场景来说有点杀鸡用牛刀。剩下就是模拟多路开关配合内置ADC的方案。用MCU本身的ADC只是在ADC前端加一个开关分时选通16路信号每路轮流采一遍就当16个ADC通道用。CD74HC4067就是干这个事的芯片16选1模拟开关导通电阻几十欧姆开关时间几十纳秒级别的量级足够配STM32这类内置ADC使用。最终我选了这条路线理由很简单改动最小成本最低原理最简单。1.2 方案对比不同扩展路线各自的取舍把三条路线放在一张表里看优缺点就非常直观了方案成本额外MCU引脚采样率改动范围适合场景换更多引脚MCU高0高原生多路ADC大原理图和PCB都要改新项目设计阶段I2C外部ADC如ADS1115中2I2C低几百Hz中新增I2C从机低速高精度采集16位分辨率SPI外部ADC高4~5SPICS高MHz级别中要求高速同步采样的场景CD74HC4067模拟开关极低5S0-S3EN中每通道几kHz小前置开关通道多但单路速度要求不高这个表里的采样率一栏需要特别说明。分时复用方案本质上是用时间换通道16个通道轮流走同一个ADC每个通道实际能分到的采样率大致是“单通道转换速度除以16”。我这边每路信号基本都是静态电压和缓变温度单通道10kHz都算绰绰有余所以分时复用没有任何问题。反过来如果你要采的是交流信号或者振动波形每通道有效采样率低于20kHz就会明显感到吃力这种情况下还是老老实实上真正的多ADC同步采集。1.3 CD74HC4067的工作原理与关键参数CD74HC4067本质上是一个16选1的模拟开关矩阵属于CMOS 4000系列逻辑家族的HC版本。片上有16个模拟开关输入/输出引脚编号CH0到CH15一个公共端通常标注为COM还有4根地址选择线S0、S1、S2、S3外加一根使能/禁止线EN有些手册标注为INH。S0到S3组成4位二进制数0000到1111分别选中CH0到CH15EN为低电平时开关正常选通EN为高电平时所有通道全部断开。关键参数里Design上最需要关注的是导通电阻Ron和开关时间。CD74HC4067在4.5V电源下Ron典型值约70Ω这个阻值在模拟信号链路里并不算小——如果传感器输出阻抗本身很高比如达到几十千欧那么70Ω的Ron几乎可以忽略但如果你直接接的是一个低阻抗源比如运放输出或者稳压器输出Ron就会和负载构成分压产生误差。开关时间通常在几十纳秒级别芯片本身的“切换速度”不是瓶颈真正拖慢系统的是后面的外部RC充电时间这个稍后在坑1里面详细展开。还有一个细节很多人一开始会忽略CD74HC4067的输入模拟电压范围只能在VCC和VEE这个项目里VEE就是GND之间超过VCC或低于GND都会让芯片内部寄生的保护二极管正向导通轻则读数错误重则损伤芯片。所以当你的信号本身有负电压或者超过电源电压的情况必须先做电平搬移或保护处理不能直接怼到芯片上。2. 硬件设计接线不是把芯片放上去就行2.1 引脚功能与最小接线方式CD74HC4067的封装常见是SOIC-24和DIP-24管脚排列非常规律左边12根右边12根S0、S1、S2、S3和EN在芯片的一侧COM在另一侧的中部。给它通电特别简单VCC接正电源GND接负电源模拟信号挂在CH0到CH15上公共端COM输出接到MCU的ADC输入引脚4根地址线由MCU的GPIO控制。我在画原理图时习惯给每个通道名标成X1、X2这种丝印标识比如CH0接BATT_1到BATT_12CH12到CH15接NTC1到NTC4这样后期查线、写驱动、看打印都方便。这个做法听起来很基础实际调试的时候能省不少事——尤其当你用逻辑分析仪或者示波器抓波形时能一眼看出某根通道线确实是接到对应传感器上了。2.2 电源、逻辑电平和去耦电容的几个细节电源和逻辑电平这两个问题是我特别想提醒所有第一次用这颗芯片的人注意的。CD74HC4067的VCC范围是2V到6V很多人想都不想直接接5V。如果你的MCU是5V系统这没问题但如果你用的是3.3V的STM32事情就变得微妙起来。HC系列的输入高电平门槛典型值是0.7×VCC在VCC5V时就是3.5V而3.3V单片机GPIO的高电平输出通常只有3.0V到3.3V可能达不到这个门槛就会导致S0-S3的电平识别不稳定开关通道偶发错乱。我自己在调试初期就碰到过通道选择的偶发跳变后来查数据手册才反应过来。解决办法有两个一是把CD74HC4067的VCC直接接到3.3V代价是模拟电压输入范围也跟着变成0到3.3V并且Ron会略微增大到一百多欧姆二是换用CD74HCT4067HCT版本的输入门槛是0.8V左右TTL兼容3.3V驱动5V供电毫无压力。我在这个项目里最终采用了后者HCT版本选型完全兼容不用担心电平不匹配。去耦电容这事虽然老生常谈但确实见过有人直接跳过。VCC引脚旁边必须放一个0.1μF的瓷片电容尽量贴近芯片放置高频噪声和通道切换带来的电源毛刺都有明显的抑制作用。模拟信号线和地址线在PCB上尽量短避免长距离平行走线造成通道间串扰这个是后面坑2的物理根源之一。2.3 输入信号调理与阻抗匹配CD74HC4067不是神它只是个开关模拟信号是什么样进就是什么样出不会帮你改善信号质量。如果你的传感器输出的是高阻抗信号比如几kΩ到几十kΩ的分压网络建议在进入多路开关之前加一个运放跟随器把源阻抗降到很低。这样有两个好处一是降低外部阻容与被采信号的交互让开关建立时间大幅缩短二是让ADC采样电容充电时有个低阻来源减少采样误差。我在实际电路上做了一层统一调理所有电池电压先用精密电阻分压到3.0V以内再过一个运放跟随器输出直接给CD74HC4067的通道脚NTC电阻信号则先经过一个固定电阻分压成0到3.3V的电压同样经跟随器后进入开关。成本增加不多但信号链路的稳定性和一致性好了不止一个档次。如果源阻抗实在降不下来软件上就要用更长的采样周期和更长的切换等待时间后面章节的时序分析会说明这个trade-off。3. 软件驱动分时复用ADC的完整实现3.1 外设初始化GPIO和ADC的配置方式以STM32F103加HAL库为例先初始化控制多路开关的GPIO。S0到S3加上EN一共5根线全部配置成推挽输出、下拉EN初始化为低电平使能void Mux_Init(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitStruct.Pin GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4; GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull GPIO_PULLDOWN; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, GPIO_InitStruct); /* EN拉低让多路开关处于使能状态 */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET); }ADC部分按常规配置即可我这里选择PA1作为ADC12_IN1输入单次转换模式12位分辨率。因为信号是分时复用的同一时刻只转换一路不需要开启DMA用最朴素的轮询读取就好。DMA在多通道连续采集的语境下确实更高效但对分时复用的场景帮助有限还白白增加缓存管理的复杂度。3.2 通道切换与采样代码一个轮询式的完整实现通道选择的核心就是通过GPIO输出4位二进制地址void Mux_SelectChannel(uint8_t ch) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, (ch 0x01) ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, (ch 0x02) ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, (ch 0x04) ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, (ch 0x08) ? GPIO_PIN_SET : GPIO_PIN_RESET); }读取任意一个通道的电压值时先切换通道然后延时等待开关和外部RC电路稳定再启动ADC转换。基础版读取函数如下uint16_t Mux_ReadChannel(uint8_t ch) { Mux_SelectChannel(ch); delay_us(50); /* 等待4067输出稳定 */ HAL_ADC_Start(hadc1); HAL_ADC_PollForConversion(hadc1, 10); uint16_t value HAL_ADC_GetValue(hadc1); HAL_ADC_Stop(hadc1); return value; }这个函数看起来没毛病但如果你真这么写大概率会踩到坑1——切换后延时50μs其实还不够稳或者说在某些输入条件下读到的值仍然不对。具体问题下面专门用一整节来讲先在这里留个悬念。3.3 采样率与延时平衡一个必须算清楚的账软件上能直接配置的参数主要是两个切换后的等待延时以及ADC自身的采样周期。这两个值都会直接影响系统能跑多快而采样周期长短又会带来精度差异所以必须把账算明白。以STM32F103为例ADC时钟来自PCLK2经过预分频后的时钟通常配置为12MHz。如果设置采样周期为1.5个ADC时钟一次12位转换需要1.512.514个周期也就是约1.17μs如果采样周期设为28.5个周期一次转换需要41个周期约3.4μs。在高阻抗信号源场景下1.5周期的采样时间通常不够因为内部采样电容来不及充到目标电压实际采集值会偏低所以常规做法是用28.5周期以上。加上多路开关的切换延时单通道耗时大约就是“等待延时ADC转换时间”。下面这张表按不同等待延时计算了16通道一轮扫描的周期方便直观理解切换后等待延时单通道耗时采样28.5周期16通道一轮耗时等效每通道采样率0μs理论上3.4μs54.4μs18.4kHz5μs8.4μs134.4μs7.4kHz10μs13.4μs214.4μs4.7kHz20μs23.4μs374.4μs2.7kHz50μs53.4μs854.4μs1.2kHz对于我的电池电压和NTC温度采集项目每通道1kHz以上完全够用所以延时给20μs到50μs都很宽裕。如果你的源阻抗很低跟随器输出通常小于1Ω那么延时可以大胆压到5μs甚至更短换取更高的扫周期。最关键的一点是先看信号源阻抗再决定等待延时而不是随便拍一个值。3.4 采样滤波先剔除坏值再做均值模拟开关分时复用有一个先天弱点通道切换瞬间信号链路上会有毛刺和瞬态电压。哪怕等待时间足够长ADC转换结果偶尔也会跳出几个离谱的野值。直接拿这些值参与控制会很危险尤其电池电压监测这种场景一个错误的高电压值可能触发保护逻辑误动作。常见的处理办法是“去极值平均滤波”每通道连续采样7次去掉一个最大值和一个最小值剩下的5个值做算术平均。这个算法实现很简单却能同时滤掉脉冲噪声和随机噪声uint16_t Mux_ReadChannelFiltered(uint8_t ch) { uint16_t buf[7]; uint16_t min_val, max_val; uint32_t sum 0; int i; Mux_SelectChannel(ch); delay_us(20); HAL_ADC_Start(hadc1); HAL_ADC_PollForConversion(hadc1, 10); (void)HAL_ADC_GetValue(); /* 第一次丢弃 */ HAL_ADC_Stop(hadc1); for (i 0; i 7; i) { HAL_ADC_Start(hadc1); HAL_ADC_PollForConversion(hadc1, 10); buf[i] HAL_ADC_GetValue(); HAL_ADC_Stop(hadc1); delay_us(2); } min_val buf[0]; max_val buf[0]; for (i 1; i 7; i) { if (buf[i] min_val) min_val buf[i]; if (buf[i] max_val) max_val buf[i]; } sum 0; for (i 0; i 7; i) { if (buf[i] ! min_val buf[i] ! max_val) sum buf[i]; } return (uint16_t)(sum / 5); }这里有几处细节值得说明。第一切换通道后我先做了一次ADC转换并丢弃结果目的就是让信号链路完成一次完整的充放电过程第二每次转换之间加2μs左右的间隔给ADC内部采样保持电容一个再充电的时间第三去极值平均只适合信号变化速度远低于扫描周期的场景如果采样的是快速变化的波形建议改成滑动平均或者卡尔曼滤波否则会明显钝化信号响应。4. 两个调试坑的完整复盘4.1 坑1切换通道后立即采样读回的是上一个通道残留电压这个坑的项目现场表现实在太典型了必须详细写出来。我第一版驱动程序写完以后在开发板上做了个简单测试把16个通道分别接不同的分压电压然后依次扫描打印。打印出来的数据让我一头雾水——每个通道读数都接近上一个通道的电压比如上一个是3.3V下一个明明是0V第一次读到的还是接近3.3V的值要连读几次才慢慢降下来。一开始我怀疑是S0到S3的接线顺序错了因为如果地址线接反通道映射就会错乱读到的也会是“错误通道”的值。用万用表一根根测过GPIO和芯片引脚之间的通断确认没有虚焊和短路。又用逻辑分析仪抓了S0-S3的波形每一轮扫描的地址码完全正确该是哪一路就是哪一路。接着我怀疑是不是ADC配置的问题比如是不是用了DMA缓存导致数据错位或者转换模式配成了连续转换。翻代码检查全部都是单次转换这个方向也不对。后来我直接把示波器探头接到了CD74HC4067的COM输出引脚上在GPIO切换通道的那一刻盯着波形看谜底一下就揭开了。示波器上的现象是切换地址线之后COM引脚上的电压并没有立刻跳到目标电压而是从旧电压开始沿着一条RC充电曲线缓缓爬向新电压。爬的过程大约要几十微秒才能稳定到目标值附近。这个现象根本原因是CD74HC4067内部不是理想开关它等效成一个约70Ω的导通电阻串在信号路径上而COM节点对地还存在寄生电容十几pF量级。如果输入信号源的输出阻抗本身也比较高比如我早期测试时直接用一个10kΩ电阻分压器提供电压那么等效RC时间常数就有10kΩ乘以100pF左右大约是1μs。按RC充电的规律要稳定到0.1%精度需要约7个时间常数也就是7μs稳定到0.05%需要更久。但为什么我延时了50μs还不稳因为这里还叠了一个因素STM32内部ADC的采样保持电容在启动转换瞬间会从COM线上吸取电荷如果COM线上的驱动源阻抗偏大采样电容充电也会不充分导致每次读取的值偏低且逐渐漂移。两个RC串联在一起等效充放电时间就更长了。数据手册上STM32的ADC采样周期最长可以配置到239.5个周期约20μs就是为高阻抗源准备的。搞清楚原因解决思路就清晰了第一在硬件上尽量降低源阻抗运放跟随器是最有效的办法。第二软件上把切换后的等待延时加大并且一定要丢弃切换后的第一次转换值。实际修正后的采样函数如下uint16_t Mux_ReadChannelStable(uint8_t ch) { uint16_t dummy; Mux_SelectChannel(ch); delay_us(50); /* 等待外部RC彻底稳定 */ HAL_ADC_Start(hadc1); HAL_ADC_PollForConversion(hadc1, 10); dummy HAL_ADC_GetValue(); /* 丢弃仅用于让信号链路完成充放电 */ HAL_ADC_Stop(hadc1); delay_us(5); HAL_ADC_Start(hadc1); HAL_ADC_PollForConversion(hadc1, 10); uint16_t value HAL_ADC_GetValue(); HAL_ADC_Stop(hadc1); return value; }这套修改之后用10kΩ源阻抗做测试读数从“完全不能用”变成了“误差稳定在5mV以内”。后来在运放跟随器后端再测误差更是小于1mV。这个坑的经验可以总结成一句大白话模拟开关切换后给信号链路一点“呼吸”时间再读数不要催它。4.2 坑2未选中通道悬空导致串扰读数乱跳还带“邻居效应”第二个坑比第一个更隐蔽如果只靠软件调试可能排查很久都定位不到根因。现象是这样16个通道里只接了12路传感器CH12到CH15四个通道因为暂时没有传感器就让它们悬着没有接任何线。程序里扫描完12个真实通道之后会顺带把这四个悬空通道的ADC值也打印出来做调试观察。打印结果让我非常困惑——悬空通道的数值在0到4095之间疯狂跳动完全没有任何规律。更离谱的是其中某一个悬空通道的读数会跟着相邻通道的电压变化而变化。比如我在CH12悬空、CH11上接了一个2.5V的电压源当我把CH11的电压调高到3V时CH12读到的值明显也跟着跳高了仿佛CH12和CH11之间有某种看不见的导线。最初的排查方向完全是冲着PCB去的。我怀疑是板上焊盘残留助焊剂导致漏电先用洗板水反复清洗又拿万用表测CH11和CH12两个焊盘之间的绝缘电阻测得兆欧级别的阻抗理论上不该造成那么明显的串扰。我也怀疑过是不是通道选择地址线毛刺导致开关瞬时误选通但逻辑分析仪上抓到的地址信号非常干净。后来查了CD74HC4067的数据手册在开关特性那一栏里有一项参数叫OFF-state isolation中文叫关断隔离度。这个参数描述的是开关断开状态下从输入到输出之间的信号泄漏程度。数据手册给出的典型值是1MHz条件下约-50dB看起来抑制比不算差但在悬空的高阻抗节点上这个泄漏信号已经足够产生肉眼可见的电压波动了。继续顺着这个思路分析当CH11被选通时CH11引脚上的信号通过芯片内部的寄生电容耦合到COM节点这部分信号是正常的。问题出在CH12这个“断开但悬空”的引脚上。CH12引脚本身与COM之间也有断开的MOS管和寄生电容当COM上的电压因为CH11信号而变化时CH12引脚会被反向感应出电压。因为CH12引脚悬空、没有外部负载把它拉到一个确定电位这个感应电压就自由地暴露在电场和噪声中读数自然乱跳。同时CH11和CH12两个引脚在芯片内部物理位置相邻它们之间也有微小的耦合电容这就解释了为什么CH12会跟随CH11的电压变化。找到根因后解决方案有两个层面。硬件层面最简单粗暴把所有暂时不用的通道引脚全部直接接地。如果这些通道未来还可能复用再在这根线上加一个100kΩ下拉电阻接地既能把悬空节点固定在已知电位又不会因为下拉电阻太小而影响将来接传感器时的信号精度。我最终在板上给每个未使用通道都预留了0欧姆电阻位需要启用时把电阻换成传感器线不用时让0欧姆电阻接地灵活处理。软件层面也做了一道保险轮询扫描时跳过所有未启用通道不让悬空通道的异常数据进入后续的电压计算和控制逻辑。因为即使硬件上全部接地了在量产板或调试过程中难免出现漏接、接触不良的情况软件屏蔽这道防线能兜底。这个坑给我最深的教训是模拟开关的“断开”和“隔离”是相对的永远不要把MOSFET断开状态想象成物理上的绝对开路更不要让高阻抗节点悬空着暴露在电磁环境中。5. 进阶优化与个人体会5.1 ADC偏移校正与三点校准CD74HC4067本身是模拟开关不引入增益误差但它前面信号链路上的分压电阻精度、运放失调电压、参考电压偏差都会叠加到最终结果上。单纯依赖ADC的12位分辨率很容易出现“采集值很稳定但绝对不准”的情况比如实际2.500V读回来只有2.470V。对于电压采集类应用推荐做一次“外部ADC三点校准”。具体做法是用精密电压源或者高精度万用表给信号链路输入三个已知电压点比如0.000V、1.650V和3.300V分别记录下对应的ADC原始值n0、n1、n2。如果ADC在三个点之间基本呈线性就做一个线性映射#define CAL_N1 2048 #define CAL_N2 4095 #define CAL_V1 1.650f #define CAL_V2 3.300f float AdcToVoltageLinear(uint16_t adc_raw) { float k (CAL_V2 - CAL_V1) / (float)(CAL_N2 - CAL_N1); float b CAL_V1 - k * CAL_N1; return k * (float)adc_raw b; }如果三个点的实测数据表明ADC本身存在明显非线性那就用两段线性拟合或者二次多项式拟合。分段线性拟合就是把0至n1、n1至n2两段分别求系数虽然处理逻辑多几行但12位ADC在这种场景下已经足够。校准之后的误差一般能控制在0.1%以内对于电池电压监测绰绰有余。5.2 对CD74HC4067扩展方案的几个扩展建议如果只是扩展低速模拟量通道CD74HC4067这套方案已经足够完善。但结合我这次的经验还有几点想补充一是关于扫描触发方式。如果你的主循环比较忙建议用定时器每20ms触发一次“全通道扫描”函数而不是在while循环里无脑轮询。这样可以保证每个通道的采样间隔相对均匀后续做滤波和变化率检测时数据质量会好很多。二是关于隔离和滤波。如果应用环境电磁干扰较强可以在CD74HC4067的COM输出端加一个小电容到地比如1nF构成简单的低通滤波对抑制毛刺有明显效果。注意电容不能太大否则又会显著增加建立时间回到坑1的坑里。三是对单片机选型的提示。如果MCU是GD32、AT32这类国产ARM核ADC外设结构和STM32基本类似上面的代码可以直接移植。唯一要注意的是个别型号需要在ADC转换前先执行校准否则零点偏移会比较明显这一点务必以具体型号的数据手册为准。5.3 最后再分享一点实操体会两个坑踩下来我最强烈的感受是模拟前端调试不能只靠软件逻辑推演示波器永远是第一排查工具。第一次遇到坑1的时候如果我没有直接看COM引脚的波形很可能会在ADC配置和DMA缓存上耗掉一下午。而坑2如果不去查数据手册里的关断隔离参数光靠软件屏蔽悬空通道也是治标不治本换了新板卡又会复现。另外一点是模拟多路开关的文档里那些看起来毫不起眼的参数比如Ron、关断隔离度、输入电压范围在实际电路里每一个都会变成真实存在的问题。选型的时候多花十分钟把数据手册的“开关特性”这一节啃完比上了板再折腾要划算得多。这套CD74HC4067扩展16路ADC的方案现在已经在我的板子上稳定跑了两个多月每天采集所有电池电压和温度数据稳定在预期精度范围内。后续如果需求变化比如某一路要改采样更高频的信号我会给那一串通道单独加一个ADC或者改用双多路开关并联的做法到那时候再写一篇新的调试笔记来记录。希望这篇分享能帮到正在调CD74HC4067或者其他模拟多路开关的朋友少走一点弯路。