3、信号预处理:光电信号放大、模拟滤波电路设计、ADC采样策略
信号预处理,说白了就是给光电传感器那微弱的信号「洗个澡、穿件衣服」,再送到 ADC 嘴里去。这一步要是没做好,后面算法再牛也白搭。我见过太多项目,PCB 画得漂漂亮亮,结果一上电噪声比信号还大,最后查来查去,问题就出在预处理环节。
3.1 光电信号放大:从 pA 到 V 的跨越
光电二极管出来的电流有多小?我跟你讲,典型值在 nA 到 μA 级别,有些弱光场景甚至低到 pA。这么小的信号,直接送 ADC 等于没送。所以第一件事就是 I/V 转换加放大。
核心电路:跨阻放大器(TIA)
运放 + 反馈电阻 Rf,把电流 I_in 变成电压 V_out = -I_in × Rf。
选型时我有个习惯:先看运放的输入偏置电流。你想想看,如果运放自己就吃掉几个 nA,那信号还怎么测?我个人偏好 OPA2376 或 AD8605,偏置电流都在 pA 级,够用。
| 参数 | 推荐值 | 我的经验 |
|---|---|---|
| 输入偏置电流 | < 10 pA | 低于信号电流的 1/10 才安全 |
| 增益带宽积 | > 1 MHz | 别贪快,够用就行,太快反而引入噪声 |
| 反馈电阻 Rf | 1 MΩ ~ 10 MΩ | 太大容易饱和,太小增益不够 |
| 反馈电容 Cf | 1 pF ~ 10 pF | 防振荡用的,我一般先留空,实测再焊 |
小技巧:Rf 两端并联一个小电容 Cf,可以抑制高频噪声和防止自激振荡。Cf 的值我通常用公式 Cf = 1/(2π × Rf × f_3dB) 估算,然后留个焊盘位置,调试时再调。
3.2 模拟滤波电路设计:把噪声挡在门外
放大之后呢?噪声也跟着放大了。这时候就需要滤波器上场。我遇到过最头疼的情况是:50Hz 工频干扰串进来,跟信号混在一起,怎么滤都滤不干净。后来发现是地线没处理好,这是后话。
光学触控系统里,我常用的滤波策略分两步:
- 一阶 RC 低通:放在 TIA 输出端,截止频率设在 10~100 kHz,先把高频毛刺干掉。
- 二阶有源低通:用 Sallen-Key 拓扑,截止频率根据扫描频率来定,一般 1~10 kHz。
注意:滤波器级联时,后级的输入阻抗要远大于前级的输出阻抗,否则会拉偏截止频率。我吃过这个亏,当时两个滤波器级联后,截止频率直接偏移了 30%。
为什么用有源滤波?因为无源 RC 在低频段需要很大的电容和电阻,体积大不说,还容易引入热噪声。有源滤波用运放隔离,设计更灵活。
3.3 ADC 采样策略:什么时候采、采多少、怎么采
ADC 采样不是简单地把模拟信号转成数字。你得考虑三个问题:什么时候采?采多少?怎么采?
3.3.1 采样时机
光学触控系统里,LED 是脉冲点亮的。我建议在 LED 稳定发光的中段采样,避开上升沿和下降沿。为什么?因为那段时间电流不稳定,噪声最大。
我的做法:用定时器同步 LED 驱动和 ADC 触发。LED 点亮后延迟 10~20 μs,等信号稳定了,再触发 ADC 采样。
3.3.2 采样位数与速率
12 位 ADC 够不够?说实话,大部分场景够用。但如果你要检测很微弱的手指遮挡变化,我建议上 16 位。采样速率呢?每个通道 100 kSPS 基本够用,毕竟光学触控的扫描频率一般也就几十到几百 Hz。
| 场景 | 推荐位数 | 采样率 |
|---|---|---|
| 普通触控 | 12 bit | 100 kSPS |
| 高精度触控 | 16 bit | 200 kSPS |
| 多通道扫描 | 12~16 bit | 每通道 50 kSPS |
3.3.3 过采样与平均
硬件搞不定的事,软件来凑。过采样+平均可以有效提升有效位数。我常用的套路是:对同一个点采 16 次,去掉最大最小值,剩下 14 个取平均。这样等效位数能提升 2~3 bit。
// 过采样平均示例
uint32_t sum = 0;
uint16_t max_val = 0, min_val = 0xFFFF;
for (int i = 0; i < 16; i++) {
uint16_t val = adc_read(channel);
sum += val;
if (val > max_val) max_val = val;
if (val < min_val) min_val = val;
}
sum -= (max_val + min_val);
uint16_t result = sum >> 2; // 等效 14 次平均,右移 2 位
避坑指南:我曾经在过采样时忘了去掉异常值,结果有一次电源波动导致某个采样点跳变,平均后整个数据都偏了。从那以后,去极值就成了我的标配。
3.4 知识结构总览
下面这张图把信号预处理的三个环节串起来了。你看一眼就能明白整个链路是怎么走的。
3.5 实战中的几个坑
- 地线环路:模拟地和数字地没分开,噪声从地线串进来。我建议用 0Ω 电阻或磁珠单点连接。
- 电源纹波:运放对电源噪声很敏感。LDO 输出端加 10μF+0.1μF 去耦电容,靠近运放引脚放。
- PCB 布局:反馈电阻 Rf 和 Cf 要尽量靠近运放引脚,走线越短越好。我见过有人把 Rf 放得老远,结果寄生电容把带宽压到只有几十 kHz。
- 采样抖动:ADC 触发信号抖动会导致采样值不稳定。用定时器硬件触发,别用软件延时。
再强调一次:信号预处理是光学触控系统的「地基」。地基没打好,上面盖再漂亮的算法楼也会塌。我每次评审设计,第一件事就是看信号链的噪声预算,这一关过不了,直接打回重做。