第二章:万用表功能需求分析
做嵌入式这么多年,我经手过不少万用表项目。说实话,每次开始一个新设计,最头疼的不是代码怎么写,而是——你到底要测什么?
这一章,咱们就来掰扯掰扯万用表的六大核心功能。你想想看,一个手持万用表,用户拿它干嘛?无非就是测电压、测电流、测电阻、通断测试、二极管测试,再加上自动量程。嗯,就这些。但每个功能背后,都有不少坑等着你。
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 | 1Ω | 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价值的地方。为什么?因为量程切换涉及多个任务的协同。
自动量程的流程是这样的:
- 先用最高量程测一次,得到一个粗略值
- 根据粗略值,判断应该用哪个量程
- 切换到目标量程,重新精确测量
- 如果超量程或欠量程,再调整一次
这里有个经典问题:量程切换震荡。比如,测量值刚好在量程边界附近,一会儿切到高档,一会儿切到低档,来回跳。怎么解决?
我常用的方法是加滞回区间。举个例子:
/* 自动量程滞回算法示例 */
#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任务的具体实现了。到时候,我会把每个功能怎么拆成任务、任务之间怎么通信,都掰开揉碎了讲给你听。