STM32如何用74HC4067扩展16路ADC?手把手教你搞定多传感器采集
STM32如何用74HC4067扩展16路ADC手把手教你搞定多传感器采集在物联网和智能硬件项目中我们常常会遇到一个甜蜜的烦恼手头的传感器越来越多温度、湿度、光照、压力、气体浓度……每一个都需要一个“耳朵”去倾听但微控制器比如我们熟悉的STM32自带的ADC通道却只有寥寥数个。直接增加MCU成本太高频繁更换传感器接线又太笨拙。这时候一个叫做多路复用器的小芯片就能大显身手它就像一个高效的“交通指挥员”让一条ADC通道轮流为多个传感器服务。今天我们就来深入聊聊如何用一颗经典的74HC4067芯片为你的STM32轻松扩展出16路ADC采集能力从芯片原理、电路设计到代码实战一步步带你构建一个稳定可靠的多传感器数据采集系统。1. 认识我们的“交通指挥员”74HC4067芯片解析在开始动手接线和写代码之前我们有必要先和今天的主角——74HC4067——打个招呼彻底理解它的工作原理。这不仅能帮你正确使用它更能让你在遇到问题时快速定位。74HC4067本质上是一个16选1模拟多路复用器/解复用器。你可以把它想象成一个拥有16个入口I0-I15、1个公共出口COM的单向旋转门。控制信号S0-S3决定了此刻哪个入口与公共出口连通。它属于CMOS工艺工作电压范围宽2V到6V与STM32常见的3.3V逻辑电平兼容良好。注意市面上常见的还有CD74HC4067、CD74HCT4067等型号其核心功能相同主要区别在于输入电平阈值。HC系列适用于CMOS电平HCT系列则兼容TTL电平。对于STM32的3.3V GPIOHC系列是更直接的选择。芯片的引脚排列和功能是硬件设计的基础我们用一个表格来清晰呈现引脚符号引脚名称功能描述I0 - I15独立输入/输出16个独立的信号通道可以连接传感器输出。COM公共端公共输入/输出端连接至STM32的ADC引脚。S0 - S3地址选择线4位二进制地址输入用于选择16个通道之一。E (或 /E)使能端低有效当为低电平时芯片工作为高电平时所有通道断开。VCC电源接正电源推荐5V或3.3V需看具体型号支持。GND地接电源地。芯片工作的核心逻辑在于其真值表。通过给S0-S3四个引脚赋予不同的高低电平组合0000到1111我们可以唯一地选中I0到I15中的某一个通道使其与COM端导通。这个二进制编码非常直观选中I0: S3 S2 S1 S0 0 0 0 0选中I5: S3 S2 S1 S0 0 1 0 1 (5的二进制0101)选中I15: S3 S2 S1 S0 1 1 1 1 (15的二进制1111)而E引脚是整个芯片的总开关。通常我们将其直接接地低电平使芯片始终处于工作状态。如果需要软件控制整个多路复用器的开关则可以将其连接到一个GPIO引脚上。2. 从原理图到面包板硬件电路设计与搭建要点理解了芯片原理接下来就是动手搭建电路。一个可靠的硬件电路是数据采集准确性的基石。这里我们设计一个典型的应用电路并讨论几个关键细节。核心电路连接示意图传感器1 (Analog Out) ---- I0 of 74HC4067 传感器2 (Analog Out) ---- I1 of 74HC4067 ... (共16个传感器) 传感器16(Analog Out) ---- I15 of 74HC4067 COM of 74HC4067 ---- PA5 (ADC1 Channel 5) of STM32 S0 of 74HC4067 ---- PB0 (GPIO) of STM32 S1 of 74HC4067 ---- PB1 (GPIO) of STM32 S2 of 74HC4067 ---- PB2 (GPIO) of STM32 S3 of 74HC4067 ---- PB3 (GPIO) of STM32 E of 74HC4067 ---- GND (或连接至PB4用于软件使能) VCC of 74HC4067 ---- 3.3V (或5V需匹配) GND of 74HC4067 ---- Common GND在实际焊接或使用面包板搭建时以下这些要点往往决定了项目的成败电源去耦务必在74HC4067的VCC和GND引脚之间靠近芯片的位置并联一个0.1μF的陶瓷电容。这个电容的作用是滤除电源线上的高频噪声为芯片内部开关动作提供瞬间的电流补偿能显著提高通道切换的稳定性和模拟信号的完整性。信号完整性对于模拟信号路径从传感器到Ix从COM到STM32 ADC尽量保持走线简短并远离数字信号线如时钟线、高速通信线以减少耦合干扰。如果传感器距离较远考虑使用屏蔽线。电平匹配确保74HC4067的工作电压VCC与STM32的GPIO逻辑电平兼容。如果STM32是3.3V系统74HC4067也使用3.3V供电那么其数字输入高电平阈值约为2.1VSTM32的3.3V输出完全可以可靠驱动。如果使用5V供电的74HC4067则需要确认其输入高电平阈值是否低于3.3V查阅数据手册或者使用电平转换电路。未用通道处理如果不需要用满16个通道闲置的Ix引脚建议接地或接到一个固定的电压如通过大电阻接到VCC/2避免悬空引入随机噪声影响当前选通通道的信号。ADC输入保护在STM32的ADC输入引脚即COM端连接处可以串联一个几十欧姆的小电阻并并联一个对地的小电容如10pF~100pF构成一个简单的低通滤波器有助于抑制高频干扰和开关切换带来的毛刺。3. 软件驱动与通道切换逻辑硬件准备就绪后我们进入软件部分。STM32的程序需要完成两件事精确控制4个地址选择GPIO来切换通道以及配置并读取ADC的值。我们以STM32CubeIDE/HAL库为例进行讲解。首先我们需要初始化用于控制S0-S3的GPIO引脚。通常将它们设置为推挽输出模式。// 通道选择引脚定义 #define S0_PIN GPIO_PIN_0 #define S0_PORT GPIOB #define S1_PIN GPIO_PIN_1 #define S1_PORT GPIOB #define S2_PIN GPIO_PIN_2 #define S2_PORT GPIOB #define S3_PIN GPIO_PIN_3 #define S3_PORT GPIOB void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitStruct.Pin S0_PIN | S1_PIN | S2_PIN | S3_PIN; GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull GPIO_NOPULL; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, GPIO_InitStruct); // 初始状态可以选择关闭所有通道或选中通道0 HAL_GPIO_WritePin(S0_PORT, S0_PIN, GPIO_PIN_RESET); HAL_GPIO_WritePin(S1_PORT, S1_PIN, GPIO_PIN_RESET); HAL_GPIO_WritePin(S2_PORT, S2_PIN, GPIO_PIN_RESET); HAL_GPIO_WritePin(S3_PORT, S3_PIN, GPIO_PIN_RESET); }接下来编写一个核心函数用于根据通道号0-15设置S0-S3的电平状态。/** * brief 选择74HC4067的通道 * param channel: 要选择的通道号范围0-15 * retval None */ void Select_Mux_Channel(uint8_t channel) { if (channel 15) return; // 安全保护 // 逐位判断channel的二进制位并设置对应GPIO HAL_GPIO_WritePin(S0_PORT, S0_PIN, (channel 0x01) ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(S1_PORT, S1_PIN, (channel 0x02) ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(S2_PORT, S2_PIN, (channel 0x04) ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(S3_PORT, S3_PIN, (channel 0x08) ? GPIO_PIN_SET : GPIO_PIN_RESET); // 关键切换后需要延时等待多路复用器内部开关稳定 HAL_Delay(1); // 延时1ms对于大多数应用足够。可根据数据手册调整。 }这个函数清晰地将通道号映射到了4个控制引脚上。其中HAL_Delay(1)的延时至关重要它给了74HC4067内部模拟开关足够的时间来稳定导通避免在开关瞬态进行ADC采样导致读数错误。这个延时值可以依据数据手册中的“开关时间”参数进行微调通常1-10ms对于低速传感器采集已绰绰有余。ADC的配置以STM32F1的ADC1通道5对应PA5为例使用CubeMX生成或手动初始化即可这里不再赘述。重点在于采样流程的配合。4. 优化采样时序与提升采集精度实战基本的切换和采样功能实现后我们会追求更稳定、更精确的数据。这就涉及到采样时序的优化和精度的提升技巧。优化的多通道轮询采集流程一个健壮的采集循环不应该只是“切换-延时-采样”。考虑以下更优的流程切换目标通道调用Select_Mux_Channel(target_channel)。硬件稳定等待如前所述的1ms延时等待模拟开关稳定。丢弃首次采样值启动一次ADC转换并读取结果但这个结果丢弃不用。因为ADC输入端的采样保持电容可能还残留着上一个通道的电压第一次转换有助于使其稳定到新通道的电压。正式采样再次启动ADC转换读取并保存这个值作为有效数据。循环对下一个通道重复步骤1-4。uint16_t Read_Sensor_Value(uint8_t channel) { uint16_t adc_value 0; Select_Mux_Channel(channel); // 步骤1 HAL_Delay(2); // 步骤2延长稳定时间例如2ms HAL_ADC_Start(hadc1); HAL_ADC_PollForConversion(hadc1, 10); // 步骤3丢弃值 adc_value HAL_ADC_GetValue(hadc1); HAL_ADC_Start(hadc1); // 步骤4正式采样 HAL_ADC_PollForConversion(hadc1, 10); adc_value HAL_ADC_GetValue(hadc1); // 保存有效值 HAL_ADC_Stop(hadc1); return adc_value; }提升精度的额外措施软件滤波对同一个通道进行多次采样比如10次然后取平均值或中值能有效抑制随机噪声。参考电压确保STM32的ADC参考电压VDDA非常稳定。如果系统中有电机等噪声源建议使用独立的LDO为VDDA和VSSA供电并加上LC滤波。阻抗匹配74HC4067在导通时有一定的导通电阻Ron典型值几十到上百欧姆。如果传感器输出阻抗很高如某些光电传感器Ron与传感器输出阻抗会形成分压导致测量电压低于实际值。解决方案是选择Ron更小的模拟开关芯片。在COM端和STM32 ADC之间加入一个电压跟随器运算放大器利用运放高输入阻抗、低输出阻抗的特性隔离多路复用器的影响这是最推荐的做法。提示如果你发现切换通道后ADC读数总是有上一个通道的“影子”或者读数不稳定首要检查的就是稳定延时是否足够以及是否加入了“丢弃首次采样”的步骤。5. 超越基础高级应用与故障排查当你掌握了基本用法后可以尝试一些更进阶的应用模式并了解如何排查常见问题。应用模式扩展双向模拟信号切换74HC4067是双向的。除了将多路传感器输入切换到单个ADC你也可以将单个DAC输出切换到多个目标设备。级联扩展更多通道如果需要超过16路可以使用两片或多片74HC4067进行级联。例如用第一个多路复用器的COM端连接第二个多路复用器的每个I端再用一个额外的地址线来选择使用哪一片芯片理论上可以扩展出16*16256路但控制逻辑和延时会更复杂。与数字传感器混合使用虽然我们主要讨论ADC但74HC4067同样可以切换数字信号如I2C、SPI总线实现多个同地址数字传感器共享一组MCU引脚。不过需要注意信号速度因为模拟开关的带宽有限。常见故障排查清单遇到问题不要慌可以按以下顺序检查电源与地用万用表测量74HC4067的VCC和GND引脚电压是否正确、稳定。控制信号用逻辑分析仪或示波器观察S0-S3和E引脚的电平在切换通道时是否符合预期的二进制变化。确保GPIO初始化正确。通道导通性选中一个通道如通道0。在该通道的I0引脚接入一个已知电压如通过电阻分压得到的1.65V。测量COM引脚电压是否与I0引脚电压基本一致考虑导通电阻的微小压降。切换到其他通道该电压应消失再切回通道0电压应恢复。ADC读数直接在COM引脚连接一个可调电压源绕过74HC4067测试STM32的ADC本身是否工作正常。时序问题如果读数偶尔错误尝试增加Select_Mux_Channel函数中的稳定延时或者检查在切换通道和启动ADC采样之间是否有其他高优先级中断打断了时序。在我自己的一个环境监测节点项目中最初采集的土壤湿度传感器数据总是跳变。后来用示波器一看发现切换通道后COM端的电压需要近5ms才能完全稳定到新电压。将稳定延时从1ms调整到8ms后数据立刻变得平滑稳定。这个经历让我深刻体会到对于模拟电路耐心和细致的测量往往比代码调试更重要。通过以上五个部分的拆解我们从芯片原理、硬件搭建、软件驱动、精度优化到进阶调试完整地走通了使用74HC4067扩展STM32 ADC通道的全流程。希望这份指南能帮助你顺利搞定多传感器采集让你的嵌入式项目感知能力更上一层楼。如果在实际搭建中遇到独特的问题或有什么巧妙的用法不妨多动手试试硬件世界的乐趣往往就藏在解决这些具体问题的过程之中。

