日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【HarmonyOS HiSpark Wi-Fi IoT 套件試用連載】一個ADC實現(xiàn)多個按鍵檢測

開發(fā)板試用精選 ? 來源:開發(fā)板試用 ? 作者:電子發(fā)燒友論壇 ? 2022-11-07 14:01 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文來源電子發(fā)燒友社區(qū),作者:juby, 帖子地址:https://bbs.elecfans.com/jishu_2008496_1_1.html

獲取按鍵值的方式
按鍵作為常用的輸入系統(tǒng),如何準(zhǔn)確并高效的獲取按鍵值,是一個經(jīng)常要面對的問題,常用的按鍵檢測方式有如下幾種方式:
1. 獨立按鍵
每個按鍵的檢測占用單片機的一個GPIO引腳,原理圖如下圖所示:

圖片來源程序員小哈自制核心板原理圖
我們以BTN1按鍵為例,當(dāng)按鍵沒有按下的時候,網(wǎng)絡(luò)標(biāo)號KEY1處的電壓被10K的上拉電阻拉至3.3V,PB14(KEY1)引腳設(shè)為輸入引腳后,程序中讀取該引腳的值將為1,當(dāng)按鍵按下之后,網(wǎng)絡(luò)標(biāo)號KEY1處接地,讀取該輸入引腳的值將為0,進(jìn)而通過此電路實現(xiàn)的獨立按鍵,可以區(qū)分按鍵彈起和按下兩種不同的狀態(tài)。
獨立按鍵的每個按鍵的工作不會影響其他I/O的狀態(tài)。獨立按鍵缺點是浪費MCU管腳,優(yōu)點是編程比較簡單。
獨立按鍵的實現(xiàn)原理詳見我們之前分享的網(wǎng)文:基于鴻蒙OS的按鍵驅(qū)動
2. 矩陣按鍵
矩陣按鍵又稱為矩陣鍵盤或稱行列鍵盤,其實現(xiàn)的原理我們之前分享過如下網(wǎng)文:
矩陣鍵盤的行列掃描原理詳解
這種行列式鍵盤結(jié)構(gòu)能有效地提高單片機系統(tǒng)中I/O口的利用率。在MCU管腳有限的情況下,矩陣按鍵大大的節(jié)省了I/O資源。
3. ADC分壓鍵盤
利用電阻串聯(lián)分壓的原理實現(xiàn)一個ADC管腳去檢測多個按鍵。
按鍵被按下之后,與ADC引腳相連的點的電壓會隨著參與分壓的電阻變化而變化,我們只要讓每個按鍵按下之后的電壓處于不同的區(qū)間,我們理論上就能夠?qū)⒏鱾€按鍵區(qū)分開。
為了避免由于ADC精度、電阻的誤差或者溫漂等因素造成的按鍵檢測失效,提高按鍵檢測的可靠性,我們可以減少按鍵數(shù)量,適當(dāng)放寬各個按鍵檢測的電壓范圍。
經(jīng)過上面的分析,獨立按鍵的方式是最浪費GPIO口,矩陣按鍵的效率適中,而ADC分壓實現(xiàn)的鍵盤使用的GPIO引腳最少。
ADC檢測按鍵原理
如果Vcc = 3.3V ,那么沒有按鍵被按下時,ADC為3.3V,如果有按鍵被按下:
[td]
被按下的按鍵 ADC值
Key1 0 V
Key2 1.65 V
Key3 2.2 V
Key4 2.475 V
Key5 2.64 V
Key6 2.75 V
我們由上可以看到,一串相同電阻(10K)組成的多個按鍵,相連按鍵之間的電壓差越來越小,不利于繼續(xù)進(jìn)行擴展。
如果 +5V 換成 3.3V ,那么沒有按鍵被按下時,ADC為3.3V,如果有按鍵被按下:
[td]
被按下的按鍵 ADC值
sw1 0 V
sw2 0.163 V
sw3 0.503 V
sw4 0.819 V
sw5 1.157 V
sw6 1.487 V
由上我們看出,這組電阻組成的多個按鍵檢測電路,相連按鍵之間的電壓差值基本在0.3V左右,可以在此電路基礎(chǔ)上繼續(xù)進(jìn)行擴展,設(shè)計成更多的按鍵掃描電路。
有了上面的經(jīng)驗,大家算一下下圖中,不同按鍵按下的話,ADC的值應(yīng)該為多少呢?

