首页 » 互联网 » 小凌派-RK2206开拓板:ADC按键案例_按键_电压

小凌派-RK2206开拓板:ADC按键案例_按键_电压

南宫静远 2025-01-11 19:49:55 0

扫一扫用手机浏览

文章目录 [+]

ADC检测实现大略实用的按键方法:仅须要一个ADC和多少个电阻就可实现多个按键的输入检测。
事情事理:按下按键时,通过电阻分压得到不同的电压值,ADC采集在各个范围内的值来剖断是哪个按键按下。

本文采取RK2206芯片自带的逐次逼近寄存器型模数转换器(Successive-Approximation Analog to Digital Converter),是一种常用的A/D转换构造,其较低的功耗表现,不错的转换速率,在有低功耗哀求(可穿着设备、物联网)的数据采集场景下广泛运用。

小凌派-RK2206开拓板:ADC按键案例_按键_电压 小凌派-RK2206开拓板:ADC按键案例_按键_电压 互联网

二、硬件电路设计

ADC检测实现大略实用的按键方法:仅须要一个ADC和多少个电阻就可实现多个按键的输入检测。
事情事理:按下按键时,通过电阻分压得到不同的电压值,ADC采集在各个范围内的值来剖断是哪个按键按下。

小凌派-RK2206开拓板:ADC按键案例_按键_电压 小凌派-RK2206开拓板:ADC按键案例_按键_电压 互联网
(图片来自网络侵删)

模块整体硬件电路如下图所示,电路中包含了1根ADC引脚和4个按键。

图1 硬件电路图

个中,4个按键分别连接不同的电阻。
当按键按下时,USER_KEY_ADC检测到不同的电压。
详细如下所示:

序号

按键

电压(单位:V)

1

Key1

0.01

2

Key2

0.55

3

Key3

1.00

4

Key4

1.65

表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 -f

4、烧写固件

5、通过串口查当作果

运行结果

Adc Examplevlt:3.297VAdc Examplevlt:3.297VAdc Examplevlt:3.297VAdc Examplevlt:3.297VAdc Examplevlt:3.297VAdc Examplevlt:3.297V……

好了,本日的课程就到这里,我们下次再见!

标签:

相关文章