STM32学习(31)STM32通过ADC实现多按键功能(标准库和HAL库实现)

Posted 书盲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32学习(31)STM32通过ADC实现多按键功能(标准库和HAL库实现)相关的知识,希望对你有一定的参考价值。

完整的源码链接(1条消息) STM32通过ADC实现多按键功能(标准库和HAL库实现)-电信文档类资源-CSDN下载

 

我们在使用嵌入式功能开发的时候经常需要使用按键实现一些功能。

按键一般接触较多的就是独立按键,但一般情况上会需要多个按键,使用独立按键就会使得IO口资源浪费;因此会提出使用矩阵按键,该方法是可以实现节省IO口;

本次介绍使用ADC实现多按键功能,通过采集ADC不同的值,然后判断是按键几按下?

因此要求完成功能:实现一个ADC口完成对八个按键的检测,识别按键几按下,并将结果通过串口到串口助手上显示。(标准库和HAL库实现)

单片机型号:STM32F103

电路设计如下:

 

.

 

接线表设计:

模块名称(ADC按键)STM32的IO口功能设置
VCC/GNDVCC/GND-
ADC_KEYPA5ADC1-通道5
-PA9TX PA9
-PA10RX PA10

 

 

1.标准库实现:

先分别采集八个按键按下的ADC值,经过ADC滤波获取稳定的ADC值。

/****************************************
函数名称:u16 Read_ADC(void)
函数参数:无参
函数返回值:u16  表示ADC的返回值
函数功能:获取ADC的值,并返回
创建作者:王艇
创建时间:2021.5.26
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
u16 Read_ADC(void)
{
	u16 ADC_VALUE = 0;
	
	ADC_SoftwareStartConvCmd(ADC1,ENABLE);
	while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
	ADC_VALUE = ADC_GetConversionValue(ADC1);
	ADC_ClearFlag(ADC1, ADC_FLAG_EOC);

	return ADC_VALUE;
}


/****************************************
函数名称:u16 Read_Btn(void)
函数参数:无参
函数返回值:返回按键按下的ADC值
函数功能:通过滤波获取ADC的稳定值
创建作者:王艇
创建时间:2021.5.26
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
u16 Read_Btn(void)
{
	u16 tmp;
	u8 i = 0,j = 0;
	
	for(i=0; i<BTN_BUFF_LEN; i++){
		btn_buff[i] = Read_ADC();
	}

	for(i=0; i<=BTN_BUFF_LEN/2; i++){
		for(j=0; j<	BTN_BUFF_LEN-i-1; j++){
			if(btn_buff[j+1] < btn_buff[j]){
				tmp = btn_buff[j+1];
				btn_buff[j+1] = btn_buff[j];
				btn_buff[j] = tmp;
			}
		}
	}

	if(BTN_BUFF_LEN % 2 == 0){
		return(btn_buff[BTN_BUFF_LEN/2-1] + btn_buff[BTN_BUFF_LEN/2])/2;
	}else{
		return(btn_buff[BTN_BUFF_LEN/2]);
	}
}

实现效果如下:

可以发现按键按下他们的ADC值是不一样的,可以依据ADC的值不同判断是哪个按键按下

效果如下:

 

2.HAL库实现

串口1重定义:

#ifdef _GNUC_
	#define PUTCHAR_PROTOTYPE int io_putchar(int ch)
#else
	#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE 
{
	HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0XFFFF);
	return ch;
}

 

/****************************************
函数名称:u16 Read_Btn(void)
函数参数:无参
函数返回值:返回按键按下的ADC值
函数功能:通过滤波获取ADC的稳定值
创建作者:王艇
创建时间:2021.5.26
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
uint16_t Read_Btn(void)
{
	uint16_t tmp;
	uint8_t i = 0,j = 0;
	
	for(i=0; i<BTN_BUFF_LEN; i++){
		btn_buff[i] = Read_ADC();
	}

	for(i=0; i<=BTN_BUFF_LEN/2; i++){
		for(j=0; j<	BTN_BUFF_LEN-i-1; j++){
			if(btn_buff[j+1] < btn_buff[j]){
				tmp = btn_buff[j+1];
				btn_buff[j+1] = btn_buff[j];
				btn_buff[j] = tmp;
			}
		}
	}

	if(BTN_BUFF_LEN % 2 == 0)
	{
		return(((btn_buff[BTN_BUFF_LEN/2-1] + btn_buff[BTN_BUFF_LEN/2])/2)+40);		//	40	为ADC补偿,可以依据实际情况删除
	}
	else
	{
		return(btn_buff[BTN_BUFF_LEN/2]+40);										//	40	为ADC补偿,可以依据实际情况删除
	}
}

有标准库和HAL库有点区别,我将采集到的ADC值进行了适当补偿。

if(BTN_BUFF_LEN % 2 == 0)
	{
		return(((btn_buff[BTN_BUFF_LEN/2-1] + btn_buff[BTN_BUFF_LEN/2])/2)+40);		//	40	为ADC补偿,可以依据实际情况删除
	}
	else
	{
		return(btn_buff[BTN_BUFF_LEN/2]+40);										//	40	为ADC补偿,可以依据实际情况删除
	}

后面加的40可以依据实际情况删除

实现效果:

实现效果完美,完全达到一个IO实现多个按键控制。

互相学习互相交流,感谢关注支持!!!

源码下载链接:(1条消息) STM32通过ADC实现多按键功能(标准库和HAL库实现)-电信文档类资源-CSDN下载

 

以上是关于STM32学习(31)STM32通过ADC实现多按键功能(标准库和HAL库实现)的主要内容,如果未能解决你的问题,请参考以下文章

stm32之ADC学习

STM32学习笔记(14)——ADC初步应用

Stm32CubeMX5 配置使用ADC

STM32ADC同步采样

STM32ADC同步采样

STM32ADC同步采样