【蓝桥杯嵌入式】资源拓展板模块详解——ADC按键

本文详细讲解了蓝桥杯嵌入式扩展板的ADC按键原理,通过分析电路得出不同按键按下的电位变化,并介绍了如何利用ADC功能进行电位检测,将电位映射为按键编号。此外,还探讨了ADC按键的程序设计,特别是在CubeMX中配置ADC通道为单端输入,并提供了完整的按键扫描函数示例,适用于实际项目裁剪。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ADC按键原理

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

a744f3fa438245ed80f05525fe1f0908.png

分析电路可知,不同的按键按下时,ADC_KEY端的电位不同。经过测试得出具体电位如下表(假设VDD为3.3v):

按键

电位/v

S1

0

S2

0.42

S3

0.91

S4

1.39

S5

1.87

S6

2.28

S7

2.78

S8

3.15

因此,只需通过ADC功能检测电位,并进行电位到按键编号的映射即可完成ADC按键的扫描。

ADC按键程序设计

扩展板排针的原理图如下:

f8106e29aeb64343b281c104e936a44a.png

分析可知,ADC按键通过5号针脚引出,对应的MCU引脚为PA5。在资源拓展板上使用跳线帽将P4的5号针脚与P5的5号针脚连接。然后将MCU的PA5设置为ADC功能。PA5的ADC复用功能对应ADC2端口IN13通道。在CubeMX中将此通道配置为单端输入(Single-ended)即可,其他参数无需配置。

按键扫描函数

uint8_t ADC_KeyScan(void)
{
	double adc_value = 0;
	uint8_t adc_key = 0;
	
    HAL_ADC_Start(&hadc2);//开启ADC功能							
	HAL_ADC_PollForConversion(&hadc2,10);//等待ADC规则组转换完成
	adc_value = (double)HAL_ADC_GetValue(&hadc2)*3.3/4096;//读取ADC值,adc_value单位:v

    //*为消除电压波动带来的干扰,这里的电压判断取范围。如果记不住范围取值,可通过赛点提供的万    
     用表或示波器测试。测试具体方法如下:取下连接P4和P5的5号针脚的跳线帽,将万用表红表笔(或示    
     波器的正极)接P5的5号针脚,万用表红表笔(或示波器负极)接拓展资源板或MCU主板上的任一GND,    
     然后依次按下8个ADC按键,观察电压值(不按下时为3.25v-3.3v左右)*//
	if(adc_value >= 0 && adc_value <0.2)
		adc_key = 1;
	else if(adc_value > 0.2 && adc_value < 0.6)
		adc_key = 2;
	else if(adc_value > 0.6 && adc_value < 1.25)
		adc_key = 3;
	else if(adc_value > 1.25&& adc_value < 1.7)
		adc_key = 4;
	else if(adc_value > 1.7 && adc_value < 2.1)
		adc_key = 5;
	else if(adc_value > 2.1 && adc_value < 2.5)
		adc_key = 6;
	else if(adc_value > 2.5 && adc_value < 3.0)
		adc_key = 7;
	else if(adc_value > 3.0 && adc_value < 3.25)
		adc_key = 8;
		
	return adc_key;
}

按键功能函数(此演示为考虑了所有应用需求的代码,具体使用时可根据实际情况裁减代码)

注:此函数在主循环,即while(1)中调用。

void AdcKey_Proc()
{
	if(uwTick - uwTick_AdcKey < 200) return;//降速,每200个主循环进入一次,可修改
                                            //uwTick_AdcKey定义格式:
                                            //__IO uint32_t uwTick_AdcKey = 0;
	uwTick_AdcKey = uwTick;
	
	uint8_t ucKey_Val = 0,ucKey_Old = 0,ucKey_Down = 0,ucKey_Up = 0;
	ucKey_Val = ADC_KeyScan();
	ucKey_Down = ucKey_Val & (ucKey_Val ^ ucKey_Old);//检测按键下降沿
	ucKey_Up = ~ucKey_Val & (ucKey_Val^ucKey_Old);//检测按键上升沿
	ucKey_Old = ucKey_Val;
	
	switch(ucKey_Down)//当检测到按键下降沿时执行功能
	{
		case 1:
		{
			//具体功能代码,下同
		}break;
		case 2:
		{
			
		}break;
		case 3:
		{
			
		}break;
		case 4:
		{
			
		}break;
		case 5:
		{
			
		}break;
		case 6:
		{
			
		}break;
		case 7:
		{
			
		}break;
		case 8:
		{
			
		}break;
		default:break;
	}
	
	//当检测到上升沿时代码同上。
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值