新闻详情

新闻详情

首页 / 资讯中心 / 详情

基于CD74HC4067的STM32多路ADC扩展方案与调试经验

发布时间:2026/9/8 8:14:24来源:尧图网络
基于CD74HC4067的STM32多路ADC扩展方案与调试经验
最近做了一块多路传感器采集板MCU 用的是 STM32F103C8T6片上有 10 个 ADC 通道听起来够多但实际项目要接 6 路温度、4 路光敏、6 路电位器一共 16 路模拟输入ADC 通道直接不够用。折腾了一圈最后用 CD74HC4067 这个 16 通道模拟开关把单个 ADC 扩展成了 16 路输入方案不算复杂但调试过程中踩了两个特别隐蔽的坑一个跟采样时序有关一个跟信号串扰有关排查起来真的让人头大。这篇文章把原理、接线、驱动和这两个坑完整记录下来给准备用 CD74HC4067 做多路采集的朋友当个参考。CD74HC4067 说白了就是一个“十六选一”的模拟开关用 4 根地址线控制公共端接到哪一路输入上。配上 MCU 自带 ADC只需要占用 4 个 GPIO 加 1 个 ADC 引脚就能把采集通道数从 10 路扩到 16 路成本也就一两块钱。适合那些对采样速率要求不高、但对通道数量有硬性需求的项目。如果你也在纠结“ADC 通道不够用”的问题建议先看完这篇再决定要不要用这个方案。1. 为什么选了 CD74HC4067 而不是换 MCU 或加独立 ADC 芯片1.1 场景16 路模拟量10 个 ADC 通道先说项目背景。我手头这块板子的模拟信号分成三类温度传感器输出的是几伏以内的慢变电压信号光敏电阻是分压网络输出电位器是纯电阻分压。三类信号都不快温度变化用秒甚至分钟算光敏也就是几十毫秒级别的变化电位器本来就是人手拧的更慢。按理说这种慢速信号对 ADC 采样速率没有压力STM32F103 的 ADC 跑几 kHz 采样绰绰有余。真正的问题只有一个通道数量不够。芯片有 10 个 ADC 输入引脚但实际项目需要 16 路多出来的 6 路没地方接。另外还考虑到系统里还需要几个 PWM 输出、串口、I2C如果为了 6 个通道就换大封装芯片PCB 要重新画引脚复用也要重新规划工作量不小。乍一看有三种出路换一个 ADC 通道更多的 MCU、外挂独立多通道 ADC 芯片、用模拟开关扩展现有 ADC。我最终选了第三种原因后面细说。1.2 三种方案的取舍方案一换成通道更多的 MCU。比如换 STM32F103ZET6有 16 个引脚听起来刚好够但代价是小板子变四层板引脚密度也上来了手焊难度直线上升。而且项目里其他外设并不需要那么多引脚为了 ADC 换大芯片后期布线成本、采购成本、焊接成本都往上走不划算。方案二外挂独立 ADC 芯片。比如 ADS1115 这类 16 位 I2C 接口 ADC一个芯片 4 通道要接 16 路就得 4 颗成本直接翻好几倍。优势是分辨率高、信号调理好但对于这种慢速传感器信号12 位 ADC 已经够用没必要为用不上的精度买单。另外 I2C 总线上挂 4 个从设备地址还要用 ADDR 引脚做区分软件复杂度也上来了。方案三CD74HC4067 模拟开关扩展。这颗芯片负责“选路”把 16 路输入轮流切到 MCU 唯一的 ADC 引脚上。MCU 端只需要一个 ADC 通道加 4 个 GPIO硬件改动小成本几毛钱一片软件上就是“切通道、延时、读 ADC”三个动作的循环。唯一的技术限制是模拟开关有导通电阻和建立时间但前面说了信号都是慢变信号这个限制完全能接受。三种方案对比方案成本硬件改动软件复杂度通道数适合场景换大 MCU高重画 PCB不变取决于芯片引脚需求多、资源长期扩展外挂独立 ADC高增加器件中可级联高精度、隔离场景CD74HC4067低加一颗芯片低16 路中低速多通道采集用了一颗 CD74HC4067原本 10 路 ADC 直接变成 16 路GPIO 占用也不多。如果你只是需要更多通道去测慢变信号这个方案是我目前觉得性价比最高的。2. CD74HC4067 的工作原理与关键参数先弄懂再用2.1 内部结构就是“十六选一”模拟开关CD74HC4067 的供应商很多TISN74HC4067、NXP74HC4067、国产的 HC4067 都有功能完全一样。内部结构是一个 16 通道单端模拟多路复用器带 4 位二进制译码器。外部一共有 16 个输入/输出引脚Y0 到 Y15一个公共引脚COM4 根地址选择线S0 到 S3还有一个低电平有效的使能引脚 EN。工作原理特别朴素S0 到 S3 组成 4 位二进制数决定 COM 引脚与哪个 Y 引脚导通。比如 S3S2S1S0 0000 时 COM 接 Y0 0001 时接 Y1以此类推 1111 时接 Y15。EN 引脚接高电平时所有通道全部断开接低电平时正常工作。需要特别注意的是CD74HC4067 是一个双向模拟开关信号可以从 Y 端流向 COM也可以从 COM 流向 Y。甚至可以拿它当多路分配器用把一路信号分给 16 路中的任意一路。在这个项目里我们只用了“多路输入 - 公共端 - ADC”这一个方向但理解双向特性有助于排查问题。真值表如下S3S2S1S0接通的通道0000Y00001Y10010Y20011Y3...............1111Y152.2 必须理解的几个参数导通电阻、建立时间、漏电流这颗芯片的参数比较多但真正影响采集精度的就三个导通电阻、切换建立时间、关断漏电流。把这三个弄明白后面踩坑时才知道问题出在哪。导通电阻RON电源电压 4.5V 时典型值在 40 到 120 欧姆之间。这意味着信号从 Y 端到 COM 端会穿上一只几十到上百欧姆的“电阻”。如果信号源内阻很低比如运放输出这几十欧姆几乎不影响精度如果信号源内阻有几十千欧比如直接接光敏电阻分压网络那这几十欧姆就会和源内阻构成分压产生误差。切换建立时间地址线变化后模拟开关并不是瞬间完成导通存在几十纳秒到几百纳秒的开关延时。但由于整个信号链上还有源阻抗和电容实际“信号稳定”需要的时间远比芯片本身的开关延时更长。这也是我踩的第一个坑的核心原因后面详细展开。关断漏电流理想情况下没有选中的通道与 COM 之间是断开的但实际存在纳安级别的漏电流。漏电流本身很小可是如果信号源内阻很高微小的漏电流就会在源阻抗上产生压降造成读数偏移。多路信号之间的串扰有一部分就是漏电流贡献的。参数典型值影响导通电阻 RON40~120Ω高阻源会形成分压误差切换建立时间几十 ns~几百 ns软件需要留建立延时关断漏电流nA 级高阻源上产生电压偏移2.3 信号链路模型从传感器到 ADC 采样电容把 CD74HC4067 放进信号链路后一条采集通路从传感器到 ADC 内部大致是这样的传感器输出 - 导线/PCB走线 - Y 引脚 - 模拟开关 RON - COM 引脚 - 导线 - MCU ADC 引脚 - ADC 内部采样电容关键点在于 ADC 采样并不是瞬间完成的。STM32 内部的采样保持电路有一个几 pF 到十几 pF 的采样电容ADC 在采样阶段要把这个电容充电到输入电压值。充电速度取决于“信号源等效阻抗”和“采样电容”组成的 RC 时间常数。信号源等效阻抗 传感器输出阻抗 线路阻抗 模拟开关导通电阻。假设传感器输出阻抗是 10kΩRON 是 70Ω采样电容按 10pF 算RC 时间常数大约是 (10k70) × 10pF ≈ 0.1us。理论上 5 个时间常数也就是 0.5us 就能稳定但实际电路里还有 PCB 寄生电容、外部滤波电容、开关本身的非线性阻抗情况比这个理想模型复杂得多。所以不要以为“切换地址后立刻启动 ADC”就行留出足够的建立时间是保证精度的大前提。3. 硬件接线与 PCB 布局的实操细节3.1 完整接线参考我实际使用的接线非常简单列在这里供参考CD74HC4067 的 S0~S3 接 MCU 的 4 个 GPIOPA0~PA3EN 引脚直接接地注意这个千万别悬空后面会专门说COM 引脚接 MCU 的 ADC 输入引脚我用了 PA4Y0~Y15 分别接 16 路传感器输出VCC 接 3.3VGND 接系统地还有一个版本支持双电源供电VEE 引脚可以接负电源用来处理交流信号但项目里全是正电压VEE 直接接地就行。地址线最好接在 GPIO 上而不是外部跳线因为软件要用 GPIO 快速切换通道。GPIO 配置为推挽输出速度不用太快普通模式即可。接线时把地址线和模拟输入线分开走尽量别平行走太远避免数字信号影响模拟信号。3.2 去耦、滤波与地线处理芯片电源附近必须放一个 0.1uF 的去耦电容位置越靠近 VCC 和 GND 引脚越好。很多新手忽略这个小电容导致 ADC 读数毛刺大在低速采集时还能忍一旦把切换频率提上去电源噪声会被调制进信号里具体表现就是读数按照切换顺序规律性波动。每个 Y 通道对地加一个 1nF 到 100nF 的滤波电容。这个电容有双重作用一是滤掉传感器线上的高频噪声二是降低信号源的高频输出阻抗抑制串扰。但要注意加了电容之后通道建立时间会更长软件延时必须同步加大。我的经验是10kΩ 输出阻抗的传感器配 100nF 电容约需要 1ms 才能完全建立如果延时不够读到的电压会偏低。地线处理上模拟地、数字地建议单点接地。如果实在没法分割地平面至少保证 ADC 公共端、传感器地、芯片 GND 汇聚到同一个参考点避免地线上形成几十毫伏的压差影响低电压信号的精度。3.3 输入电压范围与保护CD74HC4067 的模拟输入范围是 VCC-0.5V 到 VCC0.5V 这个区间。也就是 3.3V 供电时输入电压超过 3.8V 就可能损坏芯片。使用前一定确认传感器输出不会超过这个范围。如果信号可能超压在 Y 引脚输入端串联一个 1kΩ 电阻同时并联一个肖特基二极管到 VCC 和 GND做简单限幅保护。另外默认情况下所有未选中的通道输入引脚是悬空的。如果传感器输出是高阻类型的空脚电压会不稳定导致漏电流在内部乱串。实际做法是给不用的输入通道统一接 GND或者接一个固定电平避免浮空。4. 软件驱动16 通道轮询扫描的实现4.1 引脚与地址映射软件逻辑很简单4 个地址 GPIO 组合出 0~15 的编号选通对应通道后启动一次 ADC 转换。但代码组织上有些细节值得记录。首先是地址映射。S0~S3 对应二进制的最低位到最高位所以void mux_select_channel(uint8_t ch) { HAL_GPIO_WritePin(S0_GPIO_Port, S0_Pin, (ch 0x01) ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(S1_GPIO_Port, S1_Pin, (ch 0x02) ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(S2_GPIO_Port, S2_Pin, (ch 0x04) ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(S3_GPIO_Port, S3_Pin, (ch 0x08) ? GPIO_PIN_SET : GPIO_PIN_RESET); }这里用的是位与操作直接根据通道号二进制位控制对应引脚电平避免了手写 16 组分支的笨办法。后面如果要加通道改一个循环边界就行。4.2 驱动代码一次完整的通道读取读取一个通道的完整流程是选通道 - 延时等待建立 - 启动 ADC - 等待转换完成 - 读取数值。我封装成下面这个函数uint16_t mux_read_adc_channel(uint8_t ch) { mux_select_channel(ch); delay_us(100); HAL_ADC_Start(hadc1); HAL_ADC_PollForConversion(hadc1, 10); uint16_t value HAL_ADC_GetValue(hadc1); HAL_ADC_Stop(hadc1); return value; }HAL_ADC_Start 和 HAL_ADC_Stop 每次转换都用因为需要一次性读取不同通道的复用数据不配合 DMA 时这种做法最直观。如果配置了 ADC 连续转换模式也可以不反复调 Start/Stop但要注意连续模式下读取到的是当前引脚上的实时值切换 MUX 后同样要等建立时间否则容易读到上一个通道的残余信号。延时 100us 是我综合实测后的保守值。具体要不要这么久取决于传感器输出阻抗。低阻抗源比如运放缓冲输出20us 就够高阻抗源比如 100kΩ 分压器可能需要 500us 甚至更长。建议先用一个已知电压做标定从短延时开始逐步加找到读数稳定的临界点再留 2 到 3 倍余量。4.3 扫描周期与性能估算16 路轮询一次的总耗时由三部分构成地址切换时间 建立延时 ADC 转换时间。ADC 转换时间跟配置的采样周期和 ADC 时钟有关以 STM32F103 为例ADCCLK 12MHz 时不同采样周期对应的单通道时间大致如下采样周期配置单通道转换时间16 路理论扫描时间不含建立延时7.5 cycles约 1.6us约 26us55.5 cycles约 5.7us约 91us239.5 cycles约 21us约 336us就算选了最长的 239.5 个周期加上每通道 100us 的建立延时16 路总耗时大概 1.9ms。对于温度、光敏、电位器这类信号这个速度绰绰有余。如果你需要更高采样率可以把建立延时缩短或者改用 DMA 配合定时器触发让 ADC 在通道切换后自动采样把 CPU 解放出来。5. 两个调试坑踩完给你填平5.1 坑 1切换通道后立即采样读到的值不对现象第一版驱动代码里我切完通道只加了一点延时大概 5us就启动 ADC结果发现所有通道的读数都比实际值偏低而且数值不稳定来回跳。用万用表直接量 Y 引脚电压是 2.50V但读出来的 ADC 值换算后只有 2.30V 左右差了近 200mV。排查过程当时第一反应是接线问题拿万用表量了 COM 引脚发现电压确实被拉低了。于是怀疑是芯片坏了换了一片新的症状依旧。后来把传感器断开用一个 10kΩ 可调电阻分压做测试源把源阻抗从低到高调发现读数偏差跟着源阻抗变大而变大。这才反应过来问题出在建立时间不足。根因分析选通通道后信号源需要通过“源阻抗 导通电阻”给 ADC 内部采样电容和外部寄生电容充电。源阻抗越高、外部电容越大充电越慢。我用了 5us 的延时10kΩ 源阻抗配合外部 100nF 滤波电容时间常数是 1ms5us 连稳定值的零头都没到。ADC 采样阶段读到的是一个还没有充到位的电压自然偏低。解决先把每通道建立延时加到 100us读数立刻正常。后来又调整了外部滤波电容从 100nF 改成 10nF延时可以缩短到 50us扫描速率也上来了。经验总结地址切换后必须给出足够的建立时间具体多少不是拍脑袋定的要看信号源阻抗和负载电容外部滤波电容不是越大越好它和建立时间是一对矛盾体调试时用可调电源或分压器配合高精度万用表做参考能快速区分是电路问题还是时序问题5.2 坑 2多路接满后互相串扰读数飘得离谱现象只接一路传感器时一切正常把 16 路全部接上之后各路读数之间出现明显相互影响。具体表现是调节其中一路电位器相邻几路的读数会跟着跳动有些通道甚至稳定不下来。排查过程先怀疑是软件逻辑问题把 MUX 地址切换改成手动切换信号源测试发现即使不切换只读固定一路把另一路电位器转一圈这一路的读数也会波动。这说明不是软件时序问题而是物理层面的串扰。用示波器探头点在 COM 引脚上能看到其他通道的信号通过寄生电容耦合过来在公共端形成微小毛刺。根因分析问题有三个层面。第一未选中的 Y 通道与 COM 之间存在寄生电容几 pF 级别高频信号或快速变化的信号会通过电容耦合过来。第二未选中的通道有漏电流虽然只有 nA 级但配合高阻抗信号源会产生不可忽略的压降。第三也是最容易被忽略的多个传感器的模拟地都接到同一条细长走线地线上形成共阻抗耦合一路的变化会通过地线影响其他路。解决针对三个层面分别处理。输入侧给每个 Y 通道加对地滤波电容我用的是 10nF既抑制高频串扰又不过分拖慢建立时间。软件上适当增加建立延时保证切换后信号完全稳定。PCB 布局上把模拟地加宽传感器单独走地线到公共接地点数字地址线和模拟输入线拉开距离。这样处理之后串扰基本消失相邻通道的干扰从几十 mV 降到了 2mV 以内。5.3 顺带提醒EN 引脚悬空这个低级坑这个坑不是我自己踩的是帮一个同事排查问题时发现的但很典型必须提一嘴。EN 引脚是低电平有效内部没有上下拉悬空时电平不确定。可能是高也可能是低还可能是中间态。结果就是芯片时而工作、时而不工作插上调试器状态还不一样神出鬼没。解决方式特别简单EN 直接接 GND如果希望软件能控制开关接一个 GPIO 并在初始化时输出低电平。千万别悬空。这个问题排查起来很烦人因为故障表现不固定容易被误判成芯片损坏。6. 常见问题排查速查表根据这段时间的调试经验和帮人排查遇到的情况整理了一个问题速查表方便你对照排查。现象可能原因解决办法所有通道读数都偏低建立时间不足加大切通道后的延时读数跳变、不稳定电源去耦不良在 VCC 引脚附近加 0.1uF 电容多路接满后读数互相影响通道间串扰每个 Y 通道对地加 10nF 电容模拟地加宽某个通道始终为 0地址线接触不良或接错用万用表量 S0~S3 对应 GPIO 电平所有通道都不工作EN 引脚悬空或接高电平EN 接地或 GPIO 置低高阻抗源时读数偏差大导通电阻分压加电压跟随器或做软件校准读数随 CPU 频率变化采样时序受干扰配置 ADC 时增加采样周期切换顺序导致周期性偏差未等信号建立就采样按扫描顺序统一加延时排查时我习惯先把系统简化只接一路已知电压源通过软件选中对应通道看读数是否准确如果准确再逐步增加通道找触发变化的那一路。这种二分法定位串扰源特别快比瞎猜效率高得多。最后再分享一个小细节我在工程里把建立延时做成了宏定义方便不同的板卡调整。传感器源阻抗不同建立延时差异可能非常大同类板卡我也见过 10us 到 2ms 的差距。建议拿到板卡先拿一路已知电压测一遍找到稳定临界值再留余量别一开始就给一个固定的 100us 就以为万事大吉。CD74HC4067 本身不复杂真正决定成败的是信号链上那些看不见的电容、漏电和时序细节。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

DevExpress VCL 20.2.6在Delphi 11上的安装全攻略与踩坑记录 2026/9/8 10:36:05

DevExpress VCL 20.2.6在Delphi 11上的安装全攻略与踩坑记录

简介:面向中高级 VCL 桌面开发者,DevExpress VCL 20.2.6 控件安装包专为 Delphi 11 及更高版本准备,解决升级 IDE 后原有控件库无法编译、安装繁琐或国内资源真假混杂的问题。压缩包采用 7z 格式,体积约 473.21MB,内置…

阅读更多 →
Xtreme ToolkitPro v17.2.0 源码编译与MFC集成实战指南 2026/9/8 10:36:05

Xtreme ToolkitPro v17.2.0 源码编译与MFC集成实战指南

简介:Xtreme ToolkitPro v17.2.0 源代码包是一套成熟的界面工具集源码,面向希望深入理解工具集内部实现的 C/C# 开发者,可用于学习控件库架构、分析渲染机制,并结合实际项目定制和扩展功能。压缩包共 12111 个文件、约 62.52MB&am…

阅读更多 →
无线通信网络仿真课程设计全攻略:从OFDM链路到报告答辩 2026/9/8 10:36:05

无线通信网络仿真课程设计全攻略:从OFDM链路到报告答辩

简介:西南交通大学无线通信网络仿真期末课程设计资料包,面向通信工程方向学生,用于掌握无线通信原理、网络仿真搭建与性能分析方法。内容涵盖无线传播特性、调制编码、多径效应、网络拓扑(点对点、Wi-Fi、4G/5G蜂窝)、…

阅读更多 →
C盘深度清理实战:用系统自带工具和命令脚本安全释放空间 2026/9/8 10:36:05

C盘深度清理实战:用系统自带工具和命令脚本安全释放空间

C盘又飘红了,工作到一半弹磁盘空间不足,打开资源管理器一看C盘只剩几个GB,这是很多Windows用户都经历过的场景。很多人第一反应是下载一款“一键清理”软件,点一下“深度清理”,看着进度条跑完以为就万事大吉。但实际情…

阅读更多 →
米家KFR-26GW新一级能效空调:选型、安装与省电实测指南 2026/9/8 10:36:05

米家KFR-26GW新一级能效空调:选型、安装与省电实测指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
e稿是什么 一站式AI论文写作工具核心能力全方位科普 2026/9/8 10:33:05

e稿是什么 一站式AI论文写作工具核心能力全方位科普

本文速览本文围绕e稿的定位、资质、核心功能、差异化优势、实测效果及使用方法展开科普,适用于学生、医护、高校教师、科研从业者等有学术写作需求的人群。e稿是吉林省睿安未来科技有限公司自主研发的一站式AI论文写作软件,覆盖从拟题到降重的全流程学术…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