2、电阻式触摸屏(上):四线电阻屏的结构与工作原理
电阻式触摸屏,说白了就是靠「压」来工作的。你用手指或者触控笔按下去,屏幕就能感知到位置。这技术虽然听起来简单,但里面有不少门道。我最早接触电阻屏是在做一款工业手持设备的时候,那时候电容屏还没普及,电阻屏是主流。嗯,今天我们就来聊聊四线电阻屏的结构和工作原理。
2.1 四线电阻屏的物理结构
四线电阻屏的结构其实不复杂,但每一层都有它的作用。我把它拆成三个核心部分来讲。
核心结构三件套:
- ITO 玻璃(底层)—— 硬质基板,上面镀了一层透明的氧化铟锡(ITO)导电层。这层是固定的,不会动。
- ITO 薄膜(顶层)—— 柔性塑料薄膜,内侧也镀了 ITO 导电层。这层是可以被压下去的。
- 隔离点(Spacer Dots)—— 在两层 ITO 之间,均匀分布着微小的绝缘颗粒。它们的作用是让两层 ITO 在没被按压时保持分离。
你想想看,如果没有这些隔离点,两层 ITO 就会直接贴在一起,那屏幕就永远处于「被按下」的状态了。我在项目中遇到过一批屏幕,隔离点印刷不均匀,导致屏幕边缘区域灵敏度异常——轻轻一碰就触发,但中间区域却要用力按。后来排查发现是隔离点高度不一致造成的。
四线电阻屏的「四线」指的是从两层 ITO 上引出的四根电极线。底层 ITO 引出 X+ 和 X-,顶层 ITO 引出 Y+ 和 Y-。为什么叫「四线」?就是因为这四根线。
2.2 工作原理:电压分压法
电阻屏的核心原理就是「电压分压」。说白了,就是利用 ITO 层的电阻特性,把触摸点的位置转换成电压值。
ITO 层本身是有电阻的,而且电阻是均匀分布的。当我们在 ITO 层的两端加上一个参考电压(比如 5V),那么在这层上任意一点的电压,就正比于该点到接地端的距离。这就是分压原理。
我的经验: 四线电阻屏的 ITO 层电阻率通常在 200~1000 Ω/sq(欧姆每方)之间。电阻率太低,分压信号太弱,ADC 不好采;电阻率太高,功耗和噪声都会变大。我一般选 350~500 Ω/sq 的料,性价比和性能比较均衡。
具体到坐标采集,分两步走:
- X 坐标采集: 在底层 ITO 的 X+ 和 X- 之间加电压(比如 X+ 接 Vref,X- 接 GND)。顶层 ITO 的 Y+ 作为探针,检测触摸点的电压。这个电压值就对应 X 坐标。
- 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 值,然后做线性映射。如果要求高,可以用五点校准(四角加中心)。