4. 触摸采样率优化:提高触摸控制器采样率的方法与硬件配置技巧

触摸采样率,说白了就是触摸控制器每秒报告触摸位置的次数。单位是 Hz。你想想看,如果采样率只有 60Hz,那每秒只报告 60 次位置,而你的屏幕刷新率可能是 60fps 甚至 120fps。手指滑过去,中间的位置信息丢了一大半,触摸交互自然就不跟手了。

我个人习惯,做 TouchGFX 项目时,采样率至少得是屏幕刷新率的 1.5 到 2 倍。比如屏幕跑 60fps,触摸采样率最好能到 90Hz 以上。但实际做起来,你会发现很多硬件默认配置根本达不到这个数。嗯,这里要注意,不是换个寄存器值就完事了,得从硬件到驱动一层层排查。

4.1 采样率为什么上不去?

我在项目中遇到过好几次,明明芯片手册说触摸控制器支持 200Hz,实际测出来只有 80Hz。问题出在哪?我总结了几条常见瓶颈:

  • I²C 总线速度太低:很多触摸控制器通过 I²C 上报数据。如果 I²C 时钟只有 100kHz,每次传输要花 1-2ms,再加上协议开销,采样率自然上不去。
  • 触摸控制器内部转换时间太长:有些芯片为了省电,默认把 ADC 采样周期设得很长。你得手动把转换速度提上去。
  • MCU 端轮询或中断处理不及时:就算触摸 IC 能跑 200Hz,MCU 这边如果中断优先级低,或者轮询间隔太大,数据也会被丢掉。
  • 滤波算法引入延迟:有些驱动里加了滑动平均或卡尔曼滤波,滤波窗口越大,延迟越高,等效采样率就降下来了。

核心原则:采样率优化的本质是缩短「触摸事件 → MCU 收到数据」这条链路上的每一环耗时。不要只盯着触摸 IC 的寄存器改,要全链路排查。

4.2 硬件配置技巧:从触摸 IC 到 MCU

下面我按实际调试顺序,把每个环节的配置方法列出来。这些技巧我在好几个量产项目里验证过,效果很稳定。

4.2.1 触摸 IC 端配置

大多数触摸控制器(比如 FT5x06、GT911、CST8xx 系列)都有采样率相关的寄存器。以我常用的 FT5x06 为例:

// FT5x06 采样率配置示例
// 寄存器 0x88: 工作模式,默认 0x00(普通模式)
// 寄存器 0x89: 采样周期,单位 1ms,默认 0x0A(10ms → 100Hz)

#define FT5X06_MODE_REG      0x88
#define FT5X06_PERIOD_REG    0x89

void ft5x06_set_sample_rate(uint16_t rate_hz) {
    uint8_t period_ms = 1000 / rate_hz;
    if (period_ms < 3) period_ms = 3;  // 硬件限制,最低 3ms
    if (period_ms > 20) period_ms = 20;

    i2c_write_reg(FT5X06_ADDR, FT5X06_PERIOD_REG, period_ms);
    // 同时切换到高速模式
    i2c_write_reg(FT5X06_ADDR, FT5X06_MODE_REG, 0x01);
}

注意,不是所有触摸 IC 都允许你随便改。有些芯片的采样周期和扫描通道数挂钩,通道越多,周期越长。我建议你仔细看数据手册里的「Scan Time」表格。

触摸 IC 型号 默认采样率 可配置范围 配置寄存器
FT5x06 100 Hz 50 ~ 333 Hz 0x89 (Period)
GT911 100 Hz 50 ~ 200 Hz 0x8040 (Refresh Rate)
CST8xx 80 Hz 60 ~ 160 Hz 0x80 (Scan Period)

4.2.2 I²C 总线提速

触摸 IC 和 MCU 之间最常用的就是 I²C。默认 100kHz 标准模式太慢了,我一般直接拉到 400kHz 快速模式。如果硬件支持,甚至可以上 1MHz 高速模式。

但提速有个前提:上拉电阻要匹配。我曾经在一个项目里把 I²C 从 100kHz 改到 400kHz,结果通信频繁出错。查了半天,发现上拉电阻用的是 10kΩ,对于 400kHz 来说太大了,信号上升沿太慢。换成 2.2kΩ 后问题解决。

