4. 功能测试实战:上电时序测试、按键/接口功能测试、指示灯/显示测试、传感器功能验证
功能测试,说白了就是验证你的板子能不能像个人一样正常干活。不是跑个Hello World就完事,而是每个接口、每个按键、每盏灯都得按规矩来。我见过太多板子,功能测试阶段草草了事,结果到了可靠性测试才暴露问题,返工成本高得吓人。
这一章,咱们把功能测试拆成四个核心模块来聊。每个模块我都会结合自己踩过的坑,给你讲讲怎么测才靠谱。
核心原则:功能测试不是“能亮就行”,而是“什么时候亮、怎么亮、亮多久”都得测。时序、阈值、边界的验证,才是量产测试的价值所在。
4.1 上电时序测试
上电时序,是硬件测试里最容易翻车的地方之一。你想想看,一个系统里可能有3.3V、1.8V、1.2V、0.9V好几路电源,谁先谁后、间隔多久,芯片手册里写得清清楚楚。但实际板子上,电容充放电、负载变化、电源芯片的启动时间,都会让时序跑偏。
我个人习惯,上电时序测试分三步走:
- 静态测量:用万用表确认每路电源对地没有短路,电压值在空载和轻载下是否正常。
- 动态抓取:用示波器多通道同时抓取各路电源的上电波形。至少4通道,最好8通道。触发条件设为主电源上升沿。
- 时序分析:测量各路电源从10%到90%的上升时间,以及各路之间的延时差。
我的经验:示波器探头要用同轴电缆或者差分探头,别用长地线夹子。地线太长会引入噪声,测出来的上升沿全是毛刺。我曾经因为这个误判了一整批板子的时序,白白返工了三天。
这里给出一份典型的上电时序测试记录表,你可以直接拿去用:
| 电源轨 | 目标电压 | 实测电压 | 上升时间(10%-90%) | 相对主电源延时 | 判据 |
|---|---|---|---|---|---|
| VCC_3V3 | 3.3V ± 3% | 3.31V | 1.2ms | 0ms(主电源) | PASS |
| VCC_1V8 | 1.8V ± 3% | 1.79V | 0.8ms | +2.1ms | PASS |
| VCC_1V2 | 1.2V ± 3% | 1.21V | 0.5ms | +3.5ms | PASS |
| VCC_0V9 | 0.9V ± 3% | 0.88V | 0.3ms | +4.8ms | FAIL(低于下限) |
注意:上电时序的判据必须严格遵循芯片数据手册。有些SoC要求内核电压先于IO电压上电,否则可能造成闩锁效应,直接烧芯片。量产测试中,这个项目绝对不能跳过。
4.2 按键/接口功能测试
按键测试,听起来简单吧?按下去,灯亮,完事。但量产测试里,你得考虑按键的机械寿命、接触电阻、消抖时间。我遇到过一批按键,出厂测试全过,结果客户用了一个月就开始双击——后来发现是消抖时间设得太短,按键本身的机械抖动比预期长。
按键测试的核心参数:
- 按下电平:确认按键按下时IO口电平正确(高有效还是低有效)。
- 释放电平:释放后是否回到默认状态,有没有漏电。
- 消抖时间:实测按键抖动时长,与软件消抖参数对比。
- 响应延迟:从按下到系统响应的总时间。
接口测试,我一般用回环法。比如串口,把TX和RX短接,发一串数据,看收回来的是不是一模一样。USB接口就复杂一些,需要枚举测试、眼图测试、信号质量测试。
量产测试脚本示例(按键测试):
// 伪代码 - 按键功能测试
for each button in button_list:
// 步骤1: 确认初始状态
assert(gpio_read(button.pin) == button.idle_level)
// 步骤2: 模拟按下(通过机械臂或人工)
press_button(button)
delay_ms(50) // 等待消抖
// 步骤3: 检测按下状态
assert(gpio_read(button.pin) == button.active_level)
// 步骤4: 检测系统响应
assert(check_system_response(button.action) == TRUE)
// 步骤5: 释放按键
release_button(button)
delay_ms(50)
// 步骤6: 确认释放状态
assert(gpio_read(button.pin) == button.idle_level)
print("Button " + button.name + " test PASS")
4.3 指示灯/显示测试
指示灯测试,不只是看亮不亮。亮度、颜色、闪烁频率、占空比,都得测。尤其是现在很多产品用RGB LED,颜色一致性是个大问题。
我建议的测试流程:
- 基本功能:每个LED单独点亮,确认驱动电路正常。
- 亮度测试:用照度计或光传感器测量亮度,与规格书对比。
- 颜色测试:RGB LED需要测色坐标,确保在目标色温范围内。
- 动态测试:闪烁频率、呼吸灯效果、PWM占空比。
显示测试(比如LCD、OLED、段码屏)就更复杂了。量产测试中,我一般用图像比对法:给屏幕发一张测试图,用摄像头拍下来,和标准图做像素级对比。但要注意环境光的影响,最好在暗箱里测。
避坑指南:我曾经遇到一批段码屏,显示数字"8"的时候,中间那一横死活不亮。查了半天,是LCD驱动芯片的偏压设置不对。后来我在测试脚本里加了一条:全显所有段码,然后逐段检测。这个测试项后来成了标准流程。
4.4 传感器功能验证
传感器种类太多了:温度、湿度、压力、加速度、陀螺仪、磁力计、光感、距离……每个传感器的测试方法都不一样。但核心思路是一样的——给一个已知的激励,看传感器的输出对不对。
我总结了一套通用的传感器验证方法:
| 传感器类型 | 激励方式 | 测量参数 | 常见问题 |
|---|---|---|---|
| 温度传感器 | 恒温槽/热风枪 | ADC读数 vs 标准温度计 | 线性度差、响应慢 |
| 加速度计 | 翻转台/振动台 | 静态重力分量、动态响应 | 零偏漂移、灵敏度偏差 |
| 光传感器 | 标准光源箱 | ADC读数 vs 照度计 | 光谱响应不匹配 |
| 距离传感器 | 标准距离靶标 | 测量距离 vs 实际距离 | 多路径反射、盲区 |
量产测试中,传感器验证最头疼的是效率问题。每个传感器都要给激励、等稳定、读数、比对,一套下来几十秒就没了。我见过一条产线,光传感器测试就占了整个功能测试时间的60%。
效率优化建议:能并行测的就别串行。比如多个温度传感器可以同时加热同时读数。另外,阈值不要设得太死,传感器本身就有离散性,留出合理的裕量。我曾经把温度传感器的判据从±1°C放宽到±2°C,不良率从5%降到了0.3%,而且终端客户没有任何投诉。