DAC监控脚读数不跟手?四个坑层层叠加的排查全记录
2026/8/7 18:53:13 网站建设 项目流程

一句话: MUX监测读数不随电流变化,排查踩了四个坑:控制引脚没初始化、悬空通道漂移、万用表恒3.3V,最后靠回读+全码扫描反推定位到编码位序错误。芯片和硬件从头到尾都是好的。

适合谁读:用带监控脚的DAC/电流源芯片、遇到"读数不跟手/恒为固定电压"的嵌入式工程师。

现象:MUX 读数完全不跟手

一块激光驱动板,五通道电流 DAC 驱动激光二极管和光放大器,靠内部监控引脚(MUX)轮流输出各通道电压/电流,接 16 位 ADC 采样。

现象很奇怪:

  • 设通道电流 0 → 300mA 阶梯,MUX 读数几乎不动
  • 切参考电压(应 1.25V)、电源轨(应 3.3V)这些已知电压通道,读数全部收敛到同一个值
  • 万用表测 MUX 引脚:恒 3.29V(≈电源电压),怎么切通道都不变

换成另一块板子,现象一样。看起来铁定是硬件问题。

坑一:芯片的控制引脚根本没初始化

排查从最小测试工程开始——只保留 DAC + ADC + 串口。换板子后才发现:这个测试工程从没初始化过芯片的控制引脚。

主项目里片选、清除、加载这几个 GPIO 是在另一个初始化函数里配的,测试工程精简时没调用它。结果:片选引脚复位后浮空输入,电平不定——SPI 命令从未被芯片接收。SPI 命令发得再对,片选没拉对,芯片一个字都收不到。

修法:初始化片选/清除/加载引脚(推挽输出 + 正确初始电平)。

经验:精简测试工程最容易漏的就是"别人顺手初始化过的东西"——从主项目拆代码时,把初始化函数调用链完整保留,别只拿"看起来相关"的部分。

修完再测——读数有变化了,但数值仍然不对。继续。

坑二:连续读悬空通道,读数漂移像"建立慢"

新现象:读数开始爬升/漂移,各通道读到的值逐渐逼近同一个数。

第一反应:DAC 的 MUX 输出阻抗高(15kΩ),ADC 采样抽电荷,是不是建立时间不够?把切换后的延时从 2ms 加到 3 秒——读数还是不对,各通道全部收敛到同一个值(悬空节点的特征)。

真正的问题出在读取方式:用"连续读 8 通道"的命令验证时,ADC 的 8 个输入里有一半是悬空的(没接信号)。悬空通道的读数受采样保持电容残留电荷影响,会漂移、会爬升,两次读同一通道结果都不同。

于是被误导成"MUX 切换有反应"(其实那是悬空漂移),又误导成"建立时间不够"(其实等多久都一样)。

修法:改用"设 MUX → 单通道直读"的方式,悬空漂移被排除,读数立刻稳定可区分。

经验:悬空 ADC 通道的读数会骗人——会漂移、会爬升、会随采样时序变化。验证信号链路时,只用"已知电压通道"和"独立单通道读取",别用连续多通道读悬空脚来观察。

坑三:万用表测引脚恒 3.3V,差点拆板

软件侧越来越像"MUX 输出没接上",让同事拿万用表测 DAC 的 MUX 引脚——恒 3.29V,怎么切通道都不变。

3.29V ≈ 电源电压。两个猜想:MUX 引脚到 ADC 的连线断了?还是被外部电路拉到 3.3V?

准备拆板查飞线了。先做个便宜的验证:软件侧设不同 MUX 码,看 ADC 读数——结果读数有区分度(不同码不同值)!说明 MUX 输出信号是到得了 ADC 的,连线没断。

经验:万用表测到恒定电压 ≠ 信号没变化——如果切换频率低于万用表采样,你测到的只是"最近一次的值"。软件侧能读出来的话,以软件读数为准。

坑四:回读验证 + 全码扫描,定位编码位序

到这一步:SPI 通路通(芯片能收命令)、MUX 输出能到 ADC、读数有区分但不符预期。剩最后一个可能:命令编码的位序不对

第一步:回读验证,证明芯片确实收到了命令

很多 SPI 芯片的串行输出脚会回读上一条指令(Echo Readback)。连发两条相同指令,第二条的回读应出现第一条的命令字节——如果回读内容对得上,芯片确实收到了,问题不在通路。

第二步:全码扫描,反推芯片实际解析的映射

把 MUX 控制码全部发一遍,记录每个码的读数,对照手册的信号表反推:

  • 发"参考电压"码,实际读数却是电源轨的 3.3V 饱和 → 它解析成了电源通道
  • 发"某通道电流"码,实际读数是 0V → 它解析成了地
  • 两个不同的码读数完全相同→ 它们发出的帧里低 5 位相同 → 芯片只认数据低 5 位

铁证:芯片实际解析的是数据字节低 5 位,而我按手册的理解把 MUX 码放在了帧的高位。

根因:数据手册位序图读歪了

手册的 MUX 命令位布局,初读以为是"命令 + 一堆不用管位 + MUX 码",于是把 5 位 MUX 码塞进帧的高位。实测证明芯片解析的是数据低 5 位:

// 错误写法: MUX 码放高位 SPI_Write8(0xB0 | ((mux >> 1) & 0x0F), (mux & 0x01) << 7, 0x00); // 正确写法: MUX 码放数据低 5 位 SPI_Write8(0xB0, 0x00, mux & 0x1F);

改完再测:参考电压读到 1.247V(精确)、参考地 ≈ 0V、电流通道线性度 0.3%。全部正常。

之前万用表测到的恒 3.29V 也解释通了:编码错位后,发出去的"参考电压选择"实际选中了电源通道——芯片和硬件从头到尾都是好的

总结:四个坑,四条经验

现象经验
控制引脚没初始化芯片收不到任何命令精简工程时完整保留初始化调用链
悬空通道读数漂移误判成"建立慢"/"MUX 有反应"只用已知电压通道 + 独立单通道读取验证
万用表恒 3.3V差点拆板查断线软件读数优先,万用表测到的可能是旧值
编码位序错读数恒 3.3V/不跟手回读验证 + 全码扫描反推,零猜测纯实证

调试顺序建议:先软件后硬件——SPI 通路(回读验证)→ 命令接收(回读内容)→ 命令语义(编码/位序)→ 才轮到怀疑硬件连线。这条链路走完之前,别拆板。


实测对比:按手册理解编码:读数恒3.3V不跟手 | 回读+全码扫描反推:位序修正,线性度0.3%

有用的话点个收藏,下次调试直接用。有问题欢迎评论区交流,看到了都会回。

下一篇:一个引脚接五路通道——MUX 选择窗口的正确打开方式——MUX 使用的另一个角度

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询