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

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

3天内不再提示

如何操作ADC去读取电压

电子发烧友开源社区 来源:HarmonyOS官方合作社区 作者:HarmonyOS官方合作社 2022-03-02 17:51 次阅读

摘要

本文简单介绍如何操作ADC去读取电压,并且实现开发板上3个ADC按键检测的功能。

适合群体

适用于润和Hi3861开发板,L0轻量系统驱动开发

1、实验效果

查看开发板,可以看到除了复位按键之外,还有3个按键。而查看原理,我们可以看到这个3个按键其实都是接的GPIO5 引脚,而GPIO5引脚又可复用为ADC2引脚。

如何操作ADC去读取电压

故而,我们可以猜测出来我们可以使用ADC检测电压,判断出来是哪个引脚被按下了。看下效果:

当我按下 按键1 的时候串口会打印:

如何操作ADC去读取电压

当我按下 按键2 的时候串口会打印:

如何操作ADC去读取电压

当我按下 USER按键 的时候串口会打印:

如何操作ADC去读取电压

其中 vlt_min 表示读取到ADC值的最小值,vlt_max 表示读取到ADC值的最大值。

由此我们可以看到,按键1被按下的时候,ADC值得范围在 0.563 ~ 0.577,按键2按下后,ADC值在 0.963 ~ 0.970,USER按键按下后 ADC值 在 0.197 ~ 0.204。

如果没有按键按下,则ADC值在 3.227 ~ 3.241,vlt_min:3.227, vlt_max:3.241

2、代码实现

代码实现其实很简单:

(1)引脚初始化

这里由于GPIO5默认被复用为串口引脚,这里我们重新修改为普通GPIO引脚。初始化代码如下:

