尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

自制双显示数字万用表:从硬件选型到校准调试全解析

自制双显示数字万用表:从硬件选型到校准调试全解析 很多人第一次看到有两个显示区域的数字万用表Digital Multimeter第一反应是屏幕大了点是不是噱头我最初也这么想。直到有一回修一个开关电源想同时盯着输出端的电压稳定性和纹波频率手里那只单显示万用表只能靠手动切换。来回切了几次瞬态信息全丢了怀疑是电感啸叫还是电容老化都判断不准。那次之后我就决定自己动手做一台双显示的数字万用表。这个项目后来断断续续做了几个月踩了不少坑也积累了一些比较实用的经验。本文就从需求定义、硬件选型、固件架构、精度校准到组装调试完整拆解一遍。如果你是想给自己做一台顺手的工具表或者对仪表类嵌入式设计感兴趣这篇文章应该能提供一条可以落地的参考路径。1. 双显示数字万用表到底在解决什么测量痛点1.1 单显示为什么不够用测量电子电路的时候你经常需要“同时”观察两个电气量。什么叫同时不是看一眼电压再切过去看一眼频率而是两个量必须在同一个时间轴上同步呈现。比如检修一个DC-DC降压模块输入电压是稳定的但输出端既需要看电压值又需要看开关噪声的重复频率。如果来回切换你看到的是两个不同时刻的快照中间发生的跌落、振荡可能完全被忽略。测量一个电机驱动板既要看母线电压是否在负载变化时塌陷又要看PWM占空比是否按照程序设定在调整。单显示模式下两个参数无法同时对应到同一负载状态。校准一个传感器信号链需要看信号的绝对值同时看它相对于参考值的偏差。单显示做不到这一点只能心算或者外接两台表。单显示的另一个隐性问题是操作成本。测量过程中手经常要握表笔另一只手要调节被测电路。如果还要频繁按“功能切换”键等于把注意力从被测电路上挪开了。双显示能把常用组合直接固定下来减少操作幅度这在现场调试时非常实用。1.2 双显示的维度组合双显示并不等于“两块屏幕各显示一个参数”。从实用角度两个显示区域之间应该有信息关联。市面上真正的双显表头大体分三类第一类是主参数子参数的组合典型就是电压频率、电压占空比、电流功率。这类组合覆盖了多数电源检修场景。测开关电源输出电压是12.3V频率是65kHz两个信息同时出现一下子就能判断电路有没有进入正常工作状态。第二类是主数值趋势条主显示区用大字体给出精确读数副显示区用模拟条展示最近几十个采样点的变化趋势。这个组合对于观察电压跌落、电流爬升这类慢变化特别有用。数字跳变很难看出趋势模拟条则直观得多。第三类是同参数的主副对比比如主显示当前值副显示最大值/最小值或相对参考值的偏差。这类组合适合做老化测试和一致性筛选。我在设计这个项目时没有做固定死板的组合而是把两个显示区域设计成“主显示区 可配置副显示区”。副显示区可以在频率、占空比、模拟条、偏差量之间切换。这样一台表就能覆盖上述三类场景。1.3 这个项目的目标定位动手之前我把需求定得很明确电压测量量程覆盖0到30V超过这个范围对DIY场景意义不大而且高压输入保护的成本和设计难度会明显上升。支持直流电压、直流电流、频率、占空比测量。两个显示区域独立配置主显示固定为电压或电流副显示可以选择频率、占空比、模拟条或偏差。自动量程切换免去手动换挡的麻烦。作为随身工具表目标是整体精度在±0.5%以内能胜任绝大多数电子制作和维修需求。这个定位不算高但要真正达到“能日常使用”的可靠性比做一个只能亮屏的演示板要难得多。后面的内容会围绕这个目标逐项展开。2. 硬件方案选型与关键器件取舍2.1 主控和ADC怎么选先聊主控。这类仪表项目市面上常见的方案是STM32、ATmega、ESP32这三种。ESP32我直接排除了虽然性能强但ADC线性度一般而且跑带WiFi的芯片做测量仪器功耗和电磁干扰都不好控制。ATmega328P是很多万用表DIY玩家的首选资料多、寄存器简单但做双显示加自动量程主频和中断资源会比较吃紧。我最后选了STM32G030F6P6Cortex-M0内核64MHz主频价格便宜外设足够尤其是DMA和定时器资源对采样任务非常有用。ADC部分是这个项目最需要花心思的地方。STM32G0内置12位SAR ADC理论分辨率有限。但通过过采样均值滤波可以把有效分辨率提到15位左右代价是采样速度变慢。对万用表这种低频测量设备来说这个代价完全可接受。我实际用的采样率是每秒10次每次读数由256次单次采样平均得到等效分辨率约14.5位稳定度相当好。如果你追求更高的精度可以考虑外置ADS111516位I2C接口。它自带的PGA可编程增益放大器可以在不同量程下自动调整增益设计上更省事。但16位ADC的有效位数通常在14位左右实际提升有限却多了I2C通信和电源去耦的麻烦。所以这台表最终没有用外置ADC而是用了内置ADC加过采样硬件上更简洁。2.2 分压电阻网络与真有效值的取舍电压测量量程切换最常用的方案是电阻分压网络加模拟开关。我的分压网络是这样的输入经过1MΩ电阻再分成三档对应满量程3V、10V、30V。三个分压点的分压比分别由三组分压电阻决定分压电阻精度选0.1%的金属膜电阻温漂25ppm/°C。实际计算下来在常温环境下电阻网络引入的误差约0.15%已经能满足目标。这里有个经常被忽略的点分压电阻的阻值不是越大越好。阻值越大ADC输入端的等效阻抗越高容易受到后级输入偏置电流和引脚漏电流的影响。1MΩ输入阻抗是我权衡后的值既能降低对被测电路的影响又不会让采样误差太大。频率测量和占空比测量不需要ADC参与。信号经过一个比较器电路整形为方波然后送入定时器的输入捕获通道。比较器的阈值设置很关键我使用被测信号的中间电位作为阈值否则方波的占空比会失真。这里我用了LM393比较器加上一个约5mV的迟滞电阻避免信号在阈值附近反复翻转导致频率计数乱跳。关于真有效值我只做了直流测量。如果要测交流真有效值需要AD8436这类专用RMS芯片或者用高速ADC做软件计算。这两个方案都会明显增加成本和固件复杂度。考虑到我做这个表的核心场景是直流电源和PWM信号调试就放弃了交流真有效值功能。如果你需要测市电或交流信号建议直接在表头前加一个真有效值转直流模块。2.3 显示器件选择双显示最直接的实现方式是使用两块独立的显示屏。我第一版试过两块0.96寸OLED效果确实好但有两个问题一是OLED亮度高室内看非常清晰但在户外强光下基本看不清二是OLED有两个I2C地址需要配置为不同地址如果主控的I2C引脚不够布局会比较麻烦。第二版换成了方案主显示区用0.96寸OLED副显示区用一块1.3寸蓝底白字LCD段码屏。这个组合的好处是OLED负责动态变化快的主数值段码屏负责刷新率要求不高的副参数两个屏互不抢占刷新时机。LCD段码屏在阳光下可读性比OLED好很多长时间显示固定内容也不会有烧屏问题。如果你手头没有段码屏驱动经验也可以用一块12864 SSD1306 OLED上半部分显示主值下半部分显示副值。这样硬件最简单但“双屏”的视觉冲击会弱一些。两种方案我都验证过最终选的是双屏方案因为主副屏独立刷新能让“双显示”的优势更明显。2.4 输入保护电路设计万用表最怕接错表笔尤其是把电流档当电压档用或者电压超过量程。输入保护这块我不打算省。电路输入端设计了三级保护第一级是自恢复保险丝额定电流500mA用于限制过流第二级是双向TVS二极管钳位电压在33V左右用来吸收瞬时过压尖峰第三级是限流电阻加两个背靠背的二极管把进入ADC和比较器的电压钳位在电源轨以内。分压电阻网络本身就承担了一部分限流作用。自恢复保险丝有一个被很多人忽视的问题它本身有内阻温度升高时阻值还会漂移。这个内阻在电流测量档位是不可忽略的。解决方法是把保险丝放在电流档的分流电阻之前校准的时候把保险丝的内阻一并算入分流电阻网络的等效阻值。这样虽然保险丝内阻会随温度变化但正常使用温度范围内影响能控制在0.1%以内。3. 固件任务调度两个显示信息怎么刷新才不乱3.1 数据采集链路与软件滤波固件里最核心的模块是ADC采样和滤波。ADC以DMA模式运行不需要主循环频繁介入。DMA缓冲区大小设为256每个采样周期完成后触发完成中断主循环在中断标志置位后去读取数据。256个采样值并不是直接平均。我在这之前加了中值滤波去掉最大值和最小值再对剩余254个值做平均。这样做可以抑制偶发的脉冲干扰比如开关噪声或电机火花引起的毛刺。虽然多了一步排序但STM32G0的64MHz主频跑254个数的排序耗时不到1毫秒对每秒10次的采样频率没有任何压力。为了防止数值在显示屏上抖动我还加了滑动窗口。最新一次均值结果与上一次均值结果做加权平均权重系数是0.7和0.3。这样既能快速响应被测电压的变化又不会出现数字来回跳两三个字的烦人现象。3.2 双显示缓存与异步刷新双显示系统最怕的是主显示刷新到一半副显示又要求刷新两个刷屏函数打架。OLED和段码屏尽管驱动方式不同但本质都是需要主控花费时间逐字节写入。如果在绘制过程中被另一个刷新任务打断就会出现花屏或显示错位。解决办法是为每个屏幕建立独立的显示缓存主屏有个buf_main副屏有个buf_sub。任何一屏需要更新时先把数据写入对应的缓存然后设置一个对应的刷新标志。主循环中优先处理主屏刷新副屏刷新在完成主屏之后处理。这里有个细节主显示的大字体数字变化频率高但每帧只需要刷新数字区域不需要全屏重绘。我实测全屏重绘一次OLED大概需要35毫秒而只刷新字符区域只需10毫秒。副显示区变化频率低一些每秒刷新两次就够了。这样总刷新开销控制在主循环任务占用的20%以内留出了充足的余量给按键扫描和自动量程逻辑。3.3 自动量程的状态机自动量程是万用表里最容易做砸的功能之一。很多人直接写“如果读数大于量程就切换下一档”结果就是量程在临界点来回抖动显示数字来回跳。我的做法是给自动量程设计一个带迟滞的状态机。状态机分三档对应3V、10V、30V。量程提升的条件是当前档位的均值读数连续5次超过满量程的95%。量程降低的条件是连续5次低于下一档满量程的30%。这两个阈值之间有足够的间隔避免临界抖动。量程切换后新档位要在ADC数据稳定后再更新显示。实际操作中切换后我会丢弃前两次均值采样因为模拟开关切换后线路电容需要几个毫秒才能稳定。伪代码大致如下if (current_range RANGE_3V count_high 5) { switch_to(RANGE_10V); discard_next(2); count_high 0; } else if (current_range RANGE_10V reading 1.0f count_low 5) { switch_to(RANGE_3V); discard_next(2); count_low 0; }这个状态机逻辑简单但迟滞阈值需要根据实际分压比微调。我用标准电源校正过三个档位的切换点确保从高量程切到低量程的时候不会因为临界值设置不当而切错。3.4 功耗与响应速度的平衡手持便携设备的功耗问题一般出现在显示屏和主控频率两个地方。OLED全亮时大概20mA段码屏背光5mA主控在64MHz全速运行时约10mA。整机总电流控制在35mA左右用一节18650电池供电连续用一整天没问题。真正要花心思的是低功耗模式。如果1分钟内没有按键操作且测量值没有明显变化系统进入轻睡眠模式主频降到8MHzOLED关闭只有段码屏保持显示。任何按键或者测量值变化超过阈值时立即唤醒并恢复全速运行。这个功能对现场调试很有用不用频繁开关机拿起来就能看。不建议让主控进入深度睡眠。唤醒和重新稳定ADC需要几百毫秒在测量过程中会丢失数据。轻睡眠的功耗已经够低而且恢复速度在10毫秒以内对用户体验影响很小。4. 校准链路与误差分配让双显示数据可信4.1 误差来源拆解一台自制的万用表如果没有经过系统的误差分析测出来的数据自己都不敢信。我从误差源头开始逐个拆解。分压电阻网络是最主要的误差来源。0.1%精度的电阻在三个分压点引入的不确定性大约是0.05%。基准源用的是ADR4525初始精度0.02%温漂2ppm/°C这个误差基本可以忽略。ADC本身的线性误差和增益误差是另一个大头。STM32G0内置ADC的INL典型值在±2LSB左右对于12位ADC来说满量程的0.05%左右。还有一个容易被忽略的误差源是ADC参考电压。如果直接使用MCU的VDD作为参考电压VDD的纹波会直接叠加到测量结果上。这个设计里用了外部2.5V基准并且用LDO单独供电确保ADC参考电压干净。综合下来理论上整机误差能做到±0.3%左右实际还要通过校准来修正。4.2 校准流程校准分为三个步骤零点校准、满度校准、两点线性修正。零点校准在输入短路的情况下进行读取ADC原始值存为零点偏移。每次开机时自动执行一次零点校准因为ADC的零点偏移会随着温度变化。满度校准需要使用标准电压源分别给三个量程档位输入准确的3V、10V、30V电压记录实际ADC读数计算增益修正系数。两点线性修正用来修正ADC的积分非线性。我在每个量程取两个点比如10V档取5V和8V两个校准点。通过线性插值把测量区间分成两段各段使用独立的增益系数。经过这两点修正后实测误差可以明显降低。校准参数统一保存在Flash的最后一个扇区校准模式通过长按按键进入。每次开机的时候固件会读取校准参数并做校验和如果参数无效就用默认值。这样设计是为了防止在校准过程中突然断电导致参数写坏。4.3 实测数据对比我用一台台式六位半万用表作为参考标准对自制的双显万用表做了对比测量。下面是10V档的一组实测数据单位是伏特标准源输出本表显示绝对误差相对误差1.00001.00060.00060.06%3.00002.9984-0.0016-0.05%5.00005.00120.00120.02%8.00007.9976-0.0024-0.03%10.000010.00400.00400.04%整体误差控制在±0.06%以内比目标±0.5%好了一个数量级。这个结果说明硬件方案和校准流程是靠谱的。需要注意这个精度只在校准温度附近有效温度漂移、长时间老化都会让误差逐渐变大重新校准是必须的。4.4 双显示参数同步性的处理双显示不仅每个参数要准两个参数之间还要“同步”。如果主显示电压是10V副显示频率是65kHz而这两个数据分别来自不同时间的采样那在测量动态信号时两个参数对应不上。为了保证同步我在固件里做了这样的处理副显示区显示的频率、占空比、模拟条全部来自最近一次主显示测量周期内同步采样的数据。具体说主显示完成ADC均值计算之后固件立刻读取定时器捕获到的频率和占空比结果。由于这两类采样在一个测量周期内完成时间差不超过1毫秒。这样主副显示反映的是同一个测量时刻的状态。这个设计在观察开关电源启动过程时特别有用可以看到电压上升的每个阶段对应的频率变化而不是两个错位的数据流。5. 组装调试中的关键坑与实测经验5.1 地线布局显示刷新串扰的根源打样第一版PCB的时候我图省事把数码管显示的地线和ADC采样地线接在了一个公共点上。结果一开机ADC读数在显示刷新时会跳几毫伏。原因很简单显示刷新瞬间会有十几毫安的电流脉冲通过地线在地线阻抗上产生压降这个压降叠加到了ADC参考地上。解决办法是彻底分开模拟地和数字地。数字部分主控、显示屏单独走一块地模拟部分分压网络、ADC、基准源单独走一块地最后在电源入口处单点汇合。这个改动之后显示刷新对ADC读数的影响从几毫伏降到了0.1毫伏以内。如果你也想做类似的项目PCB布局上记住一个原则所有模拟信号的回流路径必须干净不允许数字信号的回流电流穿过模拟区域。5.2 输入浮空时跳字第一版固件有一个很恼人的问题表笔悬空不接任何东西时屏幕上会随机跳出一个几十到几百毫伏的值。原因不是我滤波不够而是ADC输入引脚在高阻状态下捕获了环境噪声。解决方法是给每个电压档位的ADC输入端加一个1MΩ的下拉电阻让输入端在浮空时稳定在0V。要注意的是这个下拉电阻会和分压网络的等效阻抗形成分压在计算量程校准系数时需要把它算进去。加了电阻之后浮空输入稳定显示0.00V不会再有跳字。5.3 保护器件带来的误差前面提到自恢复保险丝有内阻但这个内阻在电流档的影响比电压档更大。设计时电流档的分流电阻用了0.1Ω而自恢复保险丝的内阻约0.05Ω。如果不把保险丝内阻校准进分流电阻网络电流测量就会有约0.5%的偏移。校准方法是用一个已知电流的恒流源记录ADC读数反推分流电阻保险丝的总等效阻值然后写入校准参数。我用这种方法校准后电流档实测误差在±0.4%以内对于DIY项目来说已经足够用了。另外TVS二极管在正常电压下会有极小的漏电流这个漏电流会引入测量误差。尤其是高输入阻抗的电压档位下漏电流经过1MΩ分压电阻产生的压降可能达到几毫伏。所以TVS选型要选低漏电流的型号比如SMBJ33CA漏电流在微安级别对测量精度影响可以忽略。5.4 显示可读性与背光策略OLED在室内效果没得说但到了户外如果阳光直射亮度就不够了。所以我做了一版用LCD段码屏作为主显示的实验板。LCD段码屏在强光下越晒越清晰反射式显示完全不依赖背光省电而且可读性更好。考虑到绝大多数使用场景在室内最终保留了OLED作为主显示。但给副显示的段码屏加了按键控制背光开关的功能。这样在户外需要长续航的时候可以关掉OLED用段码屏继续测量功耗能降到10mA以下。如果你打算把双显表做到“工具级”而非“玩具级”建议优先考虑LCD或者墨水屏这类反射式显示器件。5.5 再分享一个校准小技巧校准的时候别只盯着误差值多关注稳定性。我遇到过这样的情况某一档的误差经过校准后已经很小了但读数每隔几秒钟会缓慢漂移几个字。一开始以为是软件问题查了半天才发现是校准用的标准电压源还没预热稳定。仪表类设备校准前至少提前15分钟上电预热让内部参考源和电阻网络达到热平衡。这个细节看似简单实际中能省掉大量排查时间。这台表最终的形态和可以扩展的方向这台双显示数字万用表做完之后一直放在我的工作台上当日常工具。平时修板子、测电源、校准传感器基本都用它很少再翻出商用的台式表。双显示最打动我的地方不是参数多而是省去了切换的步骤让我能把注意力集中在被测电路本身。如果你也想动手做一台我的建议是不要一上来就追求功能堆叠。先把单路电压测量做到足够稳定加一个显示区域跑通自动量程和校准流程再逐步加入频率、占空比、模拟条这些辅助功能。每一层功能都是独立模块测试起来也方便。等基础扎实了再考虑加蓝牙数据记录、USB通信、双通道同时测量这些进阶功能。这条路走下来你会对数字万用表的内部原理有远比“会用”更深的理解。
返回列表