相关新闻

10xGenomics单细胞测序实战:从原始数据到细胞注释的完整流程解析

10xGenomics单细胞测序实战:从原始数据到细胞注释的完整流程解析

10xGenomics单细胞测序实战:从原始数据到细胞注释的完整流程解析 当你第一次拿到10x Genomics单细胞测序下机的原始数据时,面对那些以.bcl为后缀的庞大文件,以及后续一连串听起来有些陌生的术语——cellranger、Seurat、UMAP、cluster——是不…

2026/7/3 23:47:05 阅读更多 →
从MessageGraph源码看LangGraph设计哲学:消息驱动架构如何简化对话系统开发

从MessageGraph源码看LangGraph设计哲学:消息驱动架构如何简化对话系统开发

从MessageGraph源码看LangGraph设计哲学:消息驱动架构如何简化对话系统开发 如果你正在构建一个需要处理复杂对话流的AI应用,比如一个能处理多轮问答、支持上下文切换、甚至能整合外部工具调用的智能客服机器人,那么你很可能已经体会过状态管…

2026/7/3 21:49:58 阅读更多 →
终极指南:如何构建高可用分布式DNS服务器系统

终极指南:如何构建高可用分布式DNS服务器系统

终极指南:如何构建高可用分布式DNS服务器系统 【免费下载链接】iroh Sync anywhere 项目地址: https://gitcode.com/GitHub_Trending/ir/iroh 在现代网络架构中,DNS(域名系统)作为连接用户与互联网服务的关键基础设施&…

