文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-12-03 15:51

关注

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com/

 本节主要介绍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引脚。初始化代码如下:

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

 (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.  
  5. ret = hi_adc_read((hi_adc_channel_index)HI_ADC_CHANNEL_2, &data, HI_ADC_EQU_MODEL_1, HI_ADC_CUR_BAIS_DEFAULT, 0); 
  6.  
  7. if (ret != HI_ERR_SUCCESS) { 
  8.  
  9. printf("ADC Read Fail\n"); 
  10.  
  11. return
  12.  
  13.  
  14. g_adc_buf[i] = data; 
  15.  

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

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

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

 (4)使用

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

  1. while(1) 
  2.  
  3.  
  4. //读取ADC值 
  5.  
  6. app_demo_adc_test(); 
  7.  
  8. switch(get_key_event()) 
  9.  
  10.  
  11. case KEY_EVENT_NONE: 
  12.  
  13.  
  14.  
  15. break; 
  16.  
  17. case KEY_EVENT_S1: 
  18.  
  19.  
  20. printf("KEY_EVENT_S1 \r\n"); 
  21.  
  22.  
  23. break; 
  24.  
  25. case KEY_EVENT_S2: 
  26.  
  27.  
  28. printf("KEY_EVENT_S2 \r\n"); 
  29.  
  30.  
  31. break; 
  32.  
  33. case KEY_EVENT_S3: 
  34.  
  35.  
  36. printf("KEY_EVENT_S3 \r\n"); 
  37.  
  38.  
  39. break; 
  40.  
  41.  
  42. usleep(30000); 
  43.  

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com/ 

 

来源:鸿蒙社区内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