[原创] 我的MSP432 launchpad 扩展板 之 电容触摸板 终于调通啦 (附电容触摸按键原理简介)

anqi90   2016-1-12 23:00 楼主
很久之前弄的这个MSP432 launchpad 扩展板上做了一个电容按键矩阵的触摸板 当时只是按照设想的做的,能不能用还真没底 结果板子做出来以后,把手上的oled模块调通之后就扔到一边了,这一放就是三四个月.... 这两天终于又想起来了,于是翻出来吹吹灰,试着把这个触摸按键调一下吧。 废话不多说,先上视频给大家看看吧(目前只是把8个按键的计数变化量显示了出来,还没有计算坐标)—— 从视频中可以看到,数据还是比较稳定的,而且可以根据按压的力度(实际就是接触面积的大小)读到不同的值 而且理论上可以判断出两到三个点的数据。 ------------------------更新视频——------------------------- 有两段演示,一个是计算出来的坐标,可以看到有一个z表示按压的力度 第二段就是使用坐标画点,可以看出来在覆铜交界的地方会有偏移,不过暂时也只好这样了,毕竟也用不到很精确的定位 其实这个触摸板更大的意义在于可以随意规划按键的布局,不再受限于普通的4*4键盘只有16个按键,按键的位置也可以随意安排 其实之前(那时候还在学校,一晃都好几年了....)用MSP430G2的launchpad也做过触摸按键,就是下面这货: 20111105_aff0ad5d652decd714aa7bQpQXQalu3W.jpg 不过当时鉴于经验不足,只是照着boosterpack风火轮的例程,把触摸按键的部分扒下来套上去用的 结果只是勉强能用,知其然而不知其所以然,用起来也不太稳定。 而这次就不一样了。这次本来是想学习一下TI的Capacitive Touch Software Library。不过简单看了一下之后,发现实在是太复杂,自己玩估计用不到这么多东西,于是就照着datasheet开始一步一步的配置。 其实432上的触摸按键说白了并不复杂,简单的结构如下: 无标题456.png 原理也并不复杂: 首先,当引脚配置为触摸按键之后,就会产生一个震荡的信号,振荡的频率是与引脚与地之间的电容决定的。 当有导体靠近或接触到管脚及管脚所连接的铜皮时,电容就会改变,从而改变管脚上的振荡频率。 检测有没有按下,其实就是检测这个信号的频率变化。 然后,所谓的频率,其实就是 “一段时间内的信号周期数” 实际上我们并不关心绝对的“频率”(或者说“1秒内的周期数”),只要保证测量的时间相同,得到的周期数的变化就可以对应为电容的变化 所以我们使用一个定时器1控制定时器2的工作时间,用定时器2来测量这段时间内的周期数 实际需要做的配置也就是对应上图中的三个部分: GPIO配置为电容触摸管脚 配置定时器1 配置定时器2 例如,配置P4.0为电容触摸并使能电容触摸功能:
  1. CAPTIO0CTL |= CAPTIOEN;
  2. CAPTIO0CTL |= CAPTIOPOSEL__P4;
  3. CAPTIO0CTL |= CAPTIOPISEL_0;
这时候P4.0管脚上就会产生震荡信号。 下一步就是配置定时2,配置为输入时钟使用电容触摸按键的输出信号,计数模式,禁用中断等 从datasheet看到只有Timer A2、A3可以用电容触摸信号作为时钟源 我这里选择的是A2:
  1. TA2_config.clockSource = TIMER_A_CLOCKSOURCE_INVERTED_EXTERNAL_TXCLK;
  2. TA2_config.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_1;
  3. TA2_config.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;
  4. TA2_config.timerClear = TIMER_A_DO_CLEAR;
  5. Timer_A_configureContinuousMode(TIMER_A2_MODULE, &TA2_config);
对于定时器1,我是使用了看门狗定时器WDT_A,配置如下:
  1. CS_setReferenceOscillatorFrequency(CS_REFO_128KHZ); // Set Internal low-power low-frequency oscillator 32KHz
  2. CS_initClockSignal(CS_ACLK, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_1); // REFOCLK -> ACLK
  3. WDT_A_initIntervalTimer(WDT_A_CLOCKSOURCE_ACLK, WDTIS_7); // ACLK -> WDT_A
  4. WDT_A_registerInterrupt(WDT_A_IsrHandler);
  5. Interrupt_enableInterrupt(INT_WDT_A);