按鍵原理圖
核心板左下角的按鍵S2的原理圖:
OLED板上的按鍵1和按鍵2的原理圖:
由上面兩個原理圖可知,三個按鍵都是與GPIO05這個引腳相連,根據(jù)上面ADC分壓的原理我們可知,當(dāng)三個按鍵按下時,GPIO05處的理論電壓如下:
[td]
被按下的按鍵 理論電壓
常態(tài)(沒有按鍵按下時) 3.3 V
S2(核心板) 0V
S1(OLED) (1/(4.7+1))*3.3=0.579 V
S2(OLED) (2/(4.7+1+1))*3.3=0.985 V
獲取ADC值
官方手冊ADC功能描述如下:

1. 引腳初始化
由于GPIO5默認(rèn)被復(fù)用為串口引腳,我們這里要想使用ADC功能,而上圖表格中沒有對應(yīng)的ADC復(fù)用信號,所以我們只需要將GPIO_05設(shè)為普通GPIO輸入引腳即可。初始化代碼如下:
(hi_void)hi_gpio_init();

hi_io_set_func(HI_IO_NAME_GPIO_5, HI_IO_FUNC_GPIO_5_GPIO);
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:%drn", ret);
return;
}
2. 獲取ADC值
這里使用hi_adc_read函數(shù)獲取adc的值,為了使得到的數(shù)據(jù)相對準(zhǔn)確,我們對數(shù)據(jù)進(jìn)行多次采集,然后將得到的數(shù)據(jù)緩存到數(shù)組中,然后再對數(shù)組中的數(shù)據(jù)進(jìn)行集中處理。
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 Failn");
return;
}
g_adc_buf= data;
}

其中函數(shù)hi_adc_read在如下文件中實現(xiàn):
vendorhisihi3861hi3861platformdriversadchi_adc.c

3. 對數(shù)組中的ADC值進(jìn)行數(shù)據(jù)處理,計算方法為取這些數(shù)據(jù)的和,然后減去其中的最大值和最小值,然后再取平均值。hi_u32 i;
float vlt_max = 0;
float vlt_min = VLT_MIN;
float vlt_sum = 0;
float vlt_val = 0;

hi_u16 vlt;
for (i = 0; i < data_len; i++) {
vlt = g_adc_buf;
float voltage = hi_adc_convert_to_voltage(vlt);
vlt_max = (voltage > vlt_max) ? voltage : vlt_max;
vlt_min = (voltage < vlt_min) ? voltage : vlt_min;
vlt_sum += voltage;
}

vlt_val = (vlt_sum - vlt_min - vlt_max) / (data_len - 2.0);

其中函數(shù)hi_adc_convert_to_voltage的實現(xiàn)位于:vendorhisihi3861hi3861platformdriversadchi_adc.c

串口打印輸出
為了按鍵能夠準(zhǔn)確識別,我們首先要知道各個按鍵被按下時,ADC的值的范圍,我們在程序中獲取GPIO5 引腳處的ADC值,利用下面的函數(shù)進(jìn)行打印輸出,進(jìn)而觀察各種狀態(tài)下,ADC的值是多少:
printf("KEY adc value is %f rn",key_adc_value);
具體打印輸出如下:
1. 常態(tài)沒有按鍵按下時,ADC值的范圍在 3.262 ~ 3.266之間,串口打印輸出如下:

2. 當(dāng)按下按鍵S2(核心板)時,ADC值的范圍在 0.214 ~ 0.218之間,串口打印輸出如下:

3. 當(dāng)按下按鍵S1(OLED)時,ADC值的范圍在 0.569 ~ 0.573之間,串口打印輸出如下:

4. 當(dāng)按下按鍵S2(OLED)時,ADC值的范圍在 0.970 ~ 0.974之間,串口打印輸出如下:

