今天终于解决了困扰我快两个星期的问题,哈哈,放自己半天假,搞搞我的开发板~ 发点TI触摸库的资料~ 电容感应式触摸按键已经被广泛用于替代传统机械式按键,比如电磁炉、微波炉等家电上隔着面板可以操作的按钮,还有iPod的触摸操作面板也是电容感应式触控按键的应用。 上次说过,MSP430电容触摸解决方案大致有3种:RO、RC和PinOsc TI的官方都有文档说明,还是中文的,见附件~
触摸库
一共有4个文件,这个暂时不管,只需要在建立工程的时候把它们包括进去就OK。
如果使用库,除了库文件,工程里必须包含3个文件——main.c、structure.c、structure.h。
main.c不用多说,用户自己的应用程序。
structure.c和structure.h是用来配置触摸库的:
structure.c 包含了所有的Element和Sensor的定义,这个需要根据具体应用自己来写。
structure.h用来为其他文件提供一个桥梁,并且里面包含了预处理,用以缩小代码和使能功能块。
有两个概念需要建立一下,Element和Sensor
Sensor就是触摸按键的形式:按钮(Buttons)、条形滑块(Sliders)、轮式滑块(Wheels)、接近传感(Proximity_sensor)
Element是构成Sensor的基本单位,如下图:
图中有两个Sensor——一个Button和一个Slider。其中Button由一个element构成,Slider由4个element构成。 有关Element和Sensor的定义在structure.c里,以ACTPB工程为例说明:
开发板上的触摸包括3个Sensor——一个Button(Center Button)、一个Wheel(包含上下左右4个element)、一个Proximity_sensor。
structure.c中的定义是这样的:
#include "structure.h"
//PinOsc Volume down P2.2
const struct Element volume_down = {
.inputPxselRegister = (uint8_t *)&P2SEL,
.inputPxsel2Register = (uint8_t *)&P2SEL2,
.inputBits = BIT2,
// measured for a 1Mhz SMCLK
.maxResponse = 121+655, // actual measure was 980
.threshold = 121
};
//PinOsc forward right P2.3
const struct Element right = {
.inputPxselRegister = (uint8_t *)&P2SEL,
.inputPxsel2Register = (uint8_t *)&P2SEL2,
.inputBits = BIT3,
// 1Mhz SMCLK
.maxResponse = 113+655,
.threshold = 113
};
//PinOsc Volume up, P2.4
const struct Element volume_up = { .inputPxselRegister = (uint8_t *)&P2SEL,
.inputPxsel2Register = (uint8_t *)&P2SEL2,
.inputBits = BIT4,
// 1Mhz SMCLK
.maxResponse = 118+655,
.threshold = 118
};
//PinOsc reverse left P2.1
const struct Element left = {
.inputPxselRegister = (uint8_t *)&P2SEL,
.inputPxsel2Register = (uint8_t *)&P2SEL2,
.inputBits = BIT1,
// 1Mhz SMCLK
.maxResponse = 111+655,
.threshold = 111
}; //PinOsc Wheel: middle button P2.5
const struct Element middle_element = {
.inputPxselRegister = (uint8_t *)&P2SEL,
.inputPxsel2Register = (uint8_t *)&P2SEL2,
.inputBits = BIT5,
// When using an abstracted function to measure the element
// the 100*(maxResponse - threshold) < 0xFFFF
// ie maxResponse - threshold < 655
.maxResponse = 350+655,
.threshold = 350
}; //PinOsc proximity: P2.0
const struct Element proximity_element = { .inputPxselRegister = (uint8_t *)&P2SEL,
.inputPxsel2Register = (uint8_t *)&P2SEL2,
.inputBits = BIT0,
.maxResponse = 200,
.threshold = 130
}; //*** CAP TOUCH HANDLER *******************************************************/
// This defines the grouping of sensors, the method to measure change in
// capacitance, and the function of the group const struct Sensor wheel =
{ //.halDefinition = fRO_PINOSC_TA0_SW,
.halDefinition = RO_PINOSC_TA0_WDTp,
.numElements = 4,
.points = 64,
.sensorThreshold = 75,
.baseOffset = 0,
// Pointer to elements
.arrayPtr[0] = &volume_up, // point to first element
.arrayPtr[1] = &right,
.arrayPtr[2] = &volume_down,
.arrayPtr[3] = &left,
.accumulationCycles= WDTp_GATE_8192 // 8192
}; const struct Sensor middle_button =
{ .halDefinition = RO_PINOSC_TA0_WDTp,
.numElements = 1,
.baseOffset = 4,
// Pointer to elements
.arrayPtr[0] = &middle_element, // point to first element
// Timer Information
.measGateSource= GATE_WDT_SMCLK,
.accumulationCycles= WDTp_GATE_8192 // 8192
}; const struct Sensor proximity_sensor =
{
.halDefinition = RO_PINOSC_TA0_WDTp,
.numElements = 1,
.baseOffset = 5,
// Pointer to elements
.arrayPtr[0] = &proximity_element,
// Timer Information
.measGateSource= GATE_WDT_SMCLK, // 0->SMCLK, 1-> ACLK
.accumulationCycles= WDTp_GATE_8192 // 8192
};
其中对6个elements和3个sensors做了定义:
一个element一个结构体(定义了element对应于硬件上的管脚,触摸的阈值),一个sensor一个结构体(定义了触摸检测方法,以及硬件上用的的定时器等),从变量的命名可以看出这里用的检测方法是Pinosc,用到了TA0和看门狗定时器。关于结构体内部的具体含义参考Capacitive Touch Library Programmer's Guide,因为不同的430不同的触摸解决方案定义都不同。 对照TI的范例程序学习会有很大的帮助~
RC.pdf
(603.09 KB, 下载次数: 2)
|