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)
|