鴻蒙Hi3861 ADC驅(qū)動 如何使用開發(fā)板上的3個按鍵
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
https://harmonyos.51cto.com/#zz
本節(jié)主要介紹Hi3861 的 ADC功能,順便實現(xiàn)ADC按鍵檢測。這里先看效果吧。
查看開發(fā)板,可以看到除了復(fù)位按鍵之外,還有3個按鍵。而查看原理,我們可以看到這個3個按鍵其實都是接的GPIO5 引腳,而GPIO5引腳又可復(fù)用為ADC2引腳。

故而,我們可以猜測出來我們可以使用ADC檢測電壓,判斷出來是哪個引腳被按下了。
看下效果:
當(dāng)我按下 按鍵1的時候,串口會打印:
當(dāng)我按下按鍵2的時候串口會打?。?/p>
當(dāng)我按下 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
代碼實現(xiàn)其實很簡單。
(1)引腳初始化
這里由于GPIO5默認被復(fù)用為串口引腳,這里我們重新修改為普通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值的代碼頁相對簡單,這里,我是重復(fù)讀取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[i] = data;
- }
(3)對讀出來的ADC值進行判斷處理
S1對應(yīng)的是按鍵1 、 S2對應(yīng)的是按鍵2 、 S3對應(yīng)的是 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 \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循環(huán)中判斷按鍵值了:
- 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);
- }
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
https://harmonyos.51cto.com/#zz