一、简介
在嵌入式系统产品开发中,按键板的设计是最基本的,也是项目评估阶段必须要考虑的问题。其实现方式有很多种,具体使用那一种就需要结合可用io数量,并综合考虑成本,做出最终选择。传统的按键检测方法是一个按键对应一个gpio口,进行高低电平输入检测。可是在gpio口紧缺的情况下,不得不需要一个有效的解决方案,其中adc检测实现按键功能是一种相对有效的解决方案。
adc检测实现简单实用的按键方法:仅需要一个adc和若干个电阻就可实现多个按键的输入检测。工作原理:按下按键时,通过电阻分压得到不同的电压值,adc采集在各个范围内的值来判定是哪个按键按下。
本文采用rk2206芯片自带的逐次逼近寄存器型模数转换器(successive-approximation analog to digital converter),是一种常用的a/d转换结构,其较低的功耗表现,不错的转换速率,在有低功耗要求(可穿戴设备、物联网)的数据采集场景下广泛应用。
二、硬件电路设计
adc检测实现简单实用的按键方法:仅需要一个adc和若干个电阻就可实现多个按键的输入检测。工作原理:按下按键时,通过电阻分压得到不同的电压值,adc采集在各个范围内的值来判定是哪个按键按下。
模块整体硬件电路如下图所示,电路中包含了1根adc引脚和4个按键。
图1 硬件电路图
其中,4个按键分别连接不同的电阻。当按键按下时,user_key_adc检测到不同的电压。具体如下所示:
表1 按键对应电压表
user_key_adc引脚连接到rk2206芯片的gpio0_c5,如下图所示:
图2 user_key_adc引脚的硬件电路图
三、adc接口
adc相应接口头文件在:
/device/rockchip/rk2206/adapter/include/lz_hardware.h
rk2206芯片提供以下两大类接口:
(1)初始化、销毁adc;
(2)adc读操作。
具体接口如ppt所示。以下我们详细讲解这些接口。
(1)lzsaradcinit
该函数主要功能是saradc设备初始化。
int lzsaradcinit(void);
成功返回lz_hardware_success, 其余为失败。
(2)lzsaradcdeinit
该函数主要功能是saradc设备释放。
int lzsaradcdeinit(void);
成功返回lz_hardware_success, 其余为失败。
(3)lzsaradcreadvalue
该函数主要功能是saradc设备读取。
int lzsaradcreadvalue(unsigned int chn, unsigned int *val);
参数chn:adc通道id;
参数val:读取值。
成功返回lz_hardware_success, 其余为失败。
四、程序设计
adc按键程序每1秒通过gpio0_pc5读取一次按键电压,通过电压数值判断当前是哪个按键被按下,并打印出该按键名称。
如图所示为adc按键主程序流程图,开机liteos系统初始化后,进入主程序先初始化adc设备。程序进入主循环,1秒获取一次adc采样电压,判断:
(1)采样电压在0.00~0.11v之间,则当前是按下key1,打印key1;
(2)采样电压在0.45~0.65v之间,则当前是按下key2,打印key2;
(3)采样电压在0.90~1.1v之间,则当前是按下key3,打印key3;
(4)采样电压在1.55~1.75v之间,则当前是按下key4,打印key4;
(5)当前无按键。
图3 主程序流程图
void adc_process(){ float voltage; /* 初始化adc设备 */ adc_dev_init(); while (1) { printf(***************adc example*************\r\n); /*获取电压值*/ voltage = adc_get_voltage(); printf(vlt:%.3fv\n, voltage); if ((0.11 >= voltage) && (voltage >= 0.00)) { printf(\tkey1\n); } else if ((0.65 >= voltage) && (voltage >= 0.45)) { printf(\tkey2\n); } else if ((1.1 >= voltage) && (voltage >= 0.9)) { printf(\tkey3\n); } else if ((1.75 >= voltage) && (voltage >= 1.55)) { printf(\tkey4\n); } /* 睡眠1秒 */ los_msleep(1000); }}adc初始化程序主要分为adc初始化和配置adc参考电压为外部电压两部分:
static unsigned int adc_dev_init(){ unsigned int ret = 0; uint32_t *pgrfsoccon29 = (uint32_t *)(0x41050000u + 0x274u); uint32_t ulvalue; ret = devioinit(m_adckey); if (ret != lz_hardware_success) { printf(%s, %s, %d: adc key io init fail\n, __file__, __func__, __line__); return __line__; } ret = lzsaradcinit(); if (ret != lz_hardware_success) { printf(%s, %s, %d: adc init fail\n, __file__, __func__, __line__); return __line__;} /* 设置saradc的电压信号,选择avdd */ ulvalue = *pgrfsoccon29; ulvalue &= ~(0x1 << 4); ulvalue |= ((0x1 << 4) << 16); *pgrfsoccon29 = ulvalue; return 0;}rk2206芯片采用一种逐次逼近寄存器型模数转换器(successive-approximation analog to digital converter),是一种常用的a/d转换结构,其较低的功耗表现,还不错的转换速率,在有低功耗要求(可穿戴设备、物联网)的数据采集场景下广泛应用。该adc采用10bit采样,最高电压为3.3v。简而言之,adc采样读取的数据,bit[0~9]有效,且最高数值0x400(即1024)代表实际电压差3.3v,也就是说1个数值等于3.3v / 1024 = 0.003222v。
static float adc_get_voltage(){ unsigned int ret = lz_hardware_success; unsigned int data = 0; ret = lzsaradcreadvalue(adc_channel, &data); if (ret != lz_hardware_success) { printf(%s, %s, %d: adc read fail\n, __file__, __func__, __line__); return 0.0;}return (float)(data * 3.3 / 1024.0);}五、编译过程
1、打开sdk下面路径的文件
/vendor/lockzhiner/rk2206/samples/b1_adc/adc_example.c
注意:gitee上的adc案例为通用案例,请大家根据上述的需求修改相关源代码。
2、修改编译脚本
修改 vendor/lockzhiner/rk2206/sample 路径下 build.gn 文件,指定 adc_example 参与编译。
“./b0_adc:adc_example”,
修改 device/lockzhiner/rk2206/sdk_liteos 路径下 makefile 文件,添加 -ladc_example 参与编译。
hardware_libs = -lhal_iothardware -lhardware -ladc_example
3、编译固件
hb set -root .hb sethb build -f4、烧写固件
5、通过串口查看结果
运行结果
***************adc example*************vlt:3.297v***************adc example*************vlt:3.297v***************adc example*************vlt:3.297v***************adc example*************vlt:3.297v***************adc example*************vlt:3.297v***************adc example*************vlt:3.297v……
好了,今天的课程就到这里,更多技术干货请关注福州市凌睿智捷电子有限公司(凌智电子),持续更新中…
DEKRA德凯助力Matter产品制造商顺利进入全球市场
信号调理 运放电压抬升原理是什么
2021最有价值的10大电信基础设施品牌公布:华为第一
霍尼韦尔启用SLM金属3D打印技术智能制造零件
出身寒门,成就东南亚知名EMC系统集成商
小凌派-RK2206OpenHarmony开发板例程系列之一:ADC按键案例
中国联通已在国内17个城市开展了5G试点覆盖11行业100多场景
6个增强现实技术及AR在各行各业的用法大盘点
iPhone 12 Pro Max屏幕偏黄,得分落后三星Note 20 Ultra一分
大家绝对没有用过的iphone功能
美国运营商Verizon计划明年6月份推出一款5G智能手机
画电路图需要用到哪些软件?
华为甘斌谈1+N 5G网络的发展趋势
华为高管降薪VS谦谦离职B站,传递出什么信号?
LED路灯急需相关认证
华为手机新品来袭,高颜值笔记本就选这个!
MaKey MaKey钢琴的制作教程
华为荣耀8或推出荣耀8Lite:麒麟658全新处理器+双2.5D玻璃!
VR产品争先恐后_AR产品尚在定义阶段
变频器的作用与原理 变频器的使用方法及参数调整