触摸按键,手指按下ADC读出值没啥变化,是不是布线造成的?

手指按下,触摸按键1的值没啥变化,打印的值依次为触摸按键1 2 3 4 5 6

TouckKey Value:3946    3189    3118   3089  2825   3025image.png

用的是哪颗芯片呢?代码是自己写的还是用的EVT例程?可以把具体信息发邮件沟通:ccs@wch.cn


用的CH32X033,代码是EVT例程里来的,把单个通道测量改成了6个通道

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类触摸采样时,尽量远离GND,而PCB上所有按键的走线的TOP层都有铺地覆盖;其次不建议直接使用EVT里面的Touchkey例程来做实际方案,Touchkey例程只是用于演示触摸功能,不适用于实际项目,可以邮件交流下您这个项目对触摸按键的具体需求,我的邮箱:ccs@wch.cn


谢谢,这个板子目前只是我体验下触摸功能画的,我修改布线后再看看效果。另外我也想看看实际项目是怎样运用这一功能的,方便提供示例的话这是我的邮箱:个人信息保护,已隐藏


只有登录才能回复,可以选择微信账号登录