摘要
本篇文章主要介绍了蓝桥杯嵌入式比赛扩展板上面ADC按键的工作原理与使用方法。
跳线帽与原理图
要想使用ADC按键需要将扩展板连接到主板上,如下图所示,并且还要短路扩展板上AKEY跳线帽。
连接成功后,ADC按键与主控板上的PA5引脚相连,ADC按键共有8个子按键,原理图如下图所示:
从上图可以看出,当没有按键按下时,ADC_KEY的电压为3.3V,当按下不同的按键是,根据欧姆定理,ADC_KEY上会产生不同的电压,根据电压的值,可判断哪个按键被按下。比如按键S1被按下时,ADC_KEY上的电压约为0.2V,按键S4按下时,ADC_KEY上的电压约为1.5V。
ADC按键使用步骤
下面将基于硬件原厂提供的显示屏示例代码:HAL_06_LCD
介绍ADC的使用步骤:
① 添加 stm32g4xx_hal_adc.c,stm32g4xx_hal_adc_ex.c
双击Drivers/STM32G4xx_HAL_Driver,打开添加文件对话框,在向上一级
-> Drivers
-> STM32G4xx_HAL_Driver
-> Src
中,找到stm32g4xx_hal_adc.c
和 stm32g4xx_hal_adc_ex.c
并添加。添加后如下图所示:
② 修改 stm32g4xx_hal_conf.h
文件
在如下位置找到该文件,并打开:
取消注释 #define HAL_ADC_MODULE_ENABLED
这一行,取下注释后如下图所示:
③ main.c
添加 #include "stm32g4xx_hal_adc.h"
在 main.c
适当位置添加 #include "stm32g4xx_hal_adc.h"
,添加后如下图所示:
④ 复制如下 ADC 按键初始化及获取ADC按键值的代码
复制下面的代码,粘贴带main.c
文件 main()
函数上面空白处
ADC_HandleTypeDef hadc2;
uint16_t ADC_Key_Scan(void)
{
uint16_t adc_value = 0;
HAL_ADC_Start(&hadc2);
adc_value = HAL_ADC_GetValue(&hadc2);
if(adc_value < 10) return 1;
if(adc_value < 800) return 2;
if(adc_value < 1600) return 3;
if(adc_value < 2000) return 4;
if(adc_value < 2700) return 5;
if(adc_value < 3300) return 6;
if(adc_value < 3700) return 7;
if(adc_value < 4000) return 8;
return 0;
}
static void ADC_Key_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
GPIO_InitTypeDef GPIO_InitStruct = {0};
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC12;
PeriphClkInit.Adc12ClockSelection = RCC_ADC12CLKSOURCE_SYSCLK;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
__HAL_RCC_ADC12_CLK_ENABLE();//打开ADC时钟
__HAL_RCC_GPIOA_CLK_ENABLE();//打开GPIO A时钟
hadc2.Instance = ADC2;
hadc2.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
hadc2.Init.Resolution = ADC_RESOLUTION_12B;
hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc2.Init.GainCompensation = 0;
hadc2.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc2.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc2.Init.LowPowerAutoWait = DISABLE;
hadc2.Init.ContinuousConvMode = DISABLE;
hadc2.Init.NbrOfConversion = 1;
hadc2.Init.DiscontinuousConvMode = DISABLE;
hadc2.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc2.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc2.Init.DMAContinuousRequests = DISABLE;
hadc2.Init.Overrun = ADC_OVR_DATA_PRESERVED;
hadc2.Init.OversamplingMode = DISABLE;
HAL_ADC_Init(&hadc2);
sConfig.Channel = ADC_CHANNEL_13; //设置采样通道为13(PA5引脚)
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_640CYCLES_5;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;
HAL_ADC_ConfigChannel(&hadc2, &sConfig);
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化PA5引脚为模拟模式
HAL_ADC_Start(&hadc2);
}
**⑤ 在main()
中调用 ADC_Key_Init();
**
如下图所示,在main()
函数中LCD_Init();下面调用 ADC_Key_Init();
⑥ 获取按键值
在main()
的while()
中插入如下代码:
int key_value = ADC_Key_Scan();
if(key_value == 1) //按键S1被按下
{
}
if(key_value == 2) //按键S2被按下
{
}
if(key_value == 3) //按键S3被按下
{
}
main()
函数while(1)
中代码如下:
总结
ADC 按键使用步骤总结入下:
①正确连接扩展板及对应跳线帽
②添加ADC相关文件,启用ADC功能
③复制ADC按键相关的代码到main.c
④在main()函数中初始化ADC按键,读取按键值
如果此文章对你有帮助,欢迎点赞
关注
收藏
转发
.