登录/注册

adc按键程序

更多

以下是一个基于STM32的ADC按键程序示例(使用HAL库),采用中文注释说明:

#include "main.h"
#include "stm32f1xx_hal.h"

/* 定义ADC相关参数 */
#define ADC_HANDLE hadc1  // 使用的ADC句柄
#define ADC_CHANNEL ADC_CHANNEL_0  // 使用的ADC通道

/* 按键阈值定义(根据实际电路的分压值调整)*/
#define NO_KEY      4095  // 无按键(接近VCC)
#define KEY1_MIN    3000  // 按键1最小阈值
#define KEY1_MAX    3500
#define KEY2_MIN    2000
#define KEY2_MAX    2500
#define KEY3_MIN    1000
#define KEY3_MAX    1500
#define KEY4_MIN    500
#define KEY4_MAX    800

/* 按键编号枚举 */
typedef enum {
  KEY_NONE = 0,
  KEY_1,
  KEY_2,
  KEY_3,
  KEY_4
} Key_TypeDef;

/* 函数声明 */
Key_TypeDef ADC_GetKey(void);
void Key_Handler(Key_TypeDef key);

/* 主函数中的按键处理示例 */
int main(void) {
  HAL_Init();
  SystemClock_Config();
  MX_ADC1_Init();  // 初始化ADC

  Key_TypeDef currentKey = KEY_NONE;

  while (1) {
    currentKey = ADC_GetKey();  // 获取当前按键

    if (currentKey != KEY_NONE) {
      Key_Handler(currentKey);  // 处理按键
      HAL_Delay(100);  // 简单延时防抖
    }

    HAL_Delay(10);  // 循环延时
  }
}

/* 获取ADC按键值 */
Key_TypeDef ADC_GetKey(void) {
  uint32_t adcValue = 0;

  // 启动ADC转换
  HAL_ADC_Start(&ADC_HANDLE);

  // 等待转换完成
  if (HAL_ADC_PollForConversion(&ADC_HANDLE, 10) == HAL_OK) {
    adcValue = HAL_ADC_GetValue(&ADC_HANDLE);
  }
  HAL_ADC_Stop(&ADC_HANDLE);

  // 根据ADC值判断按键
  if (adcValue > KEY1_MIN && adcValue < KEY1_MAX) return KEY_1;
  else if (adcValue > KEY2_MIN && adcValue < KEY2_MAX) return KEY_2;
  else if (adcValue > KEY3_MIN && adcValue < KEY3_MAX) return KEY_3;
  else if (adcValue > KEY4_MIN && adcValue < KEY4_MAX) return KEY_4;

  return KEY_NONE;
}

/* 按键处理函数 */
void Key_Handler(Key_TypeDef key) {
  switch (key) {
    case KEY_1:
      // 执行按键1操作(例如点亮LED1)
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
      break;

    case KEY_2:
      // 执行按键2操作
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
      break;

    case KEY_3:
      // 执行按键3操作
      HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
      break;

    case KEY_4:
      // 执行按键4操作
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1, GPIO_PIN_RESET);
      break;

    default:
      break;
  }
}

硬件电路说明 ?

  1. 电阻分压网络
    VCC  ┬───[10kΩ]───┬── ADC_IN
       │           │
      [按键1]      [4.7kΩ]
       │           │
      [按键2]      [2.2kΩ]
       │           │
      [按键3]      [1kΩ]
       │           │
      [按键4]      [470Ω]
       │           │
      GND         GND
  2. 按下不同按键时,ADC引脚会得到不同分压值