经验值:400kHz I²C 建议用 2.2kΩ ~ 4.7kΩ 上拉;1MHz 建议用 1kΩ ~ 2.2kΩ。具体值根据总线电容算一下,别凭感觉选。

4.2.3 MCU 端中断与 DMA

触摸数据来了,MCU 得赶紧去读。我见过太多人用轮询方式读触摸,主循环里每隔几毫秒去查一次。这种方式采样率完全不可控,主循环一卡,触摸就丢数据。

我的做法是:

  1. 用触摸 IC 的 INT 引脚触发中断,边沿触发,优先级设高一点。
  2. 中断服务函数里只做一件事:通过 DMA 把触摸数据从 I²C 搬进内存。不要在 ISR 里做滤波、坐标转换这些事。
  3. 在主循环或 RTOS 任务里处理数据,这样中断占用时间极短,不会影响采样率。
// 伪代码:中断 + DMA 读取触摸数据
void touch_irq_handler(void) {
    // 触发 DMA 传输,从 I²C 读取 6 字节触摸数据
    dma_start(I2C_PERIPH, touch_buffer, 6, DMA_COMPLETE_CALLBACK);
    // ISR 立即返回,不阻塞
}

void dma_complete_callback(void) {
    // DMA 传输完成,在主上下文处理触摸数据
    osMessageQueuePut(touch_queue, touch_buffer, 0, 0);
}

4.3 采样率与功耗的权衡

采样率不是越高越好。你想想看,采样率 200Hz 意味着触摸 IC 每 5ms 就要做一次完整的扫描和转换,功耗比 100Hz 时翻一倍。对于电池供电的设备,这是个不小的代价。

我一般这样权衡:

  • 插电设备:直接拉到触摸 IC 支持的最高采样率,不用考虑功耗。
  • 电池设备,屏幕常亮:采样率设到屏幕刷新率的 1.5 倍,比如 60fps 屏幕配 90Hz 触摸。
  • 电池设备,屏幕休眠:采样率降到 20-30Hz,或者干脆关闭触摸,等用户唤醒再恢复。

注意:有些触摸 IC 在低采样率模式下会自动进入省电状态,从省电状态恢复到正常工作需要额外时间(几毫秒到十几毫秒)。如果你需要快速响应,建议不要用芯片自带的省电模式,而是自己在 MCU 端控制触摸 IC 的供电。

4.4 验证采样率是否真的提升了

改完寄存器、调完 I²C 速度,怎么知道采样率到底有没有上去?我习惯用逻辑分析仪抓 INT 引脚的电平变化。每次触摸数据准备好,INT 引脚会拉低(或拉高),两个 INT 边沿之间的时间间隔就是采样周期。

具体做法:

  1. 用逻辑分析仪抓 INT 引脚,采样率设到 1MHz 以上。
  2. 手指按住触摸屏不动,INT 引脚应该以固定频率输出脉冲。
  3. 测量相邻两个脉冲的间隔,取 10 次平均值,换算成 Hz。

如果测出来的值远低于你配置的目标值,那就说明链路中还有瓶颈。我遇到过最坑的一次,是触摸 IC 的固件版本太老,不支持高速模式,改寄存器根本没反应。换了新固件版本才解决。

4.5 本章知识体系

下面这张图把采样率优化的核心链路和关键配置点串起来了,你可以对照着排查自己的项目。

触摸采样率优化核心链路 触摸 IC 采样配置 I²C 总线传输 MCU 中断 / DMA 触摸数据处理 TouchGFX 交互 关键配置点 • 采样周期寄存器 • 工作模式选择 • I²C 时钟频率 • 上拉电阻匹配 • 中断优先级 • DMA 传输配置 • 滤波算法延迟 • 数据队列缓冲 • 采样率 vs 功耗 • 逻辑分析仪验证 验证方法 1. 逻辑分析仪抓 INT 引脚 2. 测量脉冲间隔 3. 换算实际采样率 4. 对比目标值

从这张图可以看得很清楚:采样率优化不是改一个寄存器就完事,而是从触摸 IC 到 TouchGFX 的全链路优化。每一环都可能成为瓶颈,每一环都需要你亲手去验证。