鸿蒙Hi3861 ADC驱动 如何使用开发板上的3个按键
2023-04-18 15:48:39 时间
https://harmonyos.51cto.com/#zz
本节主要介绍Hi3861 的 ADC功能,顺便实现ADC按键检测。这里先看效果吧。
查看开发板,可以看到除了复位按键之外,还有3个按键。而查看原理,我们可以看到这个3个按键其实都是接的GPIO5 引脚,而GPIO5引脚又可复用为ADC2引脚。
![](https://s2.51cto.com/oss/202012/08/b3b76e105105b994cd1dd26ce788280d.png)
故而,我们可以猜测出来我们可以使用ADC检测电压,判断出来是哪个引脚被按下了。
看下效果:
当我按下 按键1的时候,串口会打印:
当我按下按键2的时候串口会打印:
当我按下 USER按键的时候串口会打印
![](https://s2.51cto.com/oss/202012/08/e9b1d982489988d520a88425de8edda3.png)
其中 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 ", 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);
- }
https://harmonyos.51cto.com/#zz
相关文章
- 那些爆笑的程序员梗 PHP是最好的语言
- 程序员梦中的产品经理有多好?
- 为了得到无重叠区间,煞费苦心
- 划分字母区间
- ArcGis默认地图加载太慢?来试试更换底图
- C语言实现查找(基于数据结构)
- 菜鸟创业者最容易犯下的11个大错
- 合并区间,这么贪
- 技术干货:统计项目中图片使用情况
- 51单片机数码管动态显示
- UISlider实现整数滑动,点击响应,大小高度样式定制
- vue ArcGis想在地图上打几个图片点怎么打?来 我教你
- 一个程序员的顿悟:理想的程序员只比你多了6个一点点
- 算法竞赛(一)
- 编写傻瓜式的代码
- 打开元宇宙有多少种方式?
- ArcGis多边形覆盖面不理想?来让我告诉你怎么改
- 算法竞赛习题整理(一)
- 停电后的创业大街:创业者的寂寥和生死考验
- uniapp多端登录实现(二)