您当前的位置: 首页 >  蓝桥杯

风间琉璃•

暂无认证

  • 3浏览

    0关注

    337博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

蓝桥杯国赛之ADC按键

风间琉璃• 发布时间:2022-05-15 18:46:49 ,浏览量:3

一、按键原理

扩展板上按键原理图如下:

 将八个按键的高电平端接入ADC_KEY引脚,并且每一个按键前串联相应的电阻。当每个按键按下时,该引脚的电位就会发生变化,不同的按键按下,通过ad采集到的电位不一样,因此可根据不同的电位来区分不同的按键。原理本质上是电阻分压,通过按下不同的按键来改变电压值,然后ADC引脚进行采集对应的电压,然后就可以做出判断,实现按键功能。

优点:节省IO口,只需要一个IO口就可以检测这么多按键。但是缺点受硬件影响比较大,不同的板子,电阻也略有不同,检测得到的电压也有不同。对电阻的阻值有要求:每个按键按下时,它所相应的电位的变化需要比较大。并且不支持多个按键同时触发,如果多个按键同时触发就会产生混乱。

不同的按键按下电压所占比重值:

二、程序

电路图所示需要将P4和P5的PA5、ADC_KEY连接,用跳线帽将扩展板上对于的引脚进行连接。

PA5连接ADC_KEY,PA5就是一个ADC采集口,通过采集到不同的电压值来判断是哪一个按键按下的。对于着ADC2的通道15。所以在使用扩展板按键时需要配置ADC2.

将配置adc2通道13即可。可参考博客:ADC

adc数据采集:

uint16_t getADC2(void)
{
	uint16_t adc = 0;
	
	HAL_ADC_Start(&hadc2);
	adc = HAL_ADC_GetValue(&hadc2);
	
	return adc;
}

ADC数字滤波处理

// adc中值值滤波算法
#define LEN 50 
uint16_t filter(void)
{
	uint8_t i=0,j=0;
	uint16_t buf[LEN],temp;
	
	// 连续采集数据
	for(i=0;i (0x0FFF /14)*3) && (val < (0x0FFF /14)*5))
	{
		return 3; // adc = 1105
	}
	else if((val > (0x0FFF /14)*5) && (val < (0x0FFF /14)*7))
	{
		return 4; // adc = 1710
	}
	else if((val > (0x0FFF /14)*7) && (val < (0x0FFF /14)*9))
	{
		return 5;// adc = 2315
	}
	else if((val > (0x0FFF /14)*9) && (val < (0x0FFF /14)*11))
	{
		return 6;// adc = 2825
	}
	else if((val > (0x0FFF /14)*11) && (val < (0x0FFF /14)*13))
	{
		return 7;// adc = 3455
	}
	else if((val > (0x0FFF /14)*13) && (val < 0x0F6F))
	{
		return 8; // adc = 3926
	}
	else
	{
		return 0; // adc = 4040
	}
	
}

按键处理

void key_proc(void)
{
	if(key_uwTick - uwTick             
关注
打赏
1665385461
查看更多评论
0.1067s