5. 結(jié)果匯總[td]
被按下的按鍵 理論電壓 實際電壓
常態(tài)(沒有按鍵按下時) 3.3 V 3.266 V
S2(核心板) 0V 0.214 V
S1(OLED) (1/(4.7+1))*3.3=0.579 V 0.573 V
S2(OLED) (2/(4.7+1+1))*3.3=0.985 V 0.973 V
由上可以看出,理論值跟實際值偏差不是很大,而且值相對穩(wěn)定,我們只需要在實際值基礎(chǔ)上增加一個偏差,比如0.15 V,即可區(qū)分出板子上的三個按鍵。
[td]
被按下的按鍵 理論電壓 實際電壓 判斷區(qū)間
常態(tài)(沒有按鍵按下時) 3.3 V 3.266 V vlt_val > 3 V
S2(核心板) 0V 0.214 V vlt_val < 0.3 V
S1(OLED) 0.579 V 0.573 V 0.4 V < vlt_val < 0.7 V
S2(OLED) 0.985 V 0.973 V 0.8 V < vlt_val < 1.1 V
6. 按adc值的范圍區(qū)間,判斷按鍵值
具體判斷的實現(xiàn)如下:
if(vlt_val < 0.3))
{
if(key_flag == 0)
{
key_flag = 1;
key_status = KEY_EVENT_S2_CORE;
}
}

if((vlt_val > 0.4) && (vlt_val < 0.7))
{
if(key_flag == 0)
{
key_flag = 1;
key_status = KEY_EVENT_S1_OLED;
}
}

if((vlt_val > 0.8) && (vlt_val < 1.1))
{
if(key_flag == 0)
{
key_flag = 1;
key_status = KEY_EVENT_S2_OLED;
}
}

if(vlt_val > 3.0)
{
key_flag = 0;
key_status = KEY_EVENT_NONE;
}
7. 編譯腳本文件BUILD.gn
工程中兩個編譯使用的BUILD.gn腳本文件具體實現(xiàn)如下圖所示:

獲得HiBurn軟件1. 解壓DevEcoDeviceTool-1.0.0.zip
此文件,在下面網(wǎng)文中分享過,可以自提:HarmonyOS智能設(shè)備開發(fā)工具—DevEco Device Tool 安裝配置
2. 將解壓后生成的.vsix文件重命名為.zip結(jié)尾的任意名稱,比如:DevEcoDeviceTool-1.0.0-temp.zip , 然后解壓此文件。

3. 在 devicetool-device-1.0.0.0extensiondevecotools 文件夾下即有HiBurn.exe 文件。

使用HiBurn燒寫.bin文件至Hi3861
  • 雙擊HiBurn.exe文件,在彈出界面中,選擇菜單:Setting-->Com settings ,在彈出窗口中,Baud選擇一個稍微高點的波特率,加快文件傳輸速度;
  • 選擇Hi3861核心板對應(yīng)的串口,點擊“Select file”按鈕,選擇要下載的固件文件:Hi3861_wifiiot_app_allinone.bin,我們打開此文件之后,會發(fā)現(xiàn)下面列表中出現(xiàn)了三個文件,實際上這個.bin文件由列表中的三個文件組成。勾選“Auto burn”復(fù)選框,然后選擇“Connect”按鈕,進(jìn)入如下待下載界面:
  • 復(fù)位核心板模塊,進(jìn)入下載模式,下載完成后點擊“Disconnect”按鈕斷開連接。
