#申请开发板#今天试了下板子上touchkey的实验。
起初我以为会像ST那样专门做出一个什么触摸库的。
打开程序,发现程序非常简单,就是ADC单通道采集的一个例程。
串口一直打印出当前选中ADC通道的原始值。显然不是很实用。
发现在引脚无输入,即未触摸时,输出数值为1700左右;在有输入
即触摸时(稳定接触),输出数值480左右,受触摸的力道和时间的长短
有轻微差异,整体范围在480~700左右。实验很简单,稍微对它修改下,
让它有一些实际的作用或者趣味。
下面我们对程序进行稍微修改,让它不要一直发送数据。当触摸按键状态
变化时,才会输出当前ADC值和按键状态。为了更好观察,我们定义一个
引脚PA0控制板上的LED灯。当触摸时,灯亮,离开时,灯灭。
下面对程序进行修改:
在main.c里面直接修改:
添加LED初始化
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
在main函数里面修改输出逻辑:
int main(void)
{
u16 ADC_val=0;
u16 ADC_Oldval=0;
Delay_Init();
LED_Init();
USART_Printf_Init(115200);
printf("SystemClk:%d
",SystemCoreClock);
Adc_Init();
while(1)
{
ADC_val = Get_Adc_Average( ADC_Channel_2, 10 ); //Channel 2
//无触摸时 1747
//有触摸时 400~700 稳定按住480左右
if(abs(ADC_val-ADC_Oldval)>800)
{
printf( "NowTouchKey:%04d
", ADC_val );
printf( "OldTouchKey:%04d
", ADC_Oldval );
//手触摸上去ADC分压变小
if(ADC_val-ADC_Oldval>800)//由小变大
{
printf("You leave the key!
");
PAout(0)=1;//按住状态指示灯 关灯
}
else//由大变小
{
printf("You touch the key!
");
PAout(0)=0;//按住状态指示灯 开灯
}
}
ADC_Oldval=ADC_val;
Delay_Ms(200);
}
}
编译下载,观察现象:
当只有触摸按键切换状态时,才会输出,并且LED的状态也会跟随改变。
如果把while里面的代码放到一个定时器里面,定时刷新,那么一个简易的
触摸按键就可以用了。
另外这种方法也可用来检测水位的限位。
今天试验比较简单,就到这了。
|