3156|0

1304

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

【GD32L233C-START评测】第4篇 不一样的按键--ADC键盘 [复制链接]

本帖最后由 yang_alex 于 2022-2-20 17:14 编辑


          ADC按键可以节省MCU的I/O资源,按键部分采用电阻分压,部分电路通过按键实现电阻并联分压,由MCU的ADC采样电压同按键对应值进行比较的方法实现。如下图:

     在这里,我们的Key_ADC接评估板上的PA1,也是ADC_IN1(ADC通道1).

    先配置系统时钟。要想跑,心跳不能少。(低功耗的必备良药:那个功能不需要,时钟一关自然跑不了)

  • void rcu_config(void)
  • {
  • /* enable GPIOC clock */
  • rcu_periph_clock_enable(RCU_GPIOA);
  • rcu_periph_clock_enable(RCU_GPIOC);
  • /* enable ADC clock */
  • rcu_periph_clock_enable(RCU_ADC);
  • /* config ADC clock */
  • rcu_adc_clock_config(RCU_ADCCK_APB2_DIV6);
  • }

      再把PA1配置成ADC通道1。同时配置评估板上的4个LED等对应的PA7,PA8,PC6和PC7作为通用GPIO,对应指示4个按键:

  • void gpio_config(void)
  • {
  • /* config the GPIO as analog mode */
  • gpio_mode_set(ADC_GPIO_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, ADC_GPIO_PIN);
  • /* configure LED GPIO pin */
  • gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7 | GPIO_PIN_8);
  • gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7 | GPIO_PIN_8);
  • gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6 | GPIO_PIN_7);
  • gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7);
  • }

       然后配置ADC:ADC功能激活,采用软件触发,右对齐,采样通道1,采样率,8位数据,ADC使能,ADC校准(ADC带有一个前置校准功能。校准后采样比较准)

  • void adc_config(void)
  • {
  • /* ADC contineous function enable */
  • adc_special_function_config(ADC_CONTINUOUS_MODE, ENABLE);
  • /* ADC trigger config */
  • adc_external_trigger_source_config(ADC_REGULAR_CHANNEL, ADC_EXTTRIG_REGULAR_NONE);
  • /* ADC data alignment config */
  • adc_data_alignment_config(ADC_DATAALIGN_RIGHT);
  • /* ADC channel length config */
  • adc_channel_length_config(ADC_REGULAR_CHANNEL, 1U);
  • /* ADC regular channel config */
  • adc_regular_channel_config(0U, BOARD_ADC_CHANNEL, ADC_SAMPLETIME_55POINT5);
  • adc_external_trigger_config(ADC_REGULAR_CHANNEL, ENABLE);
  • /* ADC resolusion 8B */
  • adc_resolution_config(ADC_RESOLUTION_8B);
  • /* enable ADC interface */
  • adc_enable();
  • delay_1ms(1U);
  • /* ADC calibration and reset calibration */
  • adc_calibration_enable();
  • }

     前期工作准备好了,主程序中使能ADC软件触发,在死循环中清ADC转换结束标志,触发一次新的采样转换,对转换结果进行比较,确定是那个按键按下,点亮对应的LED灯。当然触发ADC开始采样转换也可以放到中断中去做。

  • #include "gd32l23x.h"
  • #include "systick.h"
  • #include <stdio.h>
  • #include "gd32l233c_start.h"
  • #define BOARD_ADC_CHANNEL ADC_CHANNEL_1
  • #define ADC_GPIO_PORT GPIOA
  • #define ADC_GPIO_PIN GPIO_PIN_1
  • uint16_t adc_value;
  • void rcu_config(void);
  • void gpio_config(void);
  • void adc_config(void);
  • int main(void)
  • {
  • /* system clocks configuration */
  • rcu_config();
  • /* systick configuration */
  • systick_config();
  • /* GPIO configuration */
  • gpio_config();
  • /* configures COM port */
  • gd_eval_com_init(EVAL_COM);
  • /* ADC configuration */
  • adc_config();
  • adc_software_trigger_enable(ADC_REGULAR_CHANNEL);
  • while(1)
  • {
  • adc_flag_clear(ADC_FLAG_EOC);
  • while(SET != adc_flag_get(ADC_FLAG_EOC)) {
  • }
  • adc_value = ADC_RDATA;
  • if(adc_value > 0x68)
  • {
  • gd_eval_led_on(LED1);
  • gd_eval_led_off(LED2);
  • gd_eval_led_off(LED3);
  • gd_eval_led_off(LED4);
  • }
  • else if(adc_value > 0x48)
  • {
  • gd_eval_led_on(LED2);
  • gd_eval_led_off(LED1);
  • gd_eval_led_off(LED3);
  • gd_eval_led_off(LED4);
  • }
  • else if(adc_value > 0x38)
  • {
  • gd_eval_led_on(LED3);
  • gd_eval_led_off(LED1);
  • gd_eval_led_off(LED2);
  • gd_eval_led_off(LED4);
  • }
  • else if(adc_value > 0x2e)
  • {
  • gd_eval_led_on(LED4);
  • gd_eval_led_off(LED1);
  • gd_eval_led_off(LED2);
  • gd_eval_led_off(LED3);
  • }
  • else
  • {
  • gd_eval_led_off(LED1);
  • gd_eval_led_off(LED2);
  • gd_eval_led_off(LED3);
  • gd_eval_led_off(LED4);
  • }
  • delay_1ms(100U);
  • }
  • }

      编译下载,迫不及待的上电。OK.功能正常,偶尔出现其他灯被一闪而过的点亮,主要是我们只采样一次,想避免的话,可以多采样几次进行滤波。

      看看运行的效果吧:

