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

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

3天内不再提示

DshanMCU-R128s2 ADC按键配置方法

嵌入式Linux那些事 来源:嵌入式Linux那些事 作者:嵌入式Linux那些事 2023-12-22 19:11 次阅读

FreeRTOS平台上使用的按键为ADC-KEY,采用的ADC模块为GPADC。

按键功能驱动的实现是通过ADC分压,使每个按键检测的电压值不同,从而实现区分不同的按键。按下或者弹起中断之后,通过中断触发,主动检测当前电压识别出对应的按键。最后再通过input子系统将获取按键的键值并上报给应用层。

GPADC-Key配置方法

按键结构体定义key_config的成员:

struct sunxikbd_config{
    unsigned int measure;    // 电压阈值
    char *name;              // 功能名
    unsigned int key_num;    // 按键数量
    unsigned int scankeycodes[KEY_MAX_CNT];    // 按键的键值
    unsigned int key_vol[KEY_MAX_CNT];         // 按键的电压值
};

不同平台的配置可能不同,以r128为例,下面是r128的成员config:

static struct sunxikbd_config key_config = {
    .measure = 2500,
    .name = "gpadc-key",
    .key_num = 5,
    .key_vol = {164,415,646,900,1157},
    .scankeycodes = {115,114,139,164,116}
};

当前按键驱动的配置都是以hardcode的方式写入驱动代码中,也就是说按键的数量,不同按键对应的电压值,不同按键对应的KeyCode等等配置如果要修改的话,需要对源码进行修改。

如上述按键结构体的定义,以下两配置按照默认配置即可。

  • measure:GPADC最大能够识别的电压值,需要根据UserMaual来设置。默认为2.5V。
  • name:注册的按键驱动名称,会注册到input子系统中。

可以自定义的配置为:key_num,key_vol,scankeycodes。

  • key_num: 按照实际硬件设计来设置。
  • key_vol: 按照硬件,实际每个按键分压的情况来设置。
  • scankeycodes:每个按键对应的KeyCode,方便应用通过input获得按下的按键时,能够识别是哪个按键按下了。

key_vol的配置方法,可以参考下图的GPADC-KEY的硬件设置。

image1

在图中,VCC输入的电压为3.3V,通过分压关系,第一个按键的电压为0.21V,因此key_vol可以设置为210,以此类推。

驱动初始化方法

默认系统启动时,不会加载GPADC驱动以及按键驱动。

如果需要加载GPADC-Key驱动,需要调用以下函数:

int sunxi_gpadc_key_init(void);

调用 sunxi_gpadc_key_init() 该函数即可完成GPADC驱动以及按键驱动的加载了,即可开始使用按键驱动。

应用调用方法

接下来继续介绍一下,应用中该如何获取按键按下的事件。

在FreeRTOS系统中,也移植了 Linux 的 input 子系统。GPADC-Key 中也是调用了 input 的接口,进行注册 input 设置,上报事件等动作。

在调用 sunxi_gpadc_key_init() 时,通过 input_set_capability() 去设置了事件的属性;通过 sunxi_input_register_device() 注册了 input 设备;在按键按下触发中断时,也是通过 input_report_key()input_sync() 上报 input 事件。

因此,在应用层想要获取input事件,可以直接通过input接口去获取,使用示例可如下例程:

