0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

小凌派-RK2206OpenHarmony开发板例程系列之一:ADC按键案例

福州市凌睿智捷电子有限公司 2022-04-11 13:59 次阅读

一、简介
嵌入式系统产品开发中,按键板的设计是最基本的,也是项目评估阶段必须要考虑的问题。其实现方式有很多种,具体使用那一种就需要结合可用IO数量,并综合考虑成本,做出最终选择。传统的按键检测方法是一个按键对应一个GPIO口,进行高低电平输入检测。可是在GPIO口紧缺的情况下,不得不需要一个有效的解决方案,其中ADC检测实现按键功能是一种相对有效的解决方案。
ADC检测实现简单实用的按键方法:仅需要一个ADC和若干个电阻就可实现多个按键的输入检测。工作原理:按下按键时,通过电阻分压得到不同的电压值,ADC采集在各个范围内的值来判定是哪个按键按下。
本文采用RK2206芯片自带的逐次逼近寄存器模数转换器(Successive-Approximation Analog to Digital Converter),是一种常用的A/D转换结构,其较低的功耗表现,不错的转换速率,在有低功耗要求(可穿戴设备、物联网)的数据采集场景下广泛应用。
二、硬件电路设计
ADC检测实现简单实用的按键方法:仅需要一个ADC和若干个电阻就可实现多个按键的输入检测。工作原理:按下按键时,通过电阻分压得到不同的电压值,ADC采集在各个范围内的值来判定是哪个按键按下。
模块整体硬件电路如下图所示,电路中包含了1根ADC引脚和4个按键。

凌智电子:小凌派-RK2206鸿蒙开发板例程系列之一ADC按键案例-OpenHarmony技术社区

图1 硬件电路图

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

表1 按键对应电压表

凌智电子:小凌派-RK2206鸿蒙开发板例程系列之一ADC按键案例-OpenHarmony技术社区

USER_KEY_ADC引脚连接到RK2206芯片的GPIO0_C5,如下图所示:

凌智电子:小凌派-RK2206鸿蒙开发板例程系列之一ADC按键案例-OpenHarmony技术社区

图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)当前无按键。

凌智电子:小凌派-RK2206鸿蒙开发板例程系列之一ADC按键案例-OpenHarmony技术社区

图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 set
hb build -f

4、烧写固件
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
……

好了,今天的课程就到这里,更多技术干货请关注福州市凌睿智捷电子有限公司(凌智电子),持续更新中…

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式开发
    +关注

    关注

    18

    文章

    979

    浏览量

    46961
  • OpenHarmony
    +关注

    关注

    23

    文章

    3322

    浏览量

    15161
  • 凌智电子
    +关注

    关注

    1

    文章

    21

    浏览量

    943
收藏 人收藏

    评论

    相关推荐

    OpenHarmony开发板汇总

    Tiger(A311D)标准系统:DAYU200开发套件(RK3568)标准系统:软通扬帆富设备开发板RK3399) 系统类型 OpenHarm
    发表于 10-19 11:27

    Windows搭建OpenHarmony编译环境

    OpenHarmony编译呢?答案是:可以。所以,我们今天来尝试在Windows环境下搭建OpenHarmony编译环境。 本次OpenHarmony选用小
    发表于 08-16 16:07

    好书推荐|《OpenHarmony嵌入式操作原理与应用》

    操作系统的原理与开发过程有更深刻的了解。 本书基于已经通过开放原子开源基金会XTS认证的小RK2206开发套件,书中所有的电路、程序和
    发表于 06-27 23:12

    OpenHarmony嵌入式系统原理与应用——基于RK2206芯片(微课视频版)》学习记录1 环境配置与源码编译

    ,需要配置rk2206开发板的IP地址和SSH连接。 二、源码下载和编译 获取OpenHarmony源码:OpenHarmony款开源的
    发表于 06-25 11:26

    OpenHarmony嵌入式系统原理与应用——基于RK2206芯片(微课视频版)》学习记录之一

    非常感谢电子发烧友论坛提供这次《《OpenHarmony嵌入式系统原理与应用——基于RK2206芯片(微课视频版)》学习机会。 下面记录下书中实验需要注意的些细节。 1、安装hb后
    发表于 06-15 14:10

    触觉智能RK3568_OpenHarmony开发板适配

    触觉智能RK3568_OpenHarmony开发板适配 2023-5-24 master openharmony 4.0.7.3 openharmony版本更新代码会变化,请看当前文件
    的头像 发表于 06-07 16:18 718次阅读
    触觉智能<b class='flag-5'>RK3568_OpenHarmony</b><b class='flag-5'>开发板</b>适配

    基于小RK2206的智教助教—智能控制教学教室的探索先锋

    的教育形式和现代化教学手段,给教育行业带来了新的机遇。2、 项目简介2.1 项目描述这是款基于OpenHarmony的智慧教室系统。我们的主控采用小
    发表于 06-06 15:15

    基于小RK2206的智能语音电子秤设计

    加、校准减四个功能。其中,复位清除功能是通过将单片机复位重启按键实现的,即单片机复位按键为清除显示按键。去皮、校准加、校准减按键接小
    发表于 05-27 13:46

    【CW32饭盒开发板试用体验】开发板简单介绍和开发板初体验

    今天开箱款基于CW32F030C8T6的开发板开发板命名为CW32饭盒。 下面简单的对开发板做个介绍: CW32饭盒
    发表于 05-22 10:56

    【CW32饭盒开发板试用体验】开发板简单介绍及初体验

    今天开箱款基于CW32F030C8T6的开发板开发板命名为CW32饭盒。 下面简单的对开发板做个介绍: CW32饭盒
    发表于 05-22 10:47

    亿晟科技被评为OpenHarmony生态开发板贡献单位

    近日,深圳市亿晟科技有限公司被评为“OpenHarmony生态开发板贡献单位”,并被OpenHarmony项目群工作委员会授予“OpenHarmony生态
    的头像 发表于 05-09 09:53 553次阅读
    亿晟科技被评为<b class='flag-5'>OpenHarmony</b>生态<b class='flag-5'>开发板</b>贡献单位

    已结束-【书籍评测活动NO.12】 OpenHarmony嵌入式系统原理与应用——基于RK2206芯片(微课视频版)

    OpenHarmony开源社区专家,他技术功底深厚,发布的OpenHarmony项目开发文章常常占据社区榜首,受到广大读者致好评。《OpenHar
    发表于 05-08 15:51

    基于OpenHarmony智能音响的操作视频展示

    此项目基于OpenHarmony 操作系统——我国自主研究、国产可控的芯片RK2206 搭载的个全新的,独立的首个完全开源的操作系统。该项目也是 OpenHarmony 在智能音箱领
    发表于 05-06 15:44

    基于OpenHarmony的智能音响

    框图 3.2 主控芯片 图3.2 小采用小RK2206 OpenHarmony
    发表于 05-06 15:41

    基于小RK2206的无线智能运动动态监测系统

    无线智能运动动态监测系统由瑞芯微RK2206芯片搭载OpenHarmony 操作系统设计。能够精确测量在日常生活中的人体心电信号,体温信息以及运动步数并通过无线通信方式传输至上位机的套安全可靠
    发表于 05-04 16:01