一片按键、一组电阻分压、一个 ADC 通道------用这种方式读薄膜开关,是低成本方案里最常见的做法。电路足够简单,但真正调试起来,经常会遇到一类诡异现象:快速切换通道轮询按键时,读到的电压总是偏向上一次按下的键,刚按下的键反而读不准。问题往往不在按键,也不在 ADC 精度,而在"复用"这一环上。
本文把工程实践中踩得最多的两个坑------采样保持时间不足、分压电阻取值不当------连同软件配合、布局与低功耗的注意事项,一次讲清楚。
坑一:源阻抗与采样时间没有对上
现象
SAR 型 ADC 内部都有一个采样保持电容。每次采样开始时,外部信号必须经由源阻抗把这个电容充到目标电压,之后才进入转换。如果分压网络的等效输出阻抗偏高,而采样窗口又设得很短,电容还没充满就开始转换,读到的是上一次通道的残留电压与本次信号的混合值。
表现出来就是:连续快速切换通道时,读数"粘"在上一个键上;真正按下的键,反而要过一会儿才读得准。

对策
- 拉长采样时间:常用经验是采样时间不小于 3~5 倍时间常数(τ = Rs × Cs)。STM32 等平台可直接通过 ADC 采样时间寄存器配置。
- 并一个电荷缓冲电容:在 ADC 引脚对地并几十 pF 到几 nF 的电容,充电期间由电容提供电荷,降低源阻抗的瞬态负担。注意电容自身也是时间常数的一部分,要和源阻抗匹配着选。
经验上,把采样时间拉到源阻抗的若干倍,或在分压节点并一个小电容,读数立刻会"跟手"很多。
坑二:分压电阻的取值本身
两个硬约束
分压网络要同时满足:
- 参考范围:所有按键状态下(含多键同按、无键按下),模拟输入电压都落在 ADC 参考范围内,并留出裕量;
- 电压间隔:相邻按键之间的电压间隔大于 ADC 的有效分辨率(ENOB 对应的 LSB 当量),否则相邻键轻微误触、电阻批次差就会造成误判。
设计时建议先用万用表把每个键的实际电压量出来再定阈值------理论值和实物之间,永远隔着寄生参数。
功耗这笔账
按键未按下时,如果分压网络没有被断开,电流会一直流。低压电池供电的产品里,几个按键各挂一组分压,静态功耗可能比主控本身还高。常见处理方式:
- 共用一组分压网络:所有按键共享,用多路模拟开关或 GPIO 输出逐个选通,未选通时无电流通路;
- 一键一通道:薄膜开关按键数不多时,每个按键占一个独立 ADC 通道,牺牲引脚换时序简单;
- GPIO + ADC 折中:GPIO 轮询配合电阻网络做粗定位,ADC 只负责区分少数位置相近的键。
软件侧:把模拟前端和固件时序当成一件事
- 通道切换后留出建立时间,这期间读到的电压不可信,直接丢弃;
- 连续采样取中位数或多次平均,压掉电源纹波带来的抖动;
- 判断阈值不要贴着理论电压点设,留足余量,抵抗温度漂移和电阻公差;
- 注意薄膜开关的结构特性:感应层与图案层之间的寄生电容,会让通道切换瞬间有额外充电电流,实际建立时间比纯电阻网络的估算值更长;
- PCB 上让分压节点尽量靠近 MCU 引脚,长走线会增加耦合和干扰。一个三采样取中位数的参考实现:
调试:先量电压,再看读数
- 用万用表逐键测出实际电压,再和 ADC 读数做对照;
- 读数整体偏低、且随切换速度变化 → 多半是建立时间不足,加采样时间或缓冲电容;
- 某个键电压明显偏离设计值 → 回到这个按键的连接本身:走线、焊点、接触;
- 通道数不够时可以考虑外部多路模拟开关,但其导通电阻和切换时的电荷注入,要并入源阻抗和误差预算一起算;
- 低功耗产品的休眠策略要和采样节奏一起设计:持续轮询 ADC 会让 MCU 无法休眠,休眠唤醒与按键唤醒源的配置,往往比滤波算法更影响整机续航。
结语
薄膜开关本身的可靠性并不难,真正难的是把模拟前端和固件时序当成一件事来设计。抓住两条主线:源阻抗与采样时间对上,电压间隔与参考范围对上;剩下的,就是软件层面的滤波与阈值取舍。把这些内容写进设计文档,调试阶段就能少一次往返。