int input_func(void)
{
    int fd = -1;
    struct sunxi_input_event event;

    sunxi_gpadc_key_init(); // 驱动初始化

    fd = sunxi_input_open(DEVICE_NAME);
    if (fd < 0)
        return -1;

    while (1) {
        sunxi_input_readb(fd, &event, sizeof(struct sunxi_input_event));
        if (event.type != EV_KEY)
            continue;

        if (event.value == 0) {
            printf("key upn");
            continue;
        }
        printf("key press: KeyCode:%dn", event.code);
    }

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

    关注

    99

    文章

    6538

    浏览量

    546018
  • FreeRTOS
    +关注

    关注

    12

    文章

    484

    浏览量

    62453
  • ADC按键设计
    +关注

    关注

    0

    文章

    3

    浏览量

    1693
  • R128
    +关注

    关注

    0

    文章

    41

    浏览量

    133
收藏 人收藏

    评论

    相关推荐

    【瑞萨RA2L1入门学习】02、DAC电压输出及ADC电压采集实验

    的模拟信号通过 ADC 转化为可以通过单片机处理的数字信号。 RA2L1开发板搭载的R7FA2L1AB2DFL芯片拥有12位的ADC。 3 软件部分 将先前的P项目模板复制一份,重命名
    发表于 01-26 10:10

    ADC128S022配置为其他路数据的时候,数据不能正常读出,为什么?

    整个系统的连接关系图如下所示: (MG2455/51单片机-12MHz晶振)<--(模拟SPI)-->(ADC128S022) 问题: (1) 当使用第8路数据的时候
    发表于 01-13 06:22

    adc128s102 VA=5v VD=3.3v可以吗?

    adc128s102VA=5vVD=3.3v可以吗看示例和性能指标都是给的一样的 要么都是5v要么都是3.3v
    发表于 01-10 08:29

    如何提高ADC128S052输出能力?

    ADC128S052的数字输出能力为V~0.5之间,最近在使用这个adc时发现,其1时输出大约为0.8V,而且与Vd引脚的电压正好互补,这个输出的电压,单片机无法识别为1,如何提高ADC输出能力?
    发表于 01-10 08:11

    ADC128S022的驱动架构参考 ti-adc128s052.c,要如何做移位生成12bit结果呢?

    ADC128S022的驱动架构参考 ti-adc128s052.c, 具体如下图所示。 上层读取buf[1], buf[2]请问要如何做移位生成12bit结果呢?
    发表于 12-16 06:32

    求助,关于ADC128S102的采样速率问题求解

    现采用ADC128S102采集温度电压,该芯片的采样速率在500ksps-1Msps。问题(1)一般ADC采样速率从0开始,使用时只要不超过最高采样率都可以使用,不明白该芯片500ksps最低采样
    发表于 12-12 07:47

    ADC128S102WGRQV想知道输入阻抗具体有多大?

    ADC128S102WGRQV想知道输入阻抗具体有多大?多少KOhms?要计算用,谢谢!我已经看过7.3.3章节。
    发表于 12-06 08:33

    ADC128S102EVM评估模块

    电子发烧友网站提供《ADC128S102EVM评估模块.pdf》资料免费下载
    发表于 12-05 14:22 1次下载
    <b class='flag-5'>ADC128S</b>102EVM评估模块

    adc128s052设备树配置,基准电压不能被内核识别是怎么回事?

    ,adc128s052\"; reg = <0>; vref-supply = <&vdd_supply>; spi-max-frequency = <1000000>;
    发表于 11-29 16:00

    用28035如何读取ADC128S022的数据?

    请问用28035如何读取ADC128S022的数据,或者说是该怎么配置
    发表于 11-18 08:34

    求助,关于adc3101 I2S采集问题求解

    您好: 我现在使用TLVADC3101采集音频数据,i2s接口立体声模式,ADC3101作为i2s主设备,采样率48Khz,数据长度16bit,DSP作为从设备,通过DMA方式采集,使用CSL库
    发表于 11-06 07:43

    ADC128S052、ADC128S052-Q1模数转换器数据表

    电子发烧友网站提供《ADC128S052、ADC128S052-Q1模数转换器数据表.pdf》资料免费下载
    发表于 07-22 11:12 0次下载
    <b class='flag-5'>ADC128S</b>052、<b class='flag-5'>ADC128S</b>052-Q1模数转换器数据表

    ADC128S102-SEP耐辐射8通道、50-kSPS至1-MSPS、12位ADC数据表

    电子发烧友网站提供《ADC128S102-SEP耐辐射8通道、50-kSPS至1-MSPS、12位ADC数据表.pdf》资料免费下载
    发表于 07-12 09:25 1次下载
    <b class='flag-5'>ADC128S</b>102-SEP耐辐射8通道、50-kSPS至1-MSPS、12位<b class='flag-5'>ADC</b>数据表

    ESP32-S3R2如何配置开启PSRAM?

    如题 ,esp-idf V4.4.6 ESP32-S3R2配置开启PSRAM后,编译运行代码输出异常: E (327) psram: PSRAM ID read error: 0x00ffffff
    发表于 06-28 07:46

    如何用STM32F107做adc128s022的5路采集?

    正在用STM32F107做adc128s022的5路采集,没有思路谁做过能说说思路或者程序参考一下吗,谢谢
    发表于 05-15 07:29