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
//*为消除电压波动带来的干扰,这里的电压判断取范围。如果记不住范围取值,可通过赛点提供的万
用表或示波器测试。测试具体方法如下:取下连接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;
}
//当检测到上升沿时代码同上。
}