834|0

1339

帖子

0

资源

纯净的硅(高级)

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

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


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

ADC.PNG

     在这里,我们的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.功能正常,偶尔出现其他灯被一闪而过的点亮,主要是我们只采样一次,想避免的话,可以多采样几次进行滤波。

      看看运行的效果吧:

adc.gif

此帖出自GD32 MCU论坛

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

相关帖子
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
    推荐帖子
    STEVAL-IDB007V1—体验测评第一帖 @【ST MEMS 传感器技术论坛】

    写在前面的话:首先提出抱歉,最近工作实在是太多了,没来的及及时做出评测,表示抱歉,sorry、sorry、sorry。。。。。 此次测评 ...

    拆解鼠标

    拆解一个伴随我两年多的鼠标,USB头出现了电问题,经常性失灵。看看哪天能发一个抢救的帖子吧。 下面进入正题,这就是拆解后的 ...

    [GD32F350作品提交] 基于GD32F350的工业控制设备

    本帖最后由 damiaa 于 2018-10-17 15:42 编辑 基于GD32F350的工业控制设备 ...

    如何深入的学习C语言

    在嵌入式行业摸爬滚打有8年左右的时间了,对C语言有颇多的感触和认识,本文就畅聊一下关于C语言的深入学习部分。每次想到C语言的 ...

    全志异核多构 AI智能视觉V853开发板测评 - sample_virvi2vo 测试程序启动分析

    # V853 官方板自带固件中的sample_virvi2vo 测试程序启动分析 V853自带一个开机启动一路摄像头并在LCD上全屏显示的应用,这个 ...

    用魔术贴收纳万用表笔

    本帖最后由 dcexpert 于 2022-11-6 12:48 编辑 万用表笔收纳一直是个小问题,使用时希望线长一点,用着方便;不用时,表笔容 ...

    关闭
    站长推荐上一条 1/6 下一条

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

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

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

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