关键点说明 ?

  1. 阈值调整

    • 使用万用表测量每个按键的实际电压
    • 根据公式计算理论值:ADC值 = (分压电阻 / 总电阻) × 4095
    • 预留±10%的波动范围
  2. 防抖处理

    • 硬件:在ADC输入引脚加0.1uF电容滤波
    • 软件:连续3次检测相同按键才确认
      
      // 增强型防抖示例
      Key_TypeDef last_key = KEY_NONE;
      uint8_t stable_count = 0;

    Key_TypeDef temp = ADC_GetKey(); if (temp == last_key) { stable_count++; if (stable_count >= 3) { return temp; // 稳定检测 } } else { stable_count = 0; last_key = temp; }

  3. 校准建议

    // 上电时自动校准
    HAL_ADCEx_Calibration_Start(&ADC_HANDLE);
  4. 多通道支持

    • 如需检测更多按键,可使用多路ADC通道
    • 修改ADC初始化配置为扫描模式

实际使用时需根据开发板原理图调整:

  1. ADC通道选择
  2. GPIO引脚配置
  3. 电阻网络参数
  4. 按键处理逻辑

可通过串口打印调试信息辅助校准:

printf("ADC Value: %lu\r\n", adcValue);  // 查看实际ADC值

开发第1个LVGL程序与实现按键操作

开发第1个LVGL程序与实现按键操作

2025-01-07 13:49:18

DshanMCU-R128s2 ADC按键配置方法

FreeRTOS平台上使用的按键为ADC-KEY,采用的ADC模块为GPADC。 按键

2023-12-22 19:11:39

全志R128外设模块配置—ADC按键配置方法

FreeRTOS平台上使用的按键为ADC-KEY,采用的ADC模块为GPADC。

2023-10-20 16:41:06

AVR ADC转换程序

AVR ADC转换程序(电源技术作业 电力/水利工程科技专业资料 答案)-AVR ADC转换

资料下载 张文 2021-09-28 13:00:04

浅谈ADC按键的应用设计

浅谈ADC按键的应用设计(现代电源技术pdf王建辉)-浅谈ADC按键的应

资料下载 打马过草原 2021-09-17 13:37:17

使用ADC设计按键电路的应用说明

.使用ADC方式的按键电路,具有硬件电路简单、按键电路与单片机连线少、能节省I/O口、易于修改、节省成本等优点。但在

资料下载 佚名 2019-11-20 17:48:42

独立按键的基本操作详细资料和应用程序免费下载

按键设计一般分为两种:独立按键和矩阵键盘。按键数量较少的用前者,按键数量

资料下载 郑成枝 2019-08-07 17:33:00

51单片机的独立按键按键消抖及矩阵按键的电路与程序免费下载

本文档的主要内容详细介绍的是51单片机的独立按键和按键消抖及矩阵按键的电路与程序

资料下载 而无返还 2019-07-26 17:36:00

ADC实现一个IO上挂多个按键

有时候做设计时,我们会遇到外部按键比较多,IO口不够用的情况。这时大部分人会考虑通过其它芯片扩展IO,或者直接换一个IO口足够的MCU。其实,还有个方法可以实现一个IO上挂多个按键———即采用

2022-09-01 13:25:49

采用RK2206芯片的ADC按键设计 含ADC驱动程序设计

对应一个GPIO口,进行高低电平输入检测。可是在GPIO口紧缺的情况下,不得不需要一个有效的解决方案,其中ADC检测实现按键功能是一种相对有效的解决方案。

2022-03-14 13:56:17

带32位MCU和高精度ADC的SoC产品----SD93F系列开发指南(一)

示例程序是以SD93F115-JBS芯片编写,包含了按键中断、RTC中断、SD ADC、SAR

2022-02-24 10:11:00

怎样去设计一个基于ADC模数转换的导航按键

/拨动导航按键时,A/D转换输入的模拟电压有0、100、200、300、400、500、700六种组合。二、A/D转换目标实现效果:程序主要是对ADC

2022-02-18 07:49:29

ADC按键的相关资料分享

文章目录前言一、原理图二、由原理图得到的信息三、ADC按键初始化四、ADC按键

2022-01-11 06:56:03

如何使用ADC实现多按键功能

节省IO口;本次介绍使用ADC实现多按键功能,通过采集ADC不同的值,然后判断是按键

2022-01-07 06:32:58

单片机按键扫描程序的设计

不过我在网上游逛了很久,也看过不少源程序了,没有发现这种按键处理办法的踪迹,所以,我将他共享出来,和广大同僚们共勉。我非常坚信这种按键处理办法的

2019-09-25 15:44:06

7天热门专题 换一换
相关标签