在做智能家居、工业面板或任何带外壳的交互产品时,我们常想用一整块厚厚的玻璃或亚克力来提升质感与防护性。然而,一个现实难题总是随之而来:当介质厚度超过3mm,常规的触摸方案开始变得迟钝甚至完全失灵。

        增加介质厚度意味着触摸信号被大幅衰减,而单纯提高灵敏度又会引入环境噪声,导致误触发。市面上的穿透方案要么成本高昂,要么需要复杂的多层PCB设计。我们是否能用一种更简单、更低成本的方式,稳定搞定5mm甚至更厚的玻璃?

        答案是肯定的。本文将分享我们基于单颗通用触摸芯片,通过深度定制的算法,实现稳定穿透5.1mm有机玻璃、支持可编程长按/灵敏度调节的完整方案。它不仅是一个模块,更是一套解决思路。

一、 核心思路:软硬协同,而非蛮力堆料

我们的目标很明确:在控制成本的前提下,突破厚介质带来的信号衰减瓶颈。核心思路不是更换更昂贵的芯片,而是对现有芯片的潜力进行深度挖掘,实现软硬件协同优化

  1. 硬件选型:选择了一款性价比较高、内置高灵敏度触摸感应单元的单片机作为主控。关键在于其ADC采样速率和可配置性满足我们的算法需求。

  2. 算法优化(关键):这是突破的核心。我们没有使用芯片原厂的通用库,而是从底层寄存器入手,重写了触摸检测与信号处理链:

    • 动态基线跟踪:环境温湿度变化、电源波动都会影响基准。我们实现了快速自适应的动态基线跟踪算法,确保在各种环境下都能获得稳定的参考点。

    • 自适应阈值与数字滤波:针对厚介质下信噪比低的特点,设计了两级滤波:一级硬件滤波去除高频毛刺,二级软件滤波(如滑动平均、中值滤波)抑制低频干扰。触发阈值不再是固定值,而是根据实时信号质量动态调整。

    • 多周期验证与消抖:引入“多周期验证”机制,只有连续多个采样周期都满足触发条件,才判定为一次有效触摸,从根本上杜绝了误触发。同时,为长按功能设计了独立的计时与状态机。

二、 实现效果:从“失灵”到“稳定”

理论需要数据支撑。我们搭建了测试环境,使用1.8mm、3.5mm、5.1mm三种厚度的有机玻璃进行对比测试。

测试条件

优化前(通用库)

优化后(定制算法)

1.8mm有机玻璃

触摸正常,长按功能正常

触摸正常,长按功能正常

3.5mm有机玻璃

触摸反应迟钝,长按无法触发

触摸灵敏,长按功能稳定

5.1mm有机玻璃

触摸完全失灵

触摸灵敏,长按功能稳定

  • :优化前后对比图

三、 关键代码与配置示例

以下是部分核心配置和逻辑的伪代码,展示了我们的实现思路:

// 1. 触摸通道关键配置(示例基于某通用MCU)
void TouchKey_Init(void) {
    // 选择高精度ADC通道
    ADC_Config.HighResolutionMode = ENABLE;
    // 提高采样率,捕捉微弱信号变化
    ADC_Config.SamplingTime = ADC_SAMPLETIME_47CYCLES;
    // 启用硬件过采样,提升信噪比
    ADC_Config.OverSamplingMode = ENABLE;
    ADC_Config.OversamplingRatio = 16;
    // ... 其他配置
}

// 2. 动态基线跟踪与自适应阈值核心逻辑
uint16_t g_u16Baseline = 0;    // 动态基线
uint16_t g_u16Threshold = 30;   // 初始阈值
#define BASELINE_ALPHA    0.01  // 基线平滑系数
#define HYSTERESIS        5     // 迟滞值,防抖动

uint8_t TouchKey_Scan(uint16_t rawValue) {
    static uint8_t stableCount = 0;
    
    // 动态更新基线(平滑滤波)
    g_u16Baseline = (uint16_t)((float)g_u16Baseline * (1.0 - BASELINE_ALPHA) + (float)rawValue * BASELINE_ALPHA);
    
    // 计算信号差值
    int16_t diff = (int16_t)(g_u16Baseline - rawValue);
    
    // 自适应阈值:信号强时阈值可稍高,抗干扰;信号弱时阈值降低,保灵敏度
    uint16_t dynamicThreshold = g_u16Threshold;
    if (diff > 100) { // 强信号区域
        dynamicThreshold = g_u16Threshold + 10;
    }
    
    // 判断触摸
    if (diff > dynamicThreshold) {
        stableCount++;
        if (stableCount >= 3) { // 连续3次满足条件,确认为有效触摸
            stableCount = 0;
            return 1; // 触摸按下
        }
    } else {
        stableCount = 0;
    }
    return 0; // 无触摸
}

// 3. 长按功能状态机(简化示例)
typedef enum {
    KEY_STATE_IDLE,
    KEY_STATE_PRESSED,
    KEY_STATE_LONG_PRESS
} KeyState_t;

void Key_LongPress_Handler(void) {
    static KeyState_t state = KEY_STATE_IDLE;
    static uint32_t pressTick = 0;
    
    switch(state) {
        case KEY_STATE_IDLE:
            if (TouchKey_Scan(GetRawValue()) == 1) {
                state = KEY_STATE_PRESSED;
                pressTick = GetSystemTick(); // 记录按下时刻
            }
            break;
        case KEY_STATE_PRESSED:
            if (TouchKey_Scan(GetRawValue()) == 0) {
                state = KEY_STATE_IDLE; // 松开,短按
            } else if ((GetSystemTick() - pressTick) > 1000) { // 按下超过1秒
                state = KEY_STATE_LONG_PRESS;
                ExecuteLongPressAction(); // 执行长按功能
            }
            break;
        case KEY_STATE_LONG_PRESS:
            if (TouchKey_Scan(GetRawValue()) == 0) {
                state = KEY_STATE_IDLE; // 松开,结束
            }
            break;
    }
}

四、 应用场景与思考

该方案已成功应用于:

  • 智能家居:高端智能马桶的一体化厚玻璃面板、嵌入式厨房电器控制面板。

  • 工业HMI:带有防护玻璃的工业设备触摸控制界面,要求高可靠性。

  • 创新产品:任何需要实现“隔空”或“隔厚板”触摸的交互设计。

未来的优化方向

  1. 多材质自适应:尝试通过算法自动识别不同介质的介电常数(如玻璃、亚克力、木质),实现“即贴即用”。

  2. 低功耗优化:针对电池供电设备,深度优化扫描策略与休眠模式。

五、 结语

在硬件成本受限的情况下,通过深入的软件算法优化,往往能挖掘出芯片的深层潜力,解决看似棘手的工程难题。本次“厚玻璃触摸”项目的实践再次证明了这一点。软硬件的协同设计,永远是嵌入式工程师最具价值的武器。

技术无界,交流有益。​ 希望这篇分享能为大家在类似项目中带来一些启发。如果你也在为触摸应用中的特定问题寻找方案,或者对这个模块的具体实现有更深入的兴趣,欢迎在评论区留言交流。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