鸿蒙Hi3861 ADC驱动怎样完善开发板上的3个按键

其中 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引脚。初始化代码如下:


  1. (hi_void)hi_gpio_init(); 
  2.    
  3.   hi_io_set_func(HI_IO_NAME_GPIO_5, HI_IO_FUNC_GPIO_5_GPIO); /* uart1 rx */ 
  4.  
  5.   ret = hi_gpio_set_dir(HI_GPIO_IDX_5, HI_GPIO_DIR_IN); 
  6.   if (ret != HI_ERR_SUCCESS) { 
  7.       printf("===== ERROR ======gpio -> hi_gpio_set_dir1 ret:%d\r\n", ret); 
  8.       return
  9.   } 

(2)读取ADC值

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


  1. memset_s(g_adc_buf, sizeof(g_adc_buf), 0x0, sizeof(g_adc_buf)); 
  2.  
  3.   for (i = 0; i < ADC_TEST_LENGTH; i++) { 
  4.       ret = hi_adc_read((hi_adc_channel_index)HI_ADC_CHANNEL_2, &data, HI_ADC_EQU_MODEL_1, HI_ADC_CUR_BAIS_DEFAULT, 0); 
  5.       if (ret != HI_ERR_SUCCESS) { 
  6.           printf("ADC Read Fail\n"); 
  7.           return
  8.       } 
  9.       g_adc_buf[i] = data; 
  10.   } 

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

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


  1. for (i = 0; i < data_len; i++) { 
  2.      vlt = g_adc_buf[i]; 
  3.      float voltage = (float)vlt * 1.8 * 4 / 4096.0;  /* vlt * 1.8 * 4 / 4096.0: Convert code into voltage */ 
  4.      vlt_max = (voltage > vlt_max) ? voltage : vlt_max; 
  5.      vlt_min = (voltage < vlt_min) ? voltage : vlt_min; 
  6.  } 
  7.  //printf("vlt_min:%.3f, vlt_max:%.3f \n", vlt_min, vlt_max); 
  8.  
  9.  vlt_val = (vlt_min + vlt_max)/2.0; 
  10.  
  11.  if((vlt_val > 0.4) && (vlt_val < 0.6)) 
  12.  { 
  13.      if(key_flg == 0) 
  14.      { 
  15.          key_flg = 1; 
  16.          key_status = KEY_EVENT_S1; 
  17.      } 
  18.  } 
  19.  if((vlt_val > 0.8) && (vlt_val < 1.1)) 
  20.  { 
  21.      if(key_flg == 0) 
  22.      { 
  23.          key_flg = 1; 
  24.          key_status = KEY_EVENT_S2; 
  25.      } 
  26.  } 
  27.  
  28.  if((vlt_val > 0.01) && (vlt_val < 0.3)) 
  29.  { 
  30.      if(key_flg == 0) 
  31.      { 
  32.          key_flg = 1; 
  33.          key_status = KEY_EVENT_S3; 
  34.      } 
  35.  } 
  36.  
  37.  if(vlt_val > 3.0) 
  38.  { 
  39.      key_flg = 0; 
  40.      key_status = KEY_EVENT_NONE; 
  41.  } 

(4)使用

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


  1. while(1) 
  2.  { 
  3.      //读取ADC值 
  4.      app_demo_adc_test(); 
  5.  
  6.      switch(get_key_event()) 
  7.      { 
  8.          case KEY_EVENT_NONE: 
  9.          { 
  10.               
  11.          } 
  12.          break; 
  13.  
【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章