44.1 初学者重要提示
学习本章节前,务必优先学习第40章,需要对LTDC的基础知识和HAL库的几个常用API有个认识。
LTDC驱动设计和相关问题在第41章有详细说明。
电阻触摸支持2点和4点校准,而电容屏无需校准。
电阻触摸校准解决的是触摸板的线性度问题,而飞点要另外处理,当前程序已经做了支持。总的来说,V6配套的电阻触摸方案已经比较成熟,可以放心用于项目。
44.2 电阻触摸和电容触摸相关知识
这部分知识点在第42章的2.2小节有详细说明,必看。
44.3 电阻屏硬件设计
电阻触摸STMPE811的原理图如下:
通过STMPE811的原理图要了解以下几点:
I2C的两根通信线I2C_SCL和I2C_SDA的上拉电阻在V7的主板上。
原理图右侧的GPIO-0到GPIO-7可以作为扩展IO使用,支持输入和输出。其中GPIO-4到GPIO-7用于电阻触摸校准(使用那个IO是可以配置的)。
对于X-,X+,Y-和Y+,只要不是X和Y进行组合,其它组合方式可以随意接,配套的触摸校准算法都可以正常识别。
44.4 电容屏硬件设计
电容触摸主要有三种:FT5X06,GT911和GT811,其中GT811已经停产。下面是FT5X06和GT911触摸板效果(触摸板和触摸芯片是一体的):
触摸芯片已经集成到柔性PCB上,且已经校准好。用户使用的话,直接通过I2C方式读取数据即可。下面是电容触摸板引出的引脚:
注意I2C_SDK和I2C_SCL的上拉电阻在V7主板上。
44.5 电阻触摸驱动设计
下面将电阻触摸程序设计中的相关问题逐一为大家做个说明。
44.5.1 STMPE811的驱动实现
电阻触摸要比电容触摸麻烦很多,因为电阻触摸要做校准,还要做滤波,否则采集回来的触摸值会抖动或者出现飞点,出现这种情况的主要原因是电阻触摸板的线性度不够好。开发板电阻屏使用的触摸芯片是STMPE811,这个芯片其实就是12位分辨率的ADC,用来采集电阻触摸板的X轴ADC值和Y轴ADC值,然后按照一定的线性关系将ADC值转换为实际的坐标值。其中这个线性关系是通过触摸校准建立起来的,每次采集的X轴和Y轴ADC就可以代入这个线性关系,从而获得实际的坐标值。
总的来说,STMPE811的驱动不难实现,可以结合STMPE811的数据手册:http://www.armbbs.cn/forum.php?mod=viewthread&tid=23306 研究开发板提供的驱动配置。配置好后仅需要提供读取的X轴,Y轴的ADC值以及触摸按下状态(判断STMPE811的中断输出引脚就可以了,如果有触摸,这个引脚输出低电平,反之,输出高电平。通过判断这个引脚就可以选择是否读取X轴,Y轴的ADC值,避免不必要的操作)。这些函数在bsp_ts_stmpe811.c文件实现。而触摸值滤波,触摸扫描和触摸校准是在bsp_ts_touch.c文件里面实现。
下面是清除触摸中断标志函数和X轴,Y轴的ADC值读取函数,这些函数被bsp_touch.c文件所调用,而函数TOUCH_PenInt是在bsp_ts_touch.c文件,这里也贴出来。
1. /*
2. ******************************************************************************************************
3. * 函 数 名: TOUCH_PenInt
4. * 功能说明: 判断触摸按下
5. * 形 参: 无
6. * 返 回 值: 0表示无触笔按下,1表示有触笔按下
7. ******************************************************************************************************
8. */
9. uint8_t TOUCH_PenInt(void)
10. {
11. if ((TP_INT_GPIO_PORT->IDR & TP_INT_PIN) == 0)
12. {
13. return 1;
14. }
15. return 0;
16. }
17.
18. /*
19. ******************************************************************************************************
20. * 函 数 名: STMPE811_ClearInt
21. * 功能说明: 清楚触笔中断
22. * 形 参: 无
23. * 返 回 值: 无
24. ******************************************************************************************************
25. */
26. void STMPE811_ClearInt(void)
27. {
28. STMPE811_WriteReg1(REG811_INT_STA, 0xFF);
29. }
30.
31. /*
32. ******************************************************************************************************
33. * 函 数 名: STMPE811_ReadX
34. * 功能说明: 读取X坐标adc
35. * 形 参: 无
36. * 返 回 值: X坐标值adc
37. ******************************************************************************************************
38. */
39. uint16_t STMPE811_ReadX(void)
40. {
41. /* 按照 XY 读取模式,连续读取3字节数据,然后分解出X,Y
42. | byte0 | byte1 | byte2 |
43. | X[11:4], | X[3:0],Y[11:8] | Y[7:0] |
44. */
45. uint8_t buf[3];
46.
47. #if 0
48. STMPE811_ReadBytes(buf, REG811_TSC_DATA1, 3);
49.
50. s_AdcX = ((uint16_t)buf[0] << 4) | (buf[1] >> 4);
51. s_AdcY = ((uint16_t)(buf[1] & 0xF) << 8) | buf[2];
52. #else
53. if (STMPE811_ReadReg1(REG811_TSC_CTRL) & 0x80)
54. {
55. STMPE811_ReadBytes(buf, REG811_TSC_DATA1, 3);
56.
57. s_AdcX = ((uint16_t)buf[0] << 4) | (buf[1] >> 4);
58. s_AdcY = ((uint16_t)(buf[1] & 0xF) << 8) | buf[2];
59.
60. #if 0
61. /* for debug */
62. {
63. static int32_t s_t1 = 0;
64. int32_t tt;
65.
66. tt = bsp_GetRunTime();
67. if (tt - s_t1 > 1000)
68. {
69. printf("rn");
70. s_t1 = tt;
71. }
72. printf("(%7d) %5d %5drn", tt, s_AdcX, s_AdcY);
73. }
74. #endif
75. }
76. else
77. {
78. s_AdcX = 0;
79. s_AdcY = 0;
80. }
81. #endif
82.
83. return s_AdcX;
84. }
85.
86. /*
87. ******************************************************************************************************
88. * 函 数 名: STMPE811_ReadX
89. * 功能说明: 读取Y坐标adc
90. * 形 参: 无
91. * 返 回 值: Y坐标值adc
92. ******************************************************************************************************
93. */
94. uint16_t STMPE811_ReadY(void)
95. {
96. return s_AdcY;
97. }
下面将程序设计中的关键地方做个阐释:
第9-16行,通过判断STMPE811的中断输出引脚的高低电平来判断触摸板是否被按下,如果有触摸,这个引脚输出低电平,反之,输出高电平。通过判断这个引脚就可以选择是否读取X轴,Y轴的ADC值,避免不必要的操作。
第26-29行,清除触摸中断标志,检测到触摸屏未被按下时,要做清除。
第39-84行,读取X轴ADC数值。
第94-97行,读取Y轴ADC数值。
44.5.2 电阻触摸扫描函数TOUCH_Scan
接下来再来看bsp_touch.c文件中STMPE811触摸扫描函数TOUCH_Scan的实现:
1. /*
2. ******************************************************************************************************
3. * 函 数 名: TOUCH_Scan
4. * 功能说明: 触摸板事件检测程序。该函数被周期性调用,每ms调用1次. 见 bsp_Timer.c
5. * 形 参: 无
6. * 返 回 值: 无
7. ******************************************************************************************************
8. */
9. void TOUCH_Scan(void)
10. {
11. uint16_t usAdcX;
12. uint16_t usAdcY;
13. static uint16_t s_usXBuf[SAMPLE_COUNT];
14. static uint16_t s_usYBuf[SAMPLE_COUNT];
15. static uint8_t s_ucPos = 0;
16. static uint8_t s_count = 0;
17. static uint8_t s_down = 0;
18. static uint16_t s_usSaveAdcX, s_usSaveAdcY; /* 用于触笔抬起事件,保存按下和移动的最后采样值 */
19. static uint8_t s_ms = 0;
20.
21. if (g_GT811.Enable == 1)
22. {
23. GT811_Timer1ms(); /* 电容触摸屏程序计数器 */
24. return;
25. }
26.
27. if (g_GT911.Enable == 1)
28. {
29. GT911_Timer1ms(); /* 电容触摸屏程序计数器 */
30. return;
31. }
32.
33. if (g_tFT5X06.Enable == 1)
34. {
35. FT5X06_Timer1ms(); /* 电容触摸屏程序计数器 */
36. return;
37. }
38.
39. /* 下面用于电阻触摸 */
40.
41. if (g_tTP.Enable == 0)
42. {
43. return;
44. }
45.
46. if (++s_ms >= 2)
47. {
48. return;
49. }
50.
51. /* 2ms进入一次 */
52. s_ms = 0;
53.
54. /* 触笔中断发生 */
55. if (TOUCH_PenInt())
56. {
57. /* 获得原始的ADC值,未滤波 */
58. usAdcX = STMPE811_ReadX();
59. usAdcY = STMPE811_ReadY();
上一篇:第45章 STM32F429的图形加速器DMA2D的基础知识和HAL库API
下一篇:第43章 STM32F429的LTDC应用之汉字小字库和全字库制作
推荐阅读最新更新时间:2024-11-12 16:41
推荐帖子
- 引脚接一个电容再接地
- 一个引脚接一个电容再接地,这个电容是在滤波吗?如果是的话其原理是什么?正在积累基础知识,请各位大神能否回答的详细一些。先谢谢了。引脚接一个电容再接地坛子里这方面的帖子很多,,,想积累知识,要多来浏览啊随便给你找个电容的帖子,好好积累知识十说电容经典https://bbs.eeworld.com.cn/forum....=%CB%B5%B5%E7%C8%DD电容的目的就是允许交流通过,阻断直流。虽然都是一个原理,但是根据用途名字比较多,是不是滤波就不清楚了。 谢谢
- electrics 模拟电子
- 忙里偷闲发一下:开关电源PCB排版基本要点
- 摘要:开关电源排版是开发电源产品中的一个重要过程。许多情况下,一个在纸上设计得非常完美的电源可能在初次调试时无法正常工作,原因是该电源的排版存在着许多问题.详细讨论了开关电源排版的基本要点,并描述了一些实用的排版例子。关键词:排版;开关电源引言为了适应电子产品飞快的更新换代节奏,产品设计工程师更倾向于选择在市场上很容易采购到的AC/DC适配器,并把多组直流电源直接安装在系统的线路板上。由于开关电源产生的电磁干扰会影响到其电子产品的正常工作,正确的电源PCB排版就变得非常重要。开关电源PCB
- framchina 电源技术
- msp430FR5739最后一贴:PWM控制LED的测试
- 我的测试证明,MSP430FR5739中的PxSELC寄存器是个废品,没有意义的存在着。不知手中有5739板子的同僚们,你们的PxSELC是否起作用了呢?我的结论并不权威,甚至可能是谬论,不知道坛子里是否有权威人士出来解释一下,是我不会用还是这个片子确实存在这样的问题,强烈要求TI的专家出来给个解释。举个例子:按手册的描述,PxSELC是用来同时置位PxSEL0和PxSEL1的例如可以用P2SELC|=BIT0;来代替下面这两句P2SEL0|=BIT0;P2
- lcofjp 微控制器 MCU
- 如何关闭窗口
- 我用WINCE开发了一个MFC窗口函数,在关闭窗口时程序还在执行,如果想退出的程序的话,要重载哪个函数?谢谢。。。如何关闭窗口是否有线程没有关闭,如果有的话,重载OnClose,之前先关闭所有的线程.另外在WM上,点叉确实是不关闭程序,只把程序放后台.如果我想点叉就关闭程序,应该重载哪个函数啊?。。。谢谢您的回复对窗口发WM_CLOSE的消息这样做的话必须重载这个点叉调用的函数,但是我现在就是不知道点叉的时候调用的是哪个函数?。。谢谢
- 莽原 嵌入式系统
- [已解决]点灯都出问题了.
- 解决方案靠最前吧,主要是看错原理图:韵达不太给力,今早才到货,发完贴去淘宝确认.之前就完全没用过FPGA,好不容易编译通过了,却发现LED都没亮.结果是4个LED都是灭的.我的引脚绑定.IO第二功能复用KEY4是复位引脚,24脚是有源晶振LED低电平低电平点亮可是我一个LED都没亮还说我缺少了时序文件还有一个警告:Warning(15714):SomepinshaveincompleteI/Oassignments.RefertotheI/OAssi
- cl17726 FPGA/CPLD
- 4个G 的AD封装库免费下载
- 有官方的,也有第三方的。非常全。应网友要求,做成了几个压缩包。因为压缩文件比较大,建议使用下载工具进行下载,以免下载中断造成文件下载不全而无法使用。3DConnector封装库3D元件封装库AD标准封装库AD官方封装库AD元件封装库1AD元件封装库2AD元件封装库3AD元件封装库4AD元件封装库5AD元件库:EDIF如何导入,使用封装库,请扫一扫帖中二维码,查看原文《一分钟学会使用AltiumDes
- 兰博 下载中心专版
设计资源 培训 开发板 精华推荐
- AD8616ARZ-REEL7单电源缓冲DAC输出运算放大器典型应用电路
- KIT33905BD3EVBE: 评估套件 - 33905D3,带CAN和LIN的第二代SBC
- 2-5V降3.3V
- 具有 I2C 基准的 LTC2655CGN-L12 四通道、12 位轨至轨 DAC 的典型应用
- #第三届立创大赛#便携调试用数控电源
- L7806A 的典型应用通过降压电阻降低功耗
- 使用 ROHM Semiconductor 的 BD46475 的参考设计
- ADP8863DBCB-EVALZ,用于 7 通道趣味照明 LED 驱动器的评估板
- LTM8053IY 0.97Vout 3.4 至 40Vin 降压转换器的典型应用电路,具有扩频功能
- L78L10AC 正压稳压器的典型应用,用于高输出电流短路保护
- 医用/工业CT医疗影像探测器芯片应用与解决方案
- 直播已结束【用于光伏逆变器/储能系统的欧姆龙继电器 /开关/连接器解决方案】
- 有奖下载:邂逅大师——福禄克全新专家级红外热像仪
- 【EE团】开抢啦!!!TI超值工业级模拟器件套装芯片再次登场!!!
- 观看赢好礼——京东卡等你拿!
- 秋风送爽,你来答题我送礼!看Maxim 深入浅出低功耗处理器视频精彩为您呈现!
- 有奖直播已结束【如何利用 TI MSPM0 汽车微控制器提高检测和控制性能】
- 激情竞赛日--看谁最给力!
- 吉时利DMM6500 6½ 位数字触摸屏万用表六大功能,满足工程师的切身需求,献给有梦想的你!
- 提出你的电源问题&技术解答,提升自我电源知识,赢取好礼