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, 下载次数: 1)
 
 
 
 
 
 
  |