电子产业一站式赋能平台

PCB联盟网

搜索
查看: 810|回复: 0
收起左侧

Hi3861 ADC驱动 如何使用开发板上的3个按键

[复制链接]

2607

主题

2607

帖子

7472

积分

高级会员

Rank: 5Rank: 5

积分
7472
发表于 2020-10-23 23:56:34 | 显示全部楼层 |阅读模式
Hi3861 ADC驱动 如何使用开发板上的3个按键,   
本帖最后由 jf_39160458 于 2020-10-23 23:39 编辑



本节主要介绍Hi3861 的 ADC功能,顺便实现ADC按键检测。这里先看效果吧。

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



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

看下效果:

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



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



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





其中 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



代码实现其实很简单。

(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\r\n“, 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\n“);
      
  •             return;
      
  •         }
      
  •         g_adc_buf = data;
      
  •     }

复制代码



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

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



  •     for (i = 0; i < data_len; i++) {
      
  •         vlt = g_adc_buf;
      
  •         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 \n“, 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 \r\n“);
      
  •             }
      
  •             break;
      

  •   
  •             case KEY_EVENT_S2:
      
  •             {
      
  •                 printf(“KEY_EVENT_S2 \r\n“);
      
  •             }
      
  •             break;
      

  •   
  •             case KEY_EVENT_S3:
      
  •             {
      
  •                 printf(“KEY_EVENT_S3 \r\n“);
      
  •             }
      
  •             break;
      

  •   
  •         }
      

  •   
  •         usleep(30000);
      
  •     }
      
  •      

复制代码
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表