This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TSC2003:报告触摸屏位置错误

Guru**** 2511985 points
Other Parts Discussed in Thread: TSC2003

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1061975/tsc2003-touchscreen-position-falsely-reported

器件型号:TSC2003

我有一个 DMC 模拟电阻式触摸屏、可通过传统的4线接口与 TSC2003连接。  触摸将导致 TSC2003生成中断。  中断处理程序随后唤醒触摸屏任务、该任务负责检索触摸坐标并将其传递到应用层进行处理。

触摸屏任务由表格驱动。  每个表条目标识要执行的函数(即读取)。  读取之间存在一(1)毫秒的延迟。  执行完所有功能后、任务返回睡眠状态。  所有读取在12位模式下执行。  X/Y/Z 驱动程序在读取 X/Y/Z 坐标之前打开。  每个命令中的 PD1-PD0设置为"11"以禁用中断、打开内部基准并打开 ADC。  执行的最后一个函数是读取 VB1。  我不关心电压读数、但使用命令将 PD1-PD0设置为"10"以启用中断、保持内部基准打开并关闭 ADC。

观察到以下情况:

  • X/Y/Z 值出现在第一个数据字节中。  第二个数据字节中的 D3-D0始终为0x0F。
  • 第一个数据字节中的值偶尔会报告为0x00或0xFF。
  • "机械指"用于在固定位置反复触摸屏幕。  X/Y 坐标通常在五(5)个像素之间。  但是、在测试过程中会报告"传单"、该广告不在固定印刷位置附近。

我们的应用要求准确报告触控情况。  "传单"是不可接受的。

我已经尝试再次读取 X/Y/Z (即去抖)。  我丢弃 X/Y 测量值为0x00/0xFF 或两个读数之间的差值为10像素或更大的任何读数。  这极大地消除了错误读数。  但是、我仍然会遇到传单出现的实例、两组测量都显示为有效触摸。

问题:

  • TSC2003将采样动态吞吐率列出为50ksps (例如、0.00002秒)。  中断后必须以多快的速度进行测量是否有任何时序要求?  我显然受到 I2C 总线速度和读取之间自我施加的毫秒延迟的限制。
  • 一旦 X/Y/Z 驱动程序被激活、它们是否曾经被关闭?
  • 我对 VB1的读取是否会影响下一个中断的测量值。  将 PD1-PD0的设置移动到"10"到第二次 Z 测量没有帮助。
  • 我并不关心节能。  我的理解是、仅电池和辅助输入测量需要内部基准。  是否存在/不存在内部基准电压影响 X/Y/Z 测量?
  • 我已使用第二个方程式进行压力测量、因为它仅需要 X、Y 和 Z1测量。  我的机械指在屏幕上施加相当一致的压力。  但是、随着手指移动到触摸屏的各个部分、RTOUCH 的计算值会有很大的变化。  这是否会受到 D3-D0始终为0x0F 的影响?  当我更改为8位模式时、测量值不会改变。  4096常量是否会更改为256?

我已经阅读过几次数据表。  这不应该是那么困难。  我必须俯瞰一些简单的东西。