和DevEco Device Tool方式對比
使用HiBurn燒錄相對于VSCode中使用DevEco Device Tool燒錄而言,好處主要有以下幾點:
1. 不依賴VSCode,所以下面網(wǎng)文的配置過程可以省略了;
HarmonyOS智能設(shè)備開發(fā)工具—DevEco Device Tool 安裝配置
2. 下載速度更快,HiBurn.exe最大波特率可以設(shè)置到4000000,而DevEco Device Tool最大只能為921600,是它的4.34倍;
HiBurn方式燒錄的缺點主要是:
1. 燒錄完成標(biāo)志不是很明顯,需要認(rèn)真觀察;2. 燒錄完成之后需要手動點Disconnect,主動斷開連接,否則將一直占用此串口;如果再未斷開的情況下,再次按了一下RESET按鍵,HiBurn軟件將會再一次對固件進(jìn)行燒錄。結(jié)果展示
依次按三次Hi3861開發(fā)套件上的三個按鍵S2(CORE)、S1(OLED)、S2(OLED),串口打印輸出如下:
ADC獲取的電壓波動在我們設(shè)定的范圍內(nèi),所以我們看到能夠正確的識別對應(yīng)的按鍵。
小結(jié)
學(xué)習(xí)實現(xiàn)的思想,自己可以使用自己的板子實現(xiàn)一下,無論51單片機還是STM32作為主控,實現(xiàn)的原理都是一樣的,文中提供的代碼,除了獲取ADC值的方式不一樣外,其他代碼都是可以通用參考的。
參考網(wǎng)文
https://bbs.elecfans.com/jishu_2000829_1_1.html
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • wi-fi
    +關(guān)注

    關(guān)注

    15

    文章

    2468

    瀏覽量

    130085
  • HarmonyOS
    +關(guān)注

    關(guān)注

    80

    文章

    2157

    瀏覽量

    36325
  • HiSpark
    +關(guān)注

    關(guān)注

    1

    文章

    156

    瀏覽量

    7801
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    技術(shù)資訊 I Wi-Fi 模塊設(shè)計

    本文要點Wi-Fi模塊設(shè)計旨在打造套緊湊且高效的硬件和軟件解決方案,使設(shè)備能夠通過Wi-Fi網(wǎng)絡(luò)實現(xiàn)通信。Wi-Fi模塊設(shè)計是
    的頭像 發(fā)表于 02-27 17:12 ?914次閱讀
    技術(shù)資訊 I <b class='flag-5'>Wi-Fi</b> 模塊設(shè)計

    ESP32 Wi-Fi 控制 LED 燈的原理

    在智能家居、物聯(lián)網(wǎng)設(shè)備中,用手機通過Wi-Fi控制燈光、風(fēng)扇或插座,已經(jīng)非常普遍。而在嵌入式開發(fā)中,ESP32是最常用的Wi-Fi模塊之。本文將帶你系統(tǒng)理解:ESP32是如何通過Wi-Fi
    的頭像 發(fā)表于 01-09 19:04 ?623次閱讀
    ESP32 <b class='flag-5'>Wi-Fi</b> 控制 LED 燈的原理

    Wi-Fi:無線連接的全球通用語

    、什么是Wi-Fi?Wi-FiWi-Fi聯(lián)盟制造商的商標(biāo)認(rèn)證,是基于IEEE 802.11標(biāo)準(zhǔn)的無線局域網(wǎng)技術(shù)。它允許電子設(shè)備在特定范圍內(nèi)無線接入網(wǎng)絡(luò),
    發(fā)表于 01-07 09:49

    Nordic發(fā)布nRF7002 EBII 開發(fā)板, 支持Wi-Fi 6, 解鎖nRF54L新玩法

    和 5 GHz)以及高級 Wi-Fi 6 功能,例如目標(biāo)喚醒時間 (TWT)、OFDMA 和 BSS 著色,從而實現(xiàn)高效、無干擾的電池供電運行。它采用雙頻芯片天線,確保在各個 Wi-Fi 頻段上都能提供
    發(fā)表于 12-10 11:58

    Wi-Fi模塊選型指南 | 低功耗藍(lán)牙/Wi-Fi 6模塊推薦 | 物聯(lián)網(wǎng)設(shè)備集成攻略

    物聯(lián)網(wǎng)的快速發(fā)展,Wi-Fi技術(shù)的成熟的情況下,越來越多的場景需要用到Wi-Fi來無線傳輸數(shù)據(jù),尤其是移動設(shè)備中,怎么再設(shè)備中選擇合適的Wi-Fi模塊呢?下面我們來介紹下Wi-Fi模塊
    的頭像 發(fā)表于 12-09 11:27 ?1389次閱讀
    <b class='flag-5'>Wi-Fi</b>模塊選型指南 | 低功耗藍(lán)牙/<b class='flag-5'>Wi-Fi</b> 6模塊推薦 | 物聯(lián)網(wǎng)設(shè)備集成攻略

    淺談Wi-Fi 6E與Wi-Fi 7的關(guān)鍵器件——BAW濾波器新技術(shù)

    作者: Qorvo 亞太區(qū)無線連接事業(yè)部高級行銷經(jīng)理林健富 ? 2020年1月,Wi-Fi聯(lián)盟正式宣布開放6GHz頻段(5925MHz-7125MHz),并將其命名為Wi-Fi 6E。2020年4月
    發(fā)表于 09-19 18:29 ?2515次閱讀
    淺談<b class='flag-5'>Wi-Fi</b> 6E與<b class='flag-5'>Wi-Fi</b> 7的關(guān)鍵器件——BAW濾波器新技術(shù)

    解讀Nordic基于SSID的Wi-Fi定位解決方案

    ,與 nRF91 系列蜂窩物聯(lián)網(wǎng)模組配合使用,可實現(xiàn)基于 SSID 的 Wi-Fi 定位。Nordic基于SSID的Wi-Fi定位可以在室內(nèi)和室外、城市和郊區(qū)以極其省電的方式獲取精確的位置信息。這是對全球?qū)Ш叫l(wèi)星系統(tǒng)(GNSS)
    的頭像 發(fā)表于 09-09 17:11 ?4101次閱讀
    解讀Nordic基于SSID的<b class='flag-5'>Wi-Fi</b>定位解決方案

    如何更新 NuMaker IoT 板上的 Wi-Fi 模塊固件?

    更新 NuMaker IoT 板上的 Wi-Fi 模塊固件
    發(fā)表于 09-04 08:28

    基于 SSID 的 Wi-Fi 定位:與其他定位服務(wù)的性能比較

    ,與 nRF91 系列蜂窩物聯(lián)網(wǎng)模組配合使用,可實現(xiàn)基于 SSID 的 Wi-Fi 定位。Nordic基于SSID的Wi-Fi定位可以在室內(nèi)和室外、城市和郊區(qū)以極其省電的方式獲取精確的位置信息。這是對全球
    發(fā)表于 08-31 21:01

    LitePoint Wi-Fi測試軟件減輕客戶設(shè)計負(fù)擔(dān)

    Wi-Fi 7于年多前獲得Wi-Fi聯(lián)盟認(rèn)證以來,作為最新代通信技術(shù),Wi-Fi正逐步成為用戶實現(xiàn)
    的頭像 發(fā)表于 08-06 15:34 ?1426次閱讀
    LitePoint <b class='flag-5'>Wi-Fi</b>測試軟件減輕客戶設(shè)計負(fù)擔(dān)

    科普|公司的Wi-Fi,為什么這么慢?

    好了,也搞不定。這是為什么呢?公司的Wi-Fi,到底有什么“苦衷”?█Wi-Fi速率為什么這么慢?Wi-Fi速度慢,其實說白了,就兩種原因:是北向的出口帶寬小。水
    的頭像 發(fā)表于 06-20 06:06 ?1852次閱讀
    科普|公司的<b class='flag-5'>Wi-Fi</b>,為什么這么慢?

    Wi-Fi 8:開啟極高可靠性 (UHR) 連接的新紀(jì)元——2

    只能被分配RU,而且不能跨RU進(jìn)行分配。而在Wi-Fi 7中,節(jié)點可以被允許分配到多個R
    發(fā)表于 06-13 11:15

    Wi-Fi 8:開啟極高可靠性 (UHR) 連接的新紀(jì)元——1

    Wi-Fi 6所帶來的成功,推動Wi-Fi 7成為新Wi-Fi 通信技術(shù)的主流! 然而,就筆者目前所觀察到的市場狀況而言,并未呈現(xiàn)出之前所描繪的樂觀態(tài)勢。正如文章開頭所述,當(dāng)前對于
    發(fā)表于 06-13 11:09

    貿(mào)澤電子開售Qorvo Wi-Fi 7前端模塊

    貿(mào)澤電子開售Qorvo的Wi-Fi 7前端模塊。Qorvo Wi-Fi 7前端模塊可提供下代連接能力,搭載了專為Wi-Fi 7革新而定制的專屬功能。Qorvo
    的頭像 發(fā)表于 06-12 10:21 ?1480次閱讀

    [CYW4373] BT device_id正常,Wi-Fi device_id失敗的原因?

    Wi-Fi 設(shè)備 ID。 3)問題 在情況 A中,CYW4373 的 USB 集線器無法正確識別,BT 模塊運行正常,但 Wi-Fi 模塊無法被檢測到。這是預(yù)期的行為嗎?如果是的話,您能否進(jìn)
    發(fā)表于 06-05 06:07
    乐昌市| 布拖县| 娄底市| 井陉县| 阳谷县| 汝城县| 青海省| 漳浦县| 建昌县| 扎赉特旗| 凤翔县| 睢宁县| 屯留县| 东平县| 闵行区| 禹城市| 尚义县| 博客| 乌鲁木齐县| 格尔木市| 北辰区| 四川省| 图木舒克市| 道真| 莱西市| 六枝特区| 清涧县| 贵溪市| 龙胜| 阳信县| 应城市| 珠海市| 怀集县| 德保县| 策勒县| 兴海县| 松桃| 遵义县| 泗阳县| 车险| 禹城市|