CH32V103 系列产品触摸检测控制(TKEY_V)单元,通过将电容量变化转变为频率变化进行采样,实现触摸按键检测功能。。检测通道复用 ADC 的 16 个外部通道,通过 ADC模块的单次转换模式实现触摸按键检测。应用程序通过数字值的变化量判断触 摸按键状态。
原理图上两个TouchKey分别连接的是pa1和pa2,分别对应的是ADC1的通道一和通道二,我们需要使能ADC1的通道1和通道2,分别循环读取两个通道的ad值。这里只使用了1个通道,通道2。
void Touch_Key_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE );
GPIO_InitStructure.GPIO_Pin = AD1_CHANNEL1_PIN|AD1_CHANNEL2_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_Cmd(ADC1, ENABLE);
TKEY_CH =0x00000002; // TouchKey Channel
TKEY_CR |= 0x51000000; // Enable TouchKey
}
*******************************************************************************/
uint16_t Touch_Key_Adc(uint8_t ch)
{
u16 val;
while(!(TKEY_CR & 0x08000000));
val = (u16)TKEY_SR;
return val;
}
主函数中增加一个按下触摸按钮的临界值判断,小于临界值表示按下触摸按钮,大于临界值表示触摸按钮恢复。按下触摸按钮的时候翻转LED的显示。
int main(void)
{
u16 ADC_val;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
Delay_Init();
User_Led_Init();
USART1_Init();
Touch_Key_Init();
USARTx_SendStr(USART1, "This is a test data.\n");
while(1)
{
ADC_val = Touch_Key_Adc(ADC_Channel_2);
printf( "TouchKey:%04d\r\n", ADC_val );
Delay_Ms(10);
if(Touchkey_RxOK == 0)
{
if(ADC_val < critical_value)
{
TouchkeyCounts++;
if(TouchkeyCounts >= 3)
{
Touchkey_RxOK = 1;
Toggle_User_Led(User_LED1);
TouchkeyCounts = 0;
}
}
}
if(Touchkey_RxOK == 1)
{
if(ADC_val > critical_value)
{
TouchkeyCounts++;
if(TouchkeyCounts >= 3)
{
Touchkey_RxOK = 0;
TouchkeyCounts = 0;
}
}
}
TKEY_CR |=0x08000000; //Clear Flag
}
}
工程打包上传如下:
CH32V103-TOUCHKEY.rar
(492.97 KB)
|