栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

ADC按键原理

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

 

分析电路可知,不同的按键按下时,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按键程序设计

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

 

分析可知,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

    //
	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;
	}
	
	//当检测到上升沿时代码同上。
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/873105.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号