2、电阻式触摸屏(上):四线电阻屏的结构与工作原理

电阻式触摸屏,说白了就是靠「压」来工作的。你用手指或者触控笔按下去,屏幕就能感知到位置。这技术虽然听起来简单,但里面有不少门道。我最早接触电阻屏是在做一款工业手持设备的时候,那时候电容屏还没普及,电阻屏是主流。嗯,今天我们就来聊聊四线电阻屏的结构和工作原理。

2.1 四线电阻屏的物理结构

四线电阻屏的结构其实不复杂,但每一层都有它的作用。我把它拆成三个核心部分来讲。

核心结构三件套:

  • ITO 玻璃(底层)—— 硬质基板,上面镀了一层透明的氧化铟锡(ITO)导电层。这层是固定的,不会动。
  • ITO 薄膜(顶层)—— 柔性塑料薄膜,内侧也镀了 ITO 导电层。这层是可以被压下去的。
  • 隔离点(Spacer Dots)—— 在两层 ITO 之间,均匀分布着微小的绝缘颗粒。它们的作用是让两层 ITO 在没被按压时保持分离。

你想想看,如果没有这些隔离点,两层 ITO 就会直接贴在一起,那屏幕就永远处于「被按下」的状态了。我在项目中遇到过一批屏幕,隔离点印刷不均匀,导致屏幕边缘区域灵敏度异常——轻轻一碰就触发,但中间区域却要用力按。后来排查发现是隔离点高度不一致造成的。

四线电阻屏的「四线」指的是从两层 ITO 上引出的四根电极线。底层 ITO 引出 X+ 和 X-,顶层 ITO 引出 Y+ 和 Y-。为什么叫「四线」?就是因为这四根线。

四线电阻屏结构示意图 ITO 薄膜(顶层)—— Y+ / Y- 隔离点(Spacer Dots) ITO 玻璃(底层)—— X+ / X- 玻璃基板 X+ X- Y+ Y- 按压

2.2 工作原理:电压分压法

电阻屏的核心原理就是「电压分压」。说白了,就是利用 ITO 层的电阻特性,把触摸点的位置转换成电压值。

ITO 层本身是有电阻的,而且电阻是均匀分布的。当我们在 ITO 层的两端加上一个参考电压(比如 5V),那么在这层上任意一点的电压,就正比于该点到接地端的距离。这就是分压原理。

我的经验: 四线电阻屏的 ITO 层电阻率通常在 200~1000 Ω/sq(欧姆每方)之间。电阻率太低,分压信号太弱,ADC 不好采;电阻率太高,功耗和噪声都会变大。我一般选 350~500 Ω/sq 的料,性价比和性能比较均衡。

具体到坐标采集,分两步走:

  1. X 坐标采集: 在底层 ITO 的 X+ 和 X- 之间加电压(比如 X+ 接 Vref,X- 接 GND)。顶层 ITO 的 Y+ 作为探针,检测触摸点的电压。这个电压值就对应 X 坐标。
  2. Y 坐标采集: 切换方向。在顶层 ITO 的 Y+ 和 Y- 之间加电压,底层 ITO 的 X+ 作为探针,检测触摸点的电压。这个电压值对应 Y 坐标。

为什么会这样?因为当你按下屏幕时,顶层和底层的 ITO 在触摸点处接触了。这时候,一层作为「电阻分压器」,另一层作为「电压探针」,就能读出位置信息。

2.3 驱动时序与 X/Y 坐标采集

驱动时序是让电阻屏正常工作的关键。我见过不少新手工程师,硬件电路画对了,但时序没处理好,导致坐标跳变、抖动严重。嗯,这里要注意。

标准的四线电阻屏驱动时序是这样的:

阶段 X+ X- Y+ Y- ADC 采样
待机 高阻 高阻 高阻 高阻 无
X 采集 Vref GND ADC 输入 高阻 Y+ 电压 → X 坐标
Y 采集 ADC 输入 高阻 Vref GND X+ 电压 → Y 坐标

你看这个表格,关键点在于:X 采集和 Y 采集是分时进行的。每次只能测一个轴。而且,在切换方向之前,需要让电路稳定一小段时间——这个时间叫「建立时间(Settling Time)」。

我曾经踩过的坑: 有一次我为了追求采样速度,把建立时间设得太短,结果坐标数据跳得厉害。后来用示波器一看,电压还没稳定下来 ADC 就开始采了。建议建立时间至少留 1~2 μs,如果 ITO 负载电容大,可能需要 5 μs 以上。

下面是一个典型的驱动时序代码片段,我用伪代码来表示,方便你理解:

// 四线电阻屏 X/Y 坐标采集伪代码
void Touch_ReadXY(uint16_t *x, uint16_t *y) {
    // 1. X 坐标采集
    GPIO_X_PLUS  = VREF;      // X+ 接参考电压
    GPIO_X_MINUS = GND;       // X- 接地
    GPIO_Y_PLUS  = ADC_IN;    // Y+ 配置为 ADC 输入
    GPIO_Y_MINUS = HIGH_Z;    // Y- 高阻
    delay_us(2);              // 等待建立时间
    *x = ADC_Read(Y_PLUS);    // 从 Y+ 读取电压 → X 坐标

    // 2. Y 坐标采集
    GPIO_Y_PLUS  = VREF;      // Y+ 接参考电压
    GPIO_Y_MINUS = GND;       // Y- 接地
    GPIO_X_PLUS  = ADC_IN;    // X+ 配置为 ADC 输入
    GPIO_X_MINUS = HIGH_Z;    // X- 高阻
    delay_us(2);              // 等待建立时间
    *y = ADC_Read(X_PLUS);    // 从 X+ 读取电压 → Y 坐标
}

这段代码看起来简单,但实际项目中要注意几个细节:

  • GPIO 模式切换: 同一个引脚在不同阶段要切换功能(输出 Vref、GND、高阻、ADC 输入)。如果 MCU 的 GPIO 不支持快速模式切换,可以用模拟开关来分担。
  • ADC 分辨率: 一般用 10 位或 12 位 ADC。10 位 ADC 对应 1024 个量化等级,对于 4.3 寸以下的屏幕够用了。大屏建议用 12 位。
  • 去抖动: 机械接触会有抖动,我习惯连续采 3~5 次,取中值或者平均值,能有效减少误触发。

2.4 坐标换算

ADC 读到的原始值是一个电压值,需要换算成像素坐标。假设屏幕分辨率为 W × H,ADC 参考电压为 Vref,那么:

X_pixel = (ADC_X * W) / ADC_MAX
Y_pixel = (ADC_Y * H) / ADC_MAX

但这里有个坑:ITO 层的电阻不是绝对均匀的,边缘区域会有非线性。我做过一批屏幕,左上角和右下角的线性度差了 3% 左右。这时候就需要做校准——用两点校准或者多点校准来修正。

我的建议: 量产时一定要做屏幕校准。最简单的两点校准:在屏幕的左上角和右下角各点一次,记录 ADC 值,然后做线性映射。如果要求高,可以用五点校准(四角加中心)。