一、功能描述
官方手册描述如下:
芯片提供了电容检测模块,配合ADC模块使用,可以实现电容类触摸按键检测功能。共14个输入通道,支持触摸按键电容值范围10pF~100pF。
简单理解:触摸和不触摸,ADC采集到的电压值不一样,可以根据这个电压值来判断按键有没有按下。
二、硬件接口
板上预留了4个触摸按键,分别接在PA12,PA13,PA14,PA15.这些引脚与SD卡是共用的,通过跳线设置。如下:
三、软件编写
触摸按键的配置步骤,官方手册写的还是蛮清楚的,如下:
按照以上步骤,可以完成对触摸按键的配置,这里不做过多介绍。需要注意的是,在实际使用的过程中,需要软件启动AD转换,转换完成后读取AD值。
初始化函数:
void touch_key_init(void)
{
R8_ADC_CFG|=RB_ADC_POWER_ON;//ADC模块电源使能
R8_ADC_CFG&=~RB_ADC_DIFF_EN;//ADC单端输入
ADC_SampClkCfg(2);//设置ADC采样时钟
R8_ADC_CFG|=RB_ADC_BUF_EN;//ADC输入缓冲使能
ADC_PGACfg(2);//设置信号增益
R8_TKEY_CTRL|=RB_TKEY_PWR_ON;//keytouch使能
R8_ADC_CHANNEL=2;//ADC通道2
R8_TKEY_CNT=58;
}
main.c如下:
#include "CH57x_common.h"
#include "gpio.h"
#include "touch_key.h"
uint16_t touch_key_value=0;
uint8_t touch_flag=0;
int main()
{
SystemInit();//初始化系统时钟为32M
led_init();//led端口初始化
touch_key_init();//触摸按键初始化
R8_ADC_CONVERT|=(1<<0);//启动转换
touch_flag=1;
while(1)
{
if(((R8_ADC_CONVERT&(1<<4))==0)&&(touch_flag==1))//转换完成
{
touch_key_value=R16_ADC_DATA;//读取ad值
if(touch_key_value<500)//按下
{
R32_PB_OUT&=~(1<<1);
}
else//松开
{
R32_PB_OUT|=(1<<1);
}
touch_flag=0;
}
if(touch_flag==0)
{
R8_ADC_CONVERT|=(1<<0);
touch_flag=1;
}
}
}
现象:
①不触摸,led灯不亮
②触摸,led亮,松手,led熄灭
|