2026/7/4 11:47:48 阅读更多 →

最新新闻

hexo-tag-aplayer从入门到精通:构建博客音乐系统的完整路线图

hexo-tag-aplayer从入门到精通:构建博客音乐系统的完整路线图

hexo-tag-aplayer从入门到精通:构建博客音乐系统的完整路线图 【免费下载链接】hexo-tag-aplayer Embed aplayer in Hexo posts/pages 项目地址: https://gitcode.com/gh_mirrors/he/hexo-tag-aplayer hexo-tag-aplayer是一款强大的Hexo标签插件,…

2026/7/5 18:35:29 阅读更多 →
网盘直链下载助手完整指南:一键获取八大网盘真实下载地址的终极解决方案

网盘直链下载助手完整指南:一键获取八大网盘真实下载地址的终极解决方案

网盘直链下载助手完整指南:一键获取八大网盘真实下载地址的终极解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中…

2026/7/5 18:33:28 阅读更多 →
如何扩展Runno:添加自定义编程语言运行时的完整指南

如何扩展Runno:添加自定义编程语言运行时的完整指南

如何扩展Runno:添加自定义编程语言运行时的完整指南 【免费下载链接】runno Sandboxed runtime for programming languages and WASI binaries. Works in the browser, on your server, or via MCP. 项目地址: https://gitcode.com/gh_mirrors/ru/runno Runn…