WDT_A的中断函数INT_WDT_A()里什么都没做,只是用来从LPM0中唤醒。 以上就是全部的配置工作,接下来就可以实际测量引脚上的震荡信号了:
  1. Timer_A_clearTimer(TIMER_A2_MODULE);
  2. WDT_A_clearTimer();
  3. WDT_A_startTimer();
  4. Timer_A_startCounter(TIMER_A2_MODULE, TIMER_A_CONTINUOUS_MODE);
  5. PCM_gotoLPM0();
  6. Timer_A_stopTimer(TIMER_A2_MODULE);
  7. WDT_A_holdTimer();
  8. count = Timer_A_getCounterValue(TIMER_A2_MODULE);
清空两个定时器 开启WDT_A 开始计时 开启Timer_A 开始记录周期数 进入LPM0等待WDT_A 定时结束 定时结束后从LPM0唤醒 停止Timer_A 停止WDT_A 读取Timer_A的计数值 这样得到的count值就是这一个WDT_A定时周期内,TimerA2计数得到的震荡周期数。 对应不同的电容值会有不同的震荡计数,接下来就可以判断出这个引脚上的电容有没有变化、变化了多少,从而也就可以判断出按键有没有被按下啦 ok,大致的操作就是以上啦,至于进一步的优化工作就请大家自己动手咯~~~ 以上! 七月份的尾巴~突然想起来432~~~八月份的前奏~就把它搞起来 继续折腾MSP432 Launchpad 串口驱动OLED 改为硬件SPI 我的432 launchpad 扩展板,不过有点悲剧 我的MSP432 launchpad 扩展板 之 电容触摸板 终于调通啦 本帖最后由 anqi90 于 2016-1-14 22:36 编辑

回复评论 (13)

很感谢楼主的分享,用ti的mcu很长时间,触摸部分都没怎么调过,有您这个分享,年前忙完一定试一波,我的片子也吃了半年的灰了,是该打扫干净过个年
点赞  2016-1-12 23:09
引用: sunduoze 发表于 2016-1-12 23:09
很感谢楼主的分享,用ti的mcu很长时间,触摸部分都没怎么调过,有您这个分享,年前忙完一定试一波,我的片 ...


其实这个电容触摸是相当简单的,一个引脚上接一块铜皮就是一个按键,剩下的就都是软件的工作了
点赞  2016-1-12 23:12
看来您的软件写的比较屌,总是想不通怎么实现的,后面有时间一点实践一波
点赞  2016-1-13 04:25
很棒的分享。
    懒得很
点赞  2016-1-13 09:26
引用: sunduoze 发表于 2016-1-13 04:25
看来您的软件写的比较屌,总是想不通怎么实现的,后面有时间一点实践一波

其实并不复杂的,我一开始的时候也是一头雾水,慢慢就摸索出来了
点赞  2016-1-13 12:57
引用: zca123 发表于 2016-1-13 09:26
很棒的分享。

点赞  2016-1-13 12:57
谢谢楼主分享!触摸按键的帖子当年看过。
点赞  2016-1-13 17:28
引用: lising 发表于 2016-1-13 17:28
谢谢楼主分享!触摸按键的帖子当年看过。

哈哈,那可是很长时间啦
点赞  2016-1-14 10:48
更新视频啦~~~
点赞  2016-1-14 22:39
这个非常棒诶!!支持支持!
点赞  2016-3-13 18:50
收藏了。MSP432 触摸与FR2633的触摸有区别吗?
点赞  2016-10-10 10:32
引用: 1592849877 发表于 2016-10-10 10:32
收藏了。MSP432 触摸与FR2633的触摸有区别吗?

应该是类似的,可以找CCS里带的例程参考一下
点赞  2016-10-10 12:55

您好,请问下这个方案可以购买吗?学习使用

点赞  2023-7-12 17:14
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复