手指按下,觸摸按鍵1的值沒啥變化,打印的值依次為觸摸按鍵1 2 3 4 5 6
TouckKey Value:3946? ? 3189? ? 3118? ?3089? 2825? ?3025
手指按下,觸摸按鍵1的值沒啥變化,打印的值依次為觸摸按鍵1 2 3 4 5 6
TouckKey Value:3946? ? 3189? ? 3118? ?3089? 2825? ?3025
用的是哪顆芯片呢?代碼是自己寫的還是用的EVT例程?可以把具體信息發(fā)郵件溝通:ccs@wch.cn
用的CH32X033,代碼是EVT例程里來的,把單個(gè)通道測(cè)量改成了6個(gè)通道
void TouchKey_Init()
{
? ? GPIO_InitTypeDef GPIO_InitStructure={0};
? ? ADC_InitTypeDef ADC_InitStructure={0};
? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );
? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );
? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE );
? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
? ? GPIO_Init(GPIOA, &GPIO_InitStructure);
? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
? ? GPIO_Init(GPIOB, &GPIO_InitStructure);
? ? ADC_CLKConfig(ADC1, ADC_CLK_Div6);
? ? ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
? ? ADC_InitStructure.ADC_ScanConvMode = DISABLE;
? ? ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
? ? ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
? ? ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
? ? ADC_InitStructure.ADC_NbrOfChannel = 1;
? ? ADC_Init(ADC1, &ADC_InitStructure);
? ? ADC_Cmd(ADC1, ENABLE);
? ? TKey1->CTLR1 |= (1<<24);? ? ?// Enable TouchKey
}
u16 Touch_Key_Adc(u8 ch)
{
? ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_11Cycles );
? TKey1->IDATAR1 =0x80;? //Charging Time
? TKey1->RDATAR =0x8;? ?//Discharging Time
? while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));
? return (uint16_t) TKey1->RDATAR;
}
/*------------------------------------------------------------------------------*/
int main(void)
{
? ? u8 i = 0;
? ? u16 rawData[6];
? ? NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
? ? SystemCoreClockUpdate();
? ? Delay_Init();
? ? USART_Printf_Init(921600);
? ? printf("SystemClk:%d\r\n", SystemCoreClock);
? ? printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
? ? printf("GPIO Toggle TEST\r\n");
? ? GPIO_Toggle_INIT();
? ? TouchKey_Init();
? ? while(1)
? ? {
? ? ? ? rawData[0] = Touch_Key_Adc(ADC_Channel_3);//TKEY1 PA3
? ? ? ? rawData[1] = Touch_Key_Adc(ADC_Channel_5);//TKEY2 PA5
? ? ? ? rawData[2] = Touch_Key_Adc(ADC_Channel_4);//TKEY3 PA4
? ? ? ? rawData[3] = Touch_Key_Adc(ADC_Channel_6);//TKEY4 PA6
? ? ? ? rawData[4] = Touch_Key_Adc(ADC_Channel_8);//TKEY5 PA7
? ? ? ? rawData[5] = Touch_Key_Adc(ADC_Channel_9);//TKEY6 PB1
? ? ? ? printf("TouckKey Value:%d %d %d %d %d %d\r\n",rawData[0],rawData[1],rawData[2],rawData[3],rawData[4],rawData[5]);
? ? ? ? Delay_Ms(200);
? ? ? ? //GPIO_WriteBit(GPIOA, GPIO_Pin_0, (i == 0) ? (i = Bit_SET) : (i = Bit_RESET));
? ? }
}
首先使用ADC類觸摸采樣時(shí),盡量遠(yuǎn)離GND,而PCB上所有按鍵的走線的TOP層都有鋪地覆蓋;其次不建議直接使用EVT里面的Touchkey例程來做實(shí)際方案,Touchkey例程只是用于演示觸摸功能,不適用于實(shí)際項(xiàng)目,可以郵件交流下您這個(gè)項(xiàng)目對(duì)觸摸按鍵的具體需求,我的郵箱:ccs@wch.cn
謝謝,這個(gè)板子目前只是我體驗(yàn)下觸摸功能畫的,我修改布線后再看看效果。另外我也想看看實(shí)際項(xiàng)目是怎樣運(yùn)用這一功能的,方便提供示例的話這是我的郵箱:個(gè)人信息保護(hù),已隱藏