2026/7/5 18:33:28 阅读更多 →
对字符串排序的影响

对字符串排序的影响

字符串的大小比较并不是如C那样按照字符串字符内码大小顺序从头到尾来比较的。由于我是从C/C转过来的,我一直以来都以为.net 下字符串的比较规则和C是一样的,直到有一天我的程序在英文操作系统下出错。 .net 下,字符串的排序受 System.Threa…

2026/7/5 18:29:28 阅读更多 →
Runno高级调试技巧:解决复杂代码执行问题的完整方法

Runno高级调试技巧:解决复杂代码执行问题的完整方法

Runno高级调试技巧:解决复杂代码执行问题的完整方法 【免费下载链接】runno Sandboxed runtime for programming languages and WASI binaries. Works in the browser, on your server, or via MCP. 项目地址: https://gitcode.com/gh_mirrors/ru/runno Runn…

2026/7/5 18:29:28 阅读更多 →
Instatic集群部署:负载均衡与会话共享配置指南

Instatic集群部署:负载均衡与会话共享配置指南

Instatic集群部署:负载均衡与会话共享配置指南 【免费下载链接】Instatic Instatic is a modern self-hosted visual CMS - get it running in 1 minute 项目地址: https://gitcode.com/GitHub_Trending/in/Instatic Instatic作为一款现代自托管视觉CMS&…

2026/7/5 18:25:26 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