摘要
本文簡單介紹如何操作ADC去讀取電壓,并且實現(xiàn)開發(fā)板上3個ADC按鍵檢測的功能。適合群體
適用于潤和Hi3861開發(fā)板,L0輕量系統(tǒng)驅(qū)動開發(fā)1、實驗效果
查看開發(fā)板,可以看到除了復(fù)位按鍵之外,還有3個按鍵。而查看原理,我們可以看到這個3個按鍵其實都是接的GPIO5 引腳,而GPIO5引腳又可復(fù)用為ADC2引腳。

故而,我們可以猜測出來我們可以使用ADC檢測電壓,判斷出來是哪個引腳被按下了。看下效果:
當(dāng)我按下 按鍵1 的時候串口會打?。?/p>

當(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
2、代碼實現(xiàn)
代碼實現(xiàn)其實很簡單:(1)引腳初始化
這里由于GPIO5默認(rèn)被復(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 ", 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 ");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 ", 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 ");}break;case KEY_EVENT_S2:{printf("KEY_EVENT_S2 ");}break;case KEY_EVENT_S3:{printf("KEY_EVENT_S3 ");}break;}usleep(30000);}
向右滑動查看完整代碼
原文標(biāo)題:OpenHarmony輕量系統(tǒng)開發(fā)【6】驅(qū)動之ADC按鍵
文章出處:【微信公眾號:HarmonyOS官方合作社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
審核編輯:湯梓紅
-
adc
+關(guān)注
關(guān)注
100文章
6898瀏覽量
552826 -
驅(qū)動
+關(guān)注
關(guān)注
12文章
1925瀏覽量
88025 -
電壓
+關(guān)注
關(guān)注
45文章
5745瀏覽量
120343
原文標(biāo)題:OpenHarmony輕量系統(tǒng)開發(fā)【6】驅(qū)動之ADC按鍵
文章出處:【微信號:HarmonyOS_Community,微信公眾號:電子發(fā)燒友開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
如何在MSP430G2中使用ADC使用Energia IDE讀取模擬電壓
ESP8285 ADC可以讀取的最大電壓是多少?
如何使用ADC讀取DAC輸出引腳的電壓值?
中斷方式單通道ADC讀取電壓
OpenHarmony輕量系統(tǒng)開發(fā)【6】驅(qū)動之ADC按鍵
STM32單片機基礎(chǔ)21——使用ADC讀取電壓值
利用51單片機去讀取JY901的陀螺儀和磁力計數(shù)據(jù)操作
【GD32】GD32讀取ADC數(shù)據(jù)
APM32F030C8T6_ADC_ADC Vref參考電壓數(shù)值讀取出錯

如何操作ADC去讀取電壓
評論