第二章:万用表功能需求分析

做嵌入式这么多年,我经手过不少万用表项目。说实话,每次开始一个新设计,最头疼的不是代码怎么写,而是——你到底要测什么?

这一章,咱们就来掰扯掰扯万用表的六大核心功能。你想想看,一个手持万用表,用户拿它干嘛?无非就是测电压、测电流、测电阻、通断测试、二极管测试,再加上自动量程。嗯,就这些。但每个功能背后,都有不少坑等着你。

2.1 电压测量

电压测量是万用表最基础的功能。我个人习惯把它分为直流和交流两大类。

直流电压测量,说白了就是测电池、电源模块这些。关键点在于输入阻抗。我记得有一次,一个同事设计的表测3.3V电压,结果读数只有2.8V。查了半天,原来是输入阻抗只有10kΩ,把被测电路拉垮了。

核心参数:

  • 输入阻抗:至少10MΩ,越高越好
  • 量程范围:200mV、2V、20V、200V、1000V
  • 分辨率:1μV(最低量程下)

交流电压测量就复杂一些。你需要考虑频率响应和真有效值(True RMS)的问题。我在项目中遇到过,用普通均值响应的表测变频器输出,读数完全不准。所以,如果你的RTOS任务里要处理交流电压,记得加上真有效值算法。

我的建议:交流电压测量任务,采样率至少设到10kHz以上。低于这个数,50Hz以上的谐波你就抓不住了。

2.2 电流测量

电流测量分两种:串联测量和钳形测量。咱们这里主要讲串联测量,也就是把表串进电路里测。

电流测量的核心是采样电阻。你想想看,采样电阻大了,压降大,影响被测电路;采样电阻小了,信号弱,ADC不好采。这是个典型的权衡问题。

量程 采样电阻 满量程压降
200μA 1kΩ 200mV
2mA 100Ω 200mV
20mA 10Ω 200mV
200mA 200mV
10A 0.01Ω 100mV

这里要注意,10A档的采样电阻必须用康铜丝或者锰铜丝,普通贴片电阻扛不住。我曾经见过一个新手,用0805电阻做10A采样,一通电直接冒烟。

警告:电流测量任务在切换量程时,必须先断开测试回路!否则,量程切换继电器在带电状态下切换,触点很快就会烧坏。

2.3 电阻测量

电阻测量,原理上就是给被测电阻施加一个恒流源,然后测它两端的电压。但实际做起来,问题不少。

首先,恒流源怎么产生?我习惯用运放加基准电压源搭一个。但要注意,不同量程需要不同的测试电流:

  • 200Ω档:1mA测试电流
  • 2kΩ档:100μA测试电流
  • 20kΩ档:10μA测试电流
  • 200kΩ档:1μA测试电流
  • 2MΩ档:0.1μA测试电流

嗯,这里有个坑。测试电流越小,信号越弱,越容易被噪声干扰。所以,电阻测量任务在RTOS里的优先级,我建议设得比电压测量高一些。因为电阻测量更容易受外部干扰,需要快速多次采样然后做平均。

避坑指南:我曾经在电阻测量任务里忘了加去耦电容,结果测出来的值跳来跳去。后来在每个量程的恒流源输出端都加了一个100nF的电容,问题就解决了。

2.4 通断测试

通断测试,说白了就是测两个点之间通不通。但这里有个关键点:阈值怎么设?

行业惯例是,电阻小于30Ω就认为导通,大于100Ω就认为断开。30-100Ω这个区间,属于模糊区,不同厂家处理方式不同。

我个人习惯的做法是:

  • 电阻 < 30Ω:蜂鸣器长响,绿灯亮
  • 30Ω ≤ 电阻 ≤ 100Ω:蜂鸣器间歇响,黄灯亮
  • 电阻 > 100Ω:蜂鸣器不响,红灯亮

通断测试对实时性要求很高。用户拿着表笔在电路板上划来划去,你响应慢了,人家就觉得这表不好用。所以,通断测试任务在RTOS里,我建议用最高优先级,并且要独占ADC资源。

关键点:通断测试的响应时间必须小于100ms。超过这个数,用户体验就很差了。

2.5 二极管测试

二极管测试,测的是正向压降。硅管一般是0.6-0.7V,肖特基管是0.2-0.3V,LED就高了,1.8-3.3V不等。

这里有个设计细节:测试电流。标准做法是给1mA的恒流源。但有些特殊二极管,比如大功率整流管,1mA电流太小,测不出真实压降。所以,我建议在固件里留一个可配置的测试电流选项。

二极管测试任务和通断测试任务其实可以共用一套硬件。区别只在于:通断测试看电阻值,二极管测试看电压值。所以,在RTOS里,这两个任务可以共享同一个驱动层,只是上层的处理逻辑不同。

注意:二极管测试时,如果被测二极管接反了,显示的是开路。但有些用户会误以为表坏了。所以,我习惯在UI上显示一个二极管符号,标明正负极方向。

2.6 自动量程切换

自动量程切换,这是万用表里最体现RTOS价值的地方。为什么?因为量程切换涉及多个任务的协同。

自动量程的流程是这样的:

  1. 先用最高量程测一次,得到一个粗略值
  2. 根据粗略值,判断应该用哪个量程
  3. 切换到目标量程,重新精确测量
  4. 如果超量程或欠量程,再调整一次

这里有个经典问题:量程切换震荡。比如,测量值刚好在量程边界附近,一会儿切到高档,一会儿切到低档,来回跳。怎么解决?

我常用的方法是加滞回区间。举个例子:

/* 自动量程滞回算法示例 */
#define HYSTERESIS 10  /* 10%的滞回区间 */

uint8_t auto_range(float measured_value, uint8_t current_range) {
    float upper_limit = range_table[current_range].max * (1.0 - HYSTERESIS/100.0);
    float lower_limit = range_table[current_range].min * (1.0 + HYSTERESIS/100.0);
    
    if (measured_value > upper_limit) {
        /* 升档 */
        return current_range + 1;
    } else if (measured_value < lower_limit) {
        /* 降档 */
        return current_range - 1;
    } else {
        /* 保持当前档位 */
        return current_range;
    }
}

你看,加了10%的滞回区间,量程就不会在边界处来回跳了。这个经验是我在第一个万用表项目里踩坑踩出来的,当时被测试工程师追着改了好几个版本。

我的建议:自动量程切换任务,不要用轮询方式。用事件触发方式,当ADC采样完成后,发一个事件给量程管理任务。这样既省CPU,又响应快。

2.7 功能优先级总结

好了,六大功能都分析完了。最后,我整理了一个RTOS任务优先级分配表,供你参考:

功能 优先级 说明
通断测试 最高 实时性要求最高,用户交互敏感
二极管测试 需要快速响应,但略低于通断
自动量程切换 影响测量准确性,不能延迟
电压测量 常规测量,优先级适中
电流测量 与电压测量类似
电阻测量 中低 需要多次采样平均,可稍慢

嗯,这个优先级分配不是绝对的。具体项目里,你还要考虑ADC的采样速率、显示刷新率、按键响应等因素。但大体上,按照这个思路来,不会出大问题。

下一章,咱们就开始讲RTOS任务的具体实现了。到时候,我会把每个功能怎么拆成任务、任务之间怎么通信,都掰开揉碎了讲给你听。