一根线监测五路电流和电压:DAC 芯片的 MUX 引脚妙用(省引脚绝招) tags: 嵌入式,DAC,ADC,MUX,引脚复用,模拟电路 category: 嵌入式 type: original series: peripheral-practice一根线监测五路电流和电压DAC 芯片的 MUX 引脚妙用省引脚绝招一句话: 要监测 5 路模拟信号不用接 5 根线到 5 个 ADC 通道。利用 DAC 芯片的 MUX 引脚一根线轮流输出各路电压/电流占一个 ADC 口就搞定——省引脚、省布线、省 ADC 资源。系列文章《嵌入式外设实战》 — NTC测温、SPI通信、I2C从机、定点数运算——外设驱动从入门到精通 附完整代码 用文件柜抽屉讲透 用分和元讲透附代码 ✅ 省引脚绝招问题监测点太多ADC 口不够有一块板子需要监测多路输出通道的电流和电压加起来 10 个模拟量。但 ADC 芯片只有 8 个输入口其中几个还分给了温度和供电监测。剩下的口不够用。再换一颗多通道 ADC加钱、改板子、重新布线。解法有些 DAC 自带 MUX 输出驱动输出的是一个多通道电流型 DAC。翻它的数据手册你会发现一个叫MUX_OUT或者MONITOR_OUT的引脚。这个引脚内部接了一个多路复用器MUX可以把任意一个通道的电压或电流值切到这个引脚上输出DAC 芯片内部 CH0 → 输出 0 → 负载 CH1 → 输出 1 → 负载 CH2 → 输出 2 → 负载 CH3 → 输出 3 → 负载 CH4 → 输出 4 → 负载 │ └── MUX 选择器 ──→ MUX_OUT 引脚 (只占用 1 个 ADC 输入口) │ ├── 选 CH0: 输出 CH0 的电压/电流 ├── 选 CH1: 输出 CH1 的电压/电流 ├── ... └── 选 CH4: 输出 CH4 的电压/电流5 个通道只占 ADC 的 1 个输入口。怎么用第一步SPI 写寄存器切换 MUX 通道// 设置 MUX 输出当前选中哪个通道 // 具体命令格式看芯片数据手册的 MUX 控制寄存器 void MUX_SelectChannel(uint8_t u8Ch) { // 写 DAC 的 MUX 控制寄存器 SPI_Write(CMD_MUX_SELECT, u8Ch); }第二步等一小段时间MUX 切换后输出电路需要几微秒建立。不需要死等——设完就走下一个周期再来读输出早就稳了。第三步ADC 读值uint16_t ADC_ReadChannel(uint8_t u8Ch) { MUX_SelectChannel(u8Ch); // 切过去 // 等稳定靠主循环周期保证不用 delay return ADC_Read(ADC_MUX_INPUT); // 固定从这个 ADC 口读 }轮询调度这次读上次这次切下次#define MUX_CH_COUNT 5 void Monitor_Run(void) { static uint8_t s_u8MuxCh 0; // 1. 先读上一个通道的 ADC 值经过了一个周期已经稳定了 g_au16Monitor[s_u8MuxCh] ADC_Read(ADC_MUX_INPUT); // 2. 切换到下一个通道 s_u8MuxCh; if (s_u8MuxCh MUX_CH_COUNT) s_u8MuxCh 0; MUX_SelectChannel(s_u8MuxCh); }关键设计这次读的是上次切的那路这次切的那路下次读。不需要 delay不阻塞主循环。每个通道被读到的间隔 通道数 × 主循环周期。如果每 10ms 调度一次5 通道就是 50ms 刷新一次——对于监测来说完全够用。换算MUX 读数 → 物理量MUX 输出的是电压值需要根据芯片的换算公式转成实际的电流或电压// 不同芯片的换算系数不同查数据手册 // 常见模式: V_mux 偏置电压 实际电流 × 系数 int16_t MUX_Value_to_Physical(uint16_t u16Adc, float fOffset, float fScale) { // ADC 码值 → 电压 float v_mux (float)u16Adc / 4095.0f * 5.0f; // 去偏置除系数得到实际值 float fPhysical (v_mux - fOffset) / fScale; // 转为整数如 mA 单位放大 1000 倍 return (int16_t)(fPhysical * 1000.0f); }没有硬件 FPU 可以用定点算法替代。为什么这个技巧值得学不用 MUX用 MUX10 个 ADC 通道1 个 ADC 通道10 根信号线1 根信号线需要大颗多通道 ADC最普通的 ADC 就够MCU 引脚紧张省下引脚给别的功能对于引脚紧缺的嵌入式系统这就是硬件级别的节约。不止电流型 DAC 有 MUX翻翻你手头芯片的手册以下都有可能有 MUX 输出多通道电流/电压 DACTEC 控制器多路电源管理 IC带监测输出的负载开关很多芯片设计时就考虑到了用户可能要监测只是你从来没注意过这个引脚。总结要点说明原理芯片内置 MUX一个 pin 轮流输出各通道的监测值调度这次读上次切的这次切下次读的不阻塞省什么ADC 口、布线、MCU 引脚代价多一次 SPI 写 几微秒稳定时间没事翻一下芯片数据手册看看有没有 MUX 引脚——省引脚的路硬件已经给你铺好了。实测对比不用MUX: 10根线10个ADC口 | 用MUX: 1根线1个ADC口省 90% 资源有用的话点个收藏下次调试直接用。有问题欢迎评论区交流看到了都会回。下一篇《附完整代码》——NTC测温、SPI通信、I2C从机、定点数运算——外设驱动从入门到精通