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