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/GND | VCC/GND | - |
ADC_KEY | PA5 | ADC1-通道5 |
- | PA9 | TX PA9 |
- | PA10 | RX 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库实现)的主要内容,如果未能解决你的问题,请参考以下文章