(hi_void)hi_gpio_init();    hi_io_set_func(HI_IO_NAME_GPIO_5, HI_IO_FUNC_GPIO_5_GPIO); /* uart1 rx */
  ret = hi_gpio_set_dir(HI_GPIO_IDX_5, HI_GPIO_DIR_IN);  if (ret != HI_ERR_SUCCESS) {    printf("===== ERROR ======gpio -> hi_gpio_set_dir1 ret:%d
", ret);    return;  }

向右滑动查看完整代码

(2)读取ADC值

读取ADC值的代码页相对简单,这里,我是重复读取64次,减少误判。

memset_s(g_adc_buf, sizeof(g_adc_buf), 0x0, sizeof(g_adc_buf));
  for (i = 0; i < ADC_TEST_LENGTH; i++) {    ret = hi_adc_read((hi_adc_channel_index)HI_ADC_CHANNEL_2, &data, HI_ADC_EQU_MODEL_1, HI_ADC_CUR_BAIS_DEFAULT, 0);    if (ret != HI_ERR_SUCCESS) {      printf("ADC Read Fail
");      return;    }    g_adc_buf[i] = data;  }

向右滑动查看完整代码

(3)对读出来的ADC值进行判断处理

S1对应的是按键1 、 S2对应的是按键2 、 S3对应的是 USER按键

for (i = 0; i < data_len; i++) {    vlt = g_adc_buf[i];    float voltage = (float)vlt * 1.8 * 4 / 4096.0; /* vlt * 1.8 * 4 / 4096.0: Convert code into voltage */    vlt_max = (voltage > vlt_max) ? voltage : vlt_max;    vlt_min = (voltage < vlt_min) ? voltage : vlt_min;  }  //printf("vlt_min:%.3f, vlt_max:%.3f 
", vlt_min, vlt_max);
  vlt_val = (vlt_min + vlt_max)/2.0;
  if((vlt_val > 0.4) && (vlt_val < 0.6))  {    if(key_flg == 0)    {      key_flg = 1;      key_status = KEY_EVENT_S1;    }  }  if((vlt_val > 0.8) && (vlt_val < 1.1))  {    if(key_flg == 0)    {      key_flg = 1;      key_status = KEY_EVENT_S2;    }  }
  if((vlt_val > 0.01) && (vlt_val < 0.3))  {    if(key_flg == 0)    {      key_flg = 1;      key_status = KEY_EVENT_S3;    }  }
  if(vlt_val > 3.0)  {    key_flg = 0;    key_status = KEY_EVENT_NONE;  }

向右滑动查看完整代码

(4)使用

编写好上面代码后,就可以直接在while循环中判断按键值了。

while(1)  {    //读取ADC值    app_demo_adc_test();
    switch(get_key_event())    {      case KEY_EVENT_NONE:      {              }      break;
      case KEY_EVENT_S1:      {        printf("KEY_EVENT_S1 
");      }      break;
      case KEY_EVENT_S2:      {        printf("KEY_EVENT_S2 
");      }      break;
      case KEY_EVENT_S3:      {        printf("KEY_EVENT_S3 
");      }      break;
    }
    usleep(30000);  }

向右滑动查看完整代码

原文标题:OpenHarmony轻量系统开发【6】驱动之ADC按键

文章出处:【微信公众号:HarmonyOS官方合作社区】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红


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

    关注

    95

    文章

    5651

    浏览量

    539474
  • 驱动
    +关注

    关注

    11

    文章

    1717

    浏览量

    84345
  • 电压
    +关注

    关注

    45

    文章

    5082

    浏览量

    114415

原文标题:OpenHarmony轻量系统开发【6】驱动之ADC按键

文章出处:【微信号:HarmonyOS_Community,微信公众号:电子发烧友开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何在MSP430G2中使用ADC使用Energia IDE读取模拟电压

    在本教程中,我们将学习如何在MSP430G2中使用ADC使用Energia IDE读取模拟电压。我们将一个小电位计连接到MSP板,并向模拟引脚提供变化的电压
    的头像 发表于 11-16 17:24 1678次阅读
    如何在MSP430G2中使用<b class='flag-5'>ADC</b>使用Energia IDE<b class='flag-5'>读取</b>模拟<b class='flag-5'>电压</b>

    如何使用ADC读取DAC输出引脚的电压值?

    如何使用STM32CubeMX配置STM32L431RCT6的ADC外设?如何使用ADC读取DAC输出引脚的电压值?
    发表于 07-01 06:01

    中断方式单通道ADC读取电压

    单端/差分ADC和三个内部通道。学习内容:1.轮询方式单通道ADC读取电压2.中断方式单通道ADC读取
    发表于 08-11 07:22

    如何使用ADC采集电压

    如何使用ADC采集电压呢?有哪些操作流程?
    发表于 09-24 06:27

    新手求助怎样读取ADC的值

    GPIO的操作步骤有哪些?独立看门狗的操作步骤有哪些?怎样读取ADC的值?
    发表于 09-24 06:57

    怎样读取基于stm32f030的ADC

    ADC设置的一般步骤有哪些?怎样读取ADC的值?如何对ADC的值进行分析?
    发表于 10-15 08:02

    怎样计算STM32的ADC参考电压与参照电压

    STM32的ADC电压输入范围是多少?怎样计算STM32的ADC参考电压与参照电压呢?
    发表于 10-21 06:51

    如何读取ADC1内部温度传感器及内部参照电压

    单片机为:STM32F103RCT6软件:STM32CubeMX,MDK功能:不使用DMA,不使用中断,读取ADC1内部温度传感器及内部参照电压VREFINT的值描述:温度传感器和通道ADC
    发表于 12-10 07:39

    如何利用基于STM32F407的单通道ADC读取电压

    ADC的功能有哪些?如何利用基于STM32F407的单通道ADC读取电压呢?
    发表于 01-25 06:44

    OpenHarmony轻量系统开发【6】驱动之ADC按键

    摘要:本文简单介绍如何操作ADC读取电压,并且实现开发板上3个ADC按键检测的功能适合群体:适
    发表于 01-25 10:25

    STM32单片机基础21——使用ADC读取电压

    title: 【STM32Cube-21】使用ADC读取电压值tags: STM32CubeMX ADCcategories: STM32CubeMXabbrlink: 862377868date
    发表于 11-19 09:51 34次下载
    STM32单片机基础21——使用<b class='flag-5'>ADC</b><b class='flag-5'>读取</b><b class='flag-5'>电压</b>值

    【GD32】GD32读取ADC数据

    读取ADC值4.将ADC值转换成电压值我这里采用PA5进行ADC的channel_5通道1.初始IO引脚/*初始化时钟*/rcu_perip
    发表于 12-02 15:06 26次下载
    【GD32】GD32<b class='flag-5'>读取</b><b class='flag-5'>ADC</b>数据

    【STM32Cube_22】使用ADC读取电压

    本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的ADC外设,读取DAC输出引脚的电压值。1. 准备工作硬件准备开发板首先需要准备一个开发板,这里我准备的是STM32L4
    发表于 12-05 16:21 12次下载
    【STM32Cube_22】使用<b class='flag-5'>ADC</b><b class='flag-5'>读取</b><b class='flag-5'>电压</b>值

    介绍ADC寄存器的读取

    在“使用 Node 将 IoT 与嵌入式连接.js第 3 部分”中,我们查看了用于读取加速度计的软件包。在第4部分中,我们将重点介绍ADC寄存器的读取
    的头像 发表于 10-12 09:45 1749次阅读

    APM32F030C8T6_ADC_ADC Vref参考电压数值读取出错

    APM32F030C8T6_ADC_ADC Vref参考电压数值读取出错
    发表于 11-09 21:04 0次下载
    APM32F030C8T6_<b class='flag-5'>ADC_ADC</b> Vref参考<b class='flag-5'>电压</b>数值<b class='flag-5'>读取</b>出错