3. 坐标系统:屏幕物理坐标与触摸坐标的映射关系
做触摸校准,说白了就是在干一件事:把两个坐标系对齐。
你手指点下去,触摸芯片给你一组数字。屏幕要显示响应,它认的是像素位置。这两套坐标天生就不一样,必须找到它们之间的换算关系。我早年刚接触这个领域时,以为直接读坐标就能用,结果画出来的按钮全偏了——嗯,那次教训挺深刻的。
3.1 两个坐标系,到底指什么?
先搞清楚我们面对的是哪两套系统。
| 坐标系 | 来源 | 单位 | 典型范围 |
|---|---|---|---|
| 物理坐标 | 屏幕像素阵列 | 像素(px) | 例如 0~1023(X),0~599(Y) |
| 触摸坐标 | 触摸控制器 ADC 采样 | 原始 ADC 值 | 例如 0~4095(X),0~4095(Y) |
物理坐标由屏幕分辨率决定。比如一块 1024×600 的屏,X 方向 0~1023,Y 方向 0~599。触摸坐标则取决于触摸控制器的 ADC 精度——12 位 ADC 就是 0~4095,10 位就是 0~1023。两者没有天然对应关系。
核心认知:校准的本质,就是求出一个变换矩阵,把触摸坐标映射到物理坐标上。
3.2 映射关系:线性还是非线性?
大多数电阻屏和电容屏,在理想情况下是线性映射。什么意思?
触摸坐标的变化和物理坐标的变化成固定比例。你往右挪 100 个 ADC 值,光标就往右走 50 个像素——这个比例在整个屏上基本一致。
但现实没这么完美。我遇到过一批屏,左上角和右下角的缩放比例差了 5%。这就是非线性误差,通常由以下原因造成:
- 触摸传感器贴合偏差
- ADC 参考电压漂移
- 屏幕玻璃厚度不均
- 触摸屏边缘寄生电容影响
不过别担心,大部分消费级和工业级应用,线性模型已经够用。只有高精度场景(比如医疗触控、绘图板)才需要做非线性校正。
3.3 线性映射的数学基础
线性映射用一组公式就能描述:
X_phys = A * X_touch + B
Y_phys = C * Y_touch + D
这里 A 和 C 是缩放因子,B 和 D 是偏移量。说白了就是:
- 缩放:把触摸坐标的范围拉伸或压缩到物理坐标范围
- 平移:把原点对齐
举个例子。一块 1024×600 的屏,触摸 ADC 是 12 位(0~4095)。如果触摸屏完全覆盖屏幕,且没有安装偏差,那么:
A = 1024 / 4096 ≈ 0.25
B = 0
C = 600 / 4096 ≈ 0.1465
D = 0
但实际中 B 和 D 几乎不会是 0。为什么?因为触摸屏的物理原点通常和屏幕原点不重合——你想想看,触摸传感器贴上去时,总会有几毫米的偏移。
我的习惯:即使理论上 B 和 D 应该是 0,我也会在校准流程中把它们算出来。多算一步,少踩一个坑。
3.4 坐标系转换的完整流程
从触摸坐标到物理坐标,中间要经过三步:
- 原始采集:从触摸控制器读出 ADC 值
- 去噪滤波:去掉抖动和毛刺(后面章节会细讲)
- 坐标映射:用校准参数做线性变换
第三步就是套公式。但这里有个细节——坐标轴方向。有些触摸屏的 X 轴方向和屏幕的 X 轴方向是反的。我遇到过一块屏,触摸向右滑动时 ADC 值反而减小,这就是轴反向。处理方式很简单:
// 如果触摸 X 轴反向
X_phys = A * (MAX_X_TOUCH - X_touch) + B
// 如果触摸 Y 轴反向
Y_phys = C * (MAX_Y_TOUCH - Y_touch) + D
轴反向在校准参数里可以一并吸收,但明确知道方向能帮你快速定位问题。
3.5 校准参数怎么来?
参数 A、B、C、D 不是拍脑袋定的,需要通过多点采样来求解。最少需要两个点(一个算 X,一个算 Y),但实际中至少取三个点,甚至五个点。
为什么?两个点只能解出线性关系,但无法检测旋转误差。三个点可以解出包含旋转的仿射变换。我个人的经验是:
- 两点校准:够用,但精度一般,适合对成本敏感的产品
- 三点校准:工业级常用,能处理旋转和缩放
- 五点校准:消费电子标配,还能检测轻微非线性
求解方法是用最小二乘法拟合。公式不复杂,但手算容易出错。我建议在 PC 上先跑通算法,再移植到嵌入式平台。
曾经踩过的坑:有一次我直接用两点校准,结果屏幕旋转了 2 度,触摸偏差在边缘处达到 15 个像素。后来换成三点校准,问题立刻解决。所以——能上三点就别省。
3.6 坐标系转换的直观理解
光讲公式可能有点抽象。我画了一张图,帮你把整个映射关系看清楚。
从这张图可以看得很清楚:触摸坐标空间里的一个点,经过缩放和平移,落到物理坐标空间里。两个空间的原点位置、坐标范围都不一样,但通过线性变换就能一一对应。
3.7 实际开发中的注意事项
最后聊几个我在项目中反复踩过的坑:
- 坐标溢出:映射后的物理坐标可能超出屏幕范围。一定要做 clamp 处理,否则 UI 控件会飞到屏幕外面去。
- 整数运算精度:嵌入式平台没有浮点单元时,用定点数代替浮点数。我习惯把缩放因子放大 1024 倍,用移位运算来还原。
- 参数存储:校准参数要保存在非易失存储器里。每次开机先读参数,再进入正常触摸流程。
- 坐标系约定:团队内部统一约定触摸坐标和物理坐标的轴方向。我见过因为 X/Y 搞反,调试了两天的案例。
一个小技巧:在校准完成后,做一个简单的验证——在屏幕四个角和中心点分别点一下,看光标是否准确落在目标位置。这一步能快速发现参数错误。
坐标映射是整个触摸校准的数学基础。搞懂了这层关系,后面讲采样、滤波、校准算法时,你就能理解每一步到底在解决什么问题。说白了,所有校准手段最终都是为了求出那四个参数——A、B、C、D。