此帖出自GD32 MCU论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
世界各国电视制式

PDF格式的哦

串口调试助手与网络ping包 AVR硬件版 19264LCD显示

串口调试助手与网络ping包电路, 它具有串口与网口数传测试功能:串口调试助手与仿DOS环境下的网络ping包数传(包含UDP),是可 ...

教你编写最简单的CM3操作系统,160行实现基本任务创建与切换,助你学习CM3与RTOS的精髓.

如题,任务创建与上下文切换是跟硬件息息相关的,而这恰恰是RTOS编写的最难点,抛开这些功能,剩下的就是双向链表增删改操作了,本例 ...

有关GD32F450的以太网半双工调试经历

估计说起以太网半双工,很多人快遗忘了,说了你不信,我们最近用起了以太网半双工,说到底为了节省成本,由于通讯机制简单, ...

【基于NUCLEO-F746ZG电机开发应用】13.参数配置-USART3配置

此串口再开发板上的作用是:与ST-LINK进行通讯,然后ST_LINK2经过USB与电脑连接,与上位机MotorControl Workbench进行参数显示和 ...

PWM和模拟比较器在汽车ECU中有哪些应用

我想请教一下,很多汽车芯片有很多路PWM和ACMP模拟比较器,这两个模块在产品中具体有哪些应用,不要说他可以产生不同占空比的方 ...

【航芯 ACM32F070配套电容触摸开发板 -双机UART通信联动之航芯评测最终回-上】

本帖最后由 JohnMatthrew 于 2022-11-8 23:23 编辑 时间紧迫,连着更两期,快速收尾。上期分享了我宿友一上手犯的一些错误操 ...

【DIY】罗技K260键盘套装改锂电池供电及加工作指示

本帖最后由 dcexpert 于 2023-1-24 18:22 编辑 过年放假,难得没有太多事情,有时间可以做点别的。看到手边的罗技K260无线键 ...

《RT-Thread设备驱动开发指南》读书笔记一 串口驱动

本帖最后由 damiaa 于 2023-8-19 21:08 编辑 《RT-Thread设备驱动开发指南》读书笔记一 串口驱动 ...

永磁同步电机弱磁

为什么需要弱磁? 电机转速在不断上升的过程中,反电动势逐渐增大,而电机输入的电压是有限的,当反电动势达到逆变器输出的最大 ...

关闭
站长推荐上一条 1/10 下一条
有奖直播:当AI遇见仿真,会有什么样的电子行业革新之路?
首场直播:Simcenter AI 赋能电子行业研发创新
直播时间:04月15日14:00-14:50

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 12

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表