提前感谢每个人的时间和麻烦。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    应在12月16日之前答复。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     X Y 引脚上是否安装了任何外部电容器。 如果是、您应该将其移除以执行测试

    查看是否有任何改进。

    您是否正在使用 EVM 或您是否进行了自己的设计? 您能否发送本节原理图的副本?

    您可以尝试以下测试:我们尝试仅激活不带中断功能的 X 测量、以查看是否获得稳定值。

    启动

    器件地址0x90

    控制字节   0xC4

    停下

    等待20us

    启动

    地址0x91

    读取数据字节 2

    读取数据字节 1

    停下

    每20毫秒重复此操作。

    在屏幕上移动手指时检查 x 数据。 它在没有任何异常的情况下保持稳定。

    您也可以在 CRO 上观看。 将 x+x-和 Y+放在 CRO 上。 当 X+为高电平且 X-为0时、Y+将具有 X 值

    电压范围为0至3.3V。

    也许此测试会提示设置可能出现什么问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们的硬件设计在触摸屏和控制器之间的4线连接上未采用精密电容器。  但是、我们在这两者之间确实有 EMC 滤波器、但在本次测试中未移除这些滤波器。

    我正在运行 VxWorks 并使用其 I2C 驱动程序。

    Saleae Logic Pro 8正在监控 I2C 流量。 SCL 的运行频率大约为360KHz (即接近 I2C 快速模式的顶端)。 VxWorks I2C 驱动程序可在大约160微秒内向外发送地址和命令字节。 地址/测量 X 命令与后续地址/读取请求之间的时间大约为60微秒。 2字节读取响应在读取命令的大约90微秒内返回。 在每个"测量 X"命令之间插入了20毫秒的延迟。

    使用断点来捕获数据、甚至缓冲数据以供后续检查是不切实际的。 我添加了"instrumentation (检测)"以将值实时转储到 telnet 端口。 每个措施 X 命令都将其响应写入 telnet。 连续执行25次读取请求,然后延迟3秒,以确保发送所有 telnet 流量。 这也使我能够在触摸屏上的样本之间清晰地重新定位手指。  下面是一个结果示例:

    0002341738 -采样25:测量_X [0x0E][0xFF]
    0002341758 -采样24:测量_X [0x0E][0xFF]
    0002341778 -采样23:测量_X [0x0E][0xFF]
    0002341798 -采样22:测量_X [0x0E][0xFF]
    0002341818 -采样21:测量_X [0x0E][0xFF]
    0002341838 -采样20:测量_X [0x0E][0xFF]
    0002341858 -采样19:测量_X [0x0E][0xFF]
    0002341878 -采样18:测量_X [0x0E][0xFF]
    0002341898 -样片17:测量_X [0x0E][0xFF]
    0002341918 -采样16:测量_X [0x0E][0xFF]
    0002341938 -示例15:测量_X [0x0E][0xFF]
    0002341958 -样片14:测量_X [0x0F][0xFF]
    0002341978 -采样13:测量_X [0x0E][0xFF]
    0002341998 -采样12:测量_X [0x0F][0xFF]
    0002342018 -样片11:测量_X [0x0E][0xFF]
    0002342038 -样片10:测量_X [0x0E][0xFF]
    0002342058 -样片09:测量_X [0x0E][0xFF]
    0002342078 -样片08:测量_X [0x0E][0xFF]
    0002342098 -样片07:测量_X [0x0E][0xFF]
    0002342118 -样片06:测量_X [0x0E][0xFF]
    0002342138 -样片05:测量_X [0x0F][0xFF]
    0002342158 -样片04:测量_X [0x0E][0xFF]
    0002342178 -样片03:测量_X [0x0E][0xFF]
    0002342198 -采样02:测量_X [0x0E][0xFF]
    0002342218 -采样01:测量_X [0x0F][0xFF]

    请注意、所有读取的第二个字节为0xFF。  这不符合我对数据表的理解。

    每个前的值是由 VxWorks 维护的内部毫秒计数器。

    由于我在轮询屏幕、因此无法像在中断版本中那样生成瞬时单次触摸。 我使用手指尖或触笔(即铅笔)在屏幕上保持恒定的压力。 正如预期的那样、"Measure X"返回的值在屏幕顶部接近0x0、在屏幕底部接近0xFF 的值。 只要我将压力保持在同一位置、我就会看到值略有变化(例如+/- 0x01)。  然而,结果是稳定的。

    我发现有趣的是、在没有任何屏幕接触的情况下、这些值会缓慢地向0x80 (即屏幕中间)移动。 如果我触摸屏幕顶部并拔下手指、我会看到报告的值从0x0B 附近开始、在几分钟内逐渐接近0x80。  对此我没有解释。 这种"不应"导致中断驱动的应用程序中出现任何问题。

    我将轮询测试扩展为包括 Y 测量值(即、读取命令0xD4)。 最初、我没有在测量 Y 和测量 X 之间插入延迟。我在读取每个对之间仍然有20毫秒的延迟。

    由于没有屏幕接触、与先前的测试不同、值在0x80中心点周围变化很大。 例如、

    0000070468 -样片01:测量_Y [0x8C][0xFF]测量_X [0x85][0xFF]
    0000070488 -采样02:测量_Y [0x76][0xFF]测量_X [0x8A][0xFF]
    0000070508 -样片03:测量_Y [0x87][0xFF]测量_X [0x89][0xFF]
    0000070528 -样片04:测量_Y [0x89][0xFF]测量_X [0x7E][0xFF]
    0000070548 -采样05:测量_Y [0x81][0xFF]测量_X [0x86][0xFF]
    0000070568 -样片06:测量_Y [0x8B][0xFF]测量_X [0x7C][0xFF]
    0000070588 -样品07:测量_Y [0x86][0xFF]测量_X [0x83][0xFF]
    0000070608 -样片08:测量_Y [0x8E][0xFF]测量_X [0x79][0xFF]
    0000070628 -采样09:测量_Y [0x81][0xFF]测量_X [0x85][0xFF]
    0000070648 -采样10:测量_Y [0x8D][0xFF]测量_X [0x7B][0xFF]
    0000070668 -采样11:测量_Y [0x7F][0xFF]测量_X [0x87][0xFF]
    0000070688 -样片12:测量_Y [0x8B][0xFF]测量_X [0x7C][0xFF]
    0000070708 -样片13:测量_Y [0x7E][0xFF]测量_X [0x88][0xFF]
    0000070728 -示例14:测量_Y [0x8A][0xFF]测量_X [0x7E][0xFF]
    0000070748 -样片15:测量_Y [0x7D][0xFF]测量_X [0x89][0xFF]
    0000070768 -样片16:测量_Y [0x89][0xFF]测量_X [0x85][0xFF]
    0000070788 -样片17:测量_Y [0x76][0xFF]测量_X [0x8A][0xFF]
    0000070808 -样本18:测量_Y [0x87][0xFF]测量_X [0x89][0xFF]
    0000070828 -样片19:测量_Y [0x72][0xFF]测量_X [0x89][0xFF]
    0000070848 -样片20:测量_Y [0x84][0xFF]测量_X [0x89][0xFF]
    0000070868 -采样21:测量_Y [0x87][0xFF]测量_X [0x7F][0xFF]
    0000070888 -采样22:测量_Y [0x92][0xFF]测量_X [0x80][0xFF]
    0000070908 -样片23:测量_Y [0x8B][0xFF]测量_X [0x79][0xFF]
    0000070928 -样片24:测量_Y [0x81][0xFF]测量_X [0x86][0xFF]
    0000070948 -采样25:测量_Y [0x8C][0xFF]测量_X [0x7B][0xFF]

    (请注意、我将采样编号从25..1更改为1..25。 这纯粹是装饰。)

    当实际触摸屏幕时、X 和 Y 值保持相当稳定。 在25个采样中、它们在高值和低值之间的变化幅度高达0x03。

    正如预期的那样、"测量 Y"返回的值在屏幕右侧接近0x0、在屏幕左侧接近0xFF。

    我在所有读取之间增加了20毫秒的延迟、以查看"无触摸"读数是否有所改善。

    我再次展开轮询测试以包括 Z 测量(即、读取命令0xE4)。 我保留了每个读取命令之间的20毫秒延迟。

    "无接触"结果让我感到惊讶。 考虑以下因素:

    0000047578 -样片08:测量_Y [0x00][0xFF]测量_X [0xFE][0xFF]测量_Z1 [0x00][0xFF]

    测量 X 值在0xFD 和0xFF 之间变化、测量 Y 始终为0x00、测量 Z1在0x00和0x02之间变化。 为何只需添加测量 Z1便可实现突然变化? 在每次读取之前打开 X、Y 和 Z 驱动器不会对新的一组非触摸值或值的变化产生影响。

    手动屏幕触摸结果符合预期。  只要保持屏幕压力、值就会稳定。

    这次投票得出了以下结论:
    1) I2C 命令之间的任何额外编程延迟(例如20毫秒)似乎不是必需的。 VxWorks I2C 驱动器引入的延迟就足够了。
    2) 2) X/Y/Z 测量可在内部基准电压始终关闭的情况下进行。
    3) 3) ADC 始终保持开启状态。
    4) 4)测量 VB1命令可以从"状态机"中删除。 其唯一目的是关闭 ADC。 这将导致性能略有改善。

    请对这些问题作出答复。

    我的下一个任务是将这些更改合并到我们应用程序的中断版本代码中、但这将需要等到下周。

    再次感谢您抽出宝贵的时间来解决问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    明天将向您发送回复。

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我对延误的答复表示歉意。

    是否使用 控制字节 0xC6? 这将选择8位模式。 0xc4为12位模式

    下面的文本是数据表中的一个片段。 我无法肯定地说,但这意味着在8位模式下,Databyte 不是 D11-D0拆分2个字节,而是 D8-D0拆分1个字节。 这也许是您在1字节上获得0-255的输出、而在另一字节上获得0xFF 的原因。

    切换到12位模式可能是一个想法、就像一个测试一样、然后2个字节可能开始显示值。

    我尝试对无触摸行为进行可能的描述。

    触摸屏的 X 和 Y 板是线性电阻器。 下图显示了 Y 的测量结果、其中 Y+和 Y-信号通电。 当我们物理接触面板时、y 触控位置的电压通过一个电阻(标有蓝色)连接到 X焊 丝、该电阻取决于 X 位置。 由于 X 电极馈入具有高阻抗的 ADC、因此 ADC 读取 Y 电压。 当我们移除触控时、ADC 输入保持浮动(蓝色的电阻开路)、 并且在瞬间移除其输入电容上的电压会通过输入阻抗放电、从而提供下降的电压。  如果引脚上没有放置高频电容器,它也会对拾取敏感。

    我想非触摸值不是那么重要

    一些答案:

    1.不需要20毫秒。

    2. X、Y、Z 测量可在内部基准关闭的情况下进行。

    3.我相信 ADC 保持开启是可以的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我似乎通过从中断处理程序中删除电池测量来减少错误触摸的数量。 测量/读取命令字节将 PD1/PD0设置为"01"、以禁用 PENIRQ、关闭内部基准并打开 ADC。 然后、我针对每个中断测量 Y、X、Z、Y、X、 和 Z。我上次读取 Y 一次、但将 PD1/PD0设置为"00"以启用 PENIRQ 并在中断之间关闭控制器。

    我仅使用12位模式(即、模式位设置为"0")。 我对8位和12位操作进行了比较测试。 我发现在12位模式下返回的2字节值始终显示为0x##和0xFF、其中0x##也将在8位模式下返回。 12位值从不会跨越数据表提到的两个字节。

    我想知道、执行压力测量是否有助于确定触摸的有效性。 触摸屏数据表列出了200至1000欧姆的板电阻。 这是可接受的范围吗? 我的理解是、Rtouch 随着触摸压力(或压低区域的大小)增大而减小。 TSC2003数据表中的 Rtouch 公式引用了 X 和 Y 板电阻、但会使用什么值? 同样、触摸测量实际上是如何执行的? 我是否测量 X/Y/Z、然后计算 Rtouch? 第14页的公式3提出了另一个两难问题。 当我用手指在屏幕上移动时、X/Y 坐标将发生变化。 假设我用"相同"的手指压力(即 Z1)触摸屏幕、Rtouch 将发生变化。 这又回到了这些方程中板电阻是否保持恒定的问题。

    我之前关于压力测量公式中8位与12位数据的问题仍然存在。 常数在两种模式之间如何变化?

    我有一种(不正确)印象、即为初始触摸生成一个中断、为释放生成第二个中断。 情况似乎并非如此。 观察示波器上的 I2C、我会得到多个中断(例如、触摸、触摸和释放)。 这是否符合预期? 我正在记录初始触摸的位置、忽略所有后续触摸、并等待 Z1变为零(0)以指示释放。 TSC2003数据表将最大相对精度列为+/-2" LSB。" 这是否意味着我应该将任何小于或等于2的 Z1测量值视为一个释放?

    再次提前感谢您抽出宝贵的时间来解决问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我明天会向你作出答复

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    从最高优先级到最低优先级的未决问题:

    • TSC2003控制器如何决定何时生成中断?
    • 对 X/Y 测量值为什么为0x00或0xFF 有任何解释?
    • 中断后必须以多快的速度进行测量、是否有任何时序要求/建议?
    • 最大相对精度列为+/-2" LSB "。 测量值应如何考虑这一点?
    • (新)图12和13提供了 I2C 串行写入/读取样本。 是否有任何 TSC2003 (即 I2S 从站)会生成 NACK 的情况?
    • 计算 RTOUCH 的正确方法/顺序是什么?
    • 在8位模式与12位模式下、RTOUCH 方程如何变化?
    • 在计算 RTOUCH 时应使用哪种板电阻值?
    • 为什么 X/Y/Z 测量值不会跨越第一个和第二个数据字节? (我认为我们已经确定仅使用第一个字节。)

    再次感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    中断:

    如果命令字节的 PD0=0、那么在转换结束时、中断被启用。 触摸屏幕将产生中断。

    多次触摸屏幕将产生多个中断。 这会一直持续到 I2C 被发送到器件并进行器件确认。

    然后中断被禁用。 可能是您没有写入器件、并且中断未被禁用。

    --------

    12位的行为很奇怪。 通常、12位读取应该在两个字节上都有一些内容。 我建议查看具有示波器的 I2C、

    --------------------------------------

    3.

    • 中断后必须以多快的速度进行测量、是否有任何时序要求/建议?

    我相信,如果在中断后立即发送地址+命令字节,则可以读取数据。

    ----------

    最大相对精度列为+/-2"LSB。 测量值时应如何考虑这一点

     假设您要读取0、ADC 返回的值可能是该值的+-2 LSB。  

    ------

     图12和13提供了 I2C 串行写入/读取样本。 是否有任何 TSC2003 (即 I2S 从站)会生成 NACK 的情况?

     如果主器件在初始字节之后、在发送停止或重复起始条件之前发送额外的命令字节、则 TSC2003不会确认这些字节

    ------------------------

    6.压力测量:本文档是否有帮助?

    https://www.ti.com/lit/an/sbaa155a/sbaa155a.pdf