99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

程序員小哈
認(rèn)證:優(yōu)質(zhì)創(chuàng)作者
作者動(dòng)態(tài)
自動(dòng)洗碗機(jī)綜合實(shí)例第二講 - 最小系統(tǒng)核心板PCB繪制
2024-07-18 09:21
自動(dòng)洗碗機(jī)綜合實(shí)例第一講 - 最小系統(tǒng)核心板原理圖繪制
2024-07-16 09:40
線路板焊接的干貨都在這里呢
2024-07-14 12:08
基于單片機(jī)的智能風(fēng)扇DIY總結(jié)
2024-07-13 14:42
基于HAL庫實(shí)現(xiàn)按鍵(外部中斷)翻轉(zhuǎn)一個(gè)LED
2024-06-30 14:02

安裝并配置Samba服務(wù)器

獲取按鍵值的方式

按鍵作為常用的輸入系統(tǒng),如何準(zhǔn)確并高效的獲取按鍵值,是一個(gè)經(jīng)常要面對(duì)的問題,常用的按鍵檢測(cè)方式有如下幾種方式:

1. 獨(dú)立按鍵

每個(gè)按鍵的檢測(cè)占用單片機(jī)的一個(gè)GPIO引腳,原理圖如下圖所示:

圖片來源自制核心板原理圖

我們以BTN1按鍵為例,當(dāng)按鍵沒有按下的時(shí)候,網(wǎng)絡(luò)標(biāo)號(hào)KEY1處的電壓被10K的上拉電阻拉至3.3V,PB14(KEY1)引腳設(shè)為輸入引腳后,程序中讀取該引腳的值將為1,當(dāng)按鍵按下之后,網(wǎng)絡(luò)標(biāo)號(hào)KEY1處接地,讀取該輸入引腳的值將為0,進(jìn)而通過此電路實(shí)現(xiàn)的獨(dú)立按鍵,可以區(qū)分按鍵彈起和按下兩種不同的狀態(tài)。

獨(dú)立按鍵的每個(gè)按鍵的工作不會(huì)影響其他I/O的狀態(tài)。獨(dú)立按鍵缺點(diǎn)是浪費(fèi)MCU管腳,優(yōu)點(diǎn)是編程比較簡單。

獨(dú)立按鍵的實(shí)現(xiàn)原理詳見我們之前分享的網(wǎng)文:基于鴻蒙OS的按鍵驅(qū)動(dòng)

2. 矩陣按鍵

矩陣按鍵又稱為矩陣鍵盤或稱行列鍵盤,其實(shí)現(xiàn)的原理我們之前分享過如下網(wǎng)文:

矩陣鍵盤的行列掃描原理詳解

這種行列式鍵盤結(jié)構(gòu)能有效地提高單片機(jī)系統(tǒng)中I/O口的利用率。在MCU管腳有限的情況下,矩陣按鍵大大的節(jié)省了I/O資源。

3. ADC分壓鍵盤

利用電阻串聯(lián)分壓的原理實(shí)現(xiàn)一個(gè)ADC管腳去檢測(cè)多個(gè)按鍵。

按鍵被按下之后,與ADC引腳相連的點(diǎn)的電壓會(huì)隨著參與分壓的電阻變化而變化,我們只要讓每個(gè)按鍵按下之后的電壓處于不同的區(qū)間,我們理論上就能夠?qū)⒏鱾€(gè)按鍵區(qū)分開。

為了避免由于ADC精度、電阻的誤差或者溫漂等因素造成的按鍵檢測(cè)失效,提高按鍵檢測(cè)的可靠性,我們可以減少按鍵數(shù)量,適當(dāng)放寬各個(gè)按鍵檢測(cè)的電壓范圍。

經(jīng)過上面的分析,獨(dú)立按鍵的方式是最浪費(fèi)GPIO口,矩陣按鍵的效率適中,而ADC分壓實(shí)現(xiàn)的鍵盤使用的GPIO引腳最少。

ADC檢測(cè)按鍵原理

如果Vcc = 3.3V ,那么沒有按鍵被按下時(shí),ADC為3.3V,如果有按鍵被按下:

我們由上可以看到,一串相同電阻(10K)組成的多個(gè)按鍵,相連按鍵之間的電壓差越來越小,不利于繼續(xù)進(jìn)行擴(kuò)展。

為了方便對(duì)比,如果 +5V 換成 3.3V ,那么沒有按鍵被按下時(shí),ADC為3.3V,如果有按鍵被按下:

由上我們看出,這組電阻組成的多個(gè)按鍵檢測(cè)電路,相鄰按鍵之間的電壓差值基本在0.3V左右,可以在此電路基礎(chǔ)上繼續(xù)進(jìn)行擴(kuò)展,設(shè)計(jì)成更多的按鍵掃描電路。

有了上面的經(jīng)驗(yàn),大家算一下下圖中,不同按鍵按下的話,ADC的值應(yīng)該為多少呢?

按鍵原理圖

核心板左下角的按鍵S2的原理圖:

OLED板上的按鍵1和按鍵2的原理圖:

由上面兩個(gè)原理圖可知,三個(gè)按鍵都是與GPIO_05這個(gè)引腳相連,GPIO_05引腳還具有ADC功能。

根據(jù)上面ADC分壓的原理我們可知,當(dāng)三個(gè)按鍵按下時(shí),GPIO_05處的理論電壓如下:

獲取ADC值

官方手冊(cè)ADC功能描述如下:

1. 引腳初始化

由于GPIO_05默認(rèn)被復(fù)用為串口引腳,我們這里要想使用ADC功能,而上圖表格中沒有對(duì)應(yīng)的ADC復(fù)用信號(hào),所以我們只需要將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:%d\r\n", ret);
    return;
}

2. 獲取ADC值

這里使用hi_adc_read函數(shù)獲取adc的值,為了使得到的數(shù)據(jù)相對(duì)準(zhǔn)確,我們對(duì)數(shù)據(jù)進(jìn)行多次采集,然后將得到的數(shù)據(jù)緩存到數(shù)組中,然后再對(duì)數(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 Fail\n");
  return;
 }
 g_adc_buf[i] = data;
}

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

\vendor\hisi\hi3861\hi3861\platform\drivers\adc\hi_adc.c

3. 對(duì)數(shù)組中的ADC值進(jìn)行數(shù)據(jù)處理,計(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[i];
 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的實(shí)現(xiàn)位于:\vendor\hisi\hi3861\hi3861\platform\drivers\adc\hi_adc.c

串口打印輸出

為了按鍵能夠準(zhǔn)確識(shí)別,我們首先要知道各個(gè)按鍵被按下時(shí),ADC的值的范圍,我們?cè)诔绦蛑蝎@取GPIO_05 引腳處的ADC值,利用下面的函數(shù)進(jìn)行打印輸出,進(jìn)而觀察各種狀態(tài)下,ADC的值是多少:

printf("KEY adc value is %f \r\n",key_adc_value);

具體打印輸出如下:

1. 常態(tài)沒有按鍵按下時(shí),ADC值的范圍在 3.262 ~ 3.266之間,串口打印輸出如下:

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

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

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

5. 結(jié)果匯總

對(duì)比串口打印的ADC值和理論計(jì)算值,我們可以看出兩者的實(shí)際偏差不是很大,而且值相對(duì)穩(wěn)定,我們只需要在實(shí)際值基礎(chǔ)上增加一個(gè)偏差,比如0.15 V,即可區(qū)分出板子上的三個(gè)按鍵。

6. 按adc值的范圍區(qū)間,判斷按鍵值

具體判斷的實(shí)現(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

工程中兩個(gè)編譯使用的BUILD.gn腳本文件具體實(shí)現(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.0\extension\deveco\tools 文件夾下即有HiBurn.exe 文件。

使用HiBurn燒寫.bin文件至Hi3861

  1. 雙擊HiBurn.exe文件,在彈出界面中,選擇菜單:Setting-->Com settings ,在彈出窗口中,Baud選擇一個(gè)稍微高點(diǎn)的波特率,加快文件傳輸速度;

  1. 選擇Hi3861核心板對(duì)應(yīng)的串口,點(diǎn)擊“Select file”按鈕,選擇要下載的固件文件:Hi3861_wifiiot_app_allinone.bin,我們打開此文件之后,會(huì)發(fā)現(xiàn)下面列表中出現(xiàn)了三個(gè)文件,實(shí)際上這個(gè).bin文件由列表中的三個(gè)文件組成。勾選“Auto burn”復(fù)選框,然后選擇“Connect”按鈕,進(jìn)入如下待下載界面:

  1. 復(fù)位核心板模塊,進(jìn)入下載模式,下載完成后點(diǎn)擊“Disconnect”按鈕斷開連接。

和DevEco Device Tool方式對(duì)比

使用HiBurn燒錄相對(duì)于VSCode中使用DevEco Device Tool燒錄而言,好處主要有以下幾點(diǎn):

1. 不依賴VSCode,所以下面網(wǎng)文的配置過程可以省略了;

HarmonyOS智能設(shè)備開發(fā)工具—DevEco Device Tool 安裝配置

2. 下載速度更快,HiBurn.exe最大波特率可以設(shè)置到4000000,而DevEco Device Tool最大只能為921600,是它的4.34倍;

HiBurn方式燒錄的缺點(diǎn)主要是:

1. 燒錄完成標(biāo)志不是很明顯,需要認(rèn)真觀察;2. 燒錄完成之后需要手動(dòng)點(diǎn)Disconnect,主動(dòng)斷開連接,否則將一直占用此串口;如果在未斷開的情況下,再次按了一下RESET按鍵,HiBurn軟件將會(huì)再一次對(duì)固件進(jìn)行燒錄。

結(jié)果展示

依次按三次Hi3861開發(fā)套件上的三個(gè)按鍵S2(CORE)、S1(OLED)、S2(OLED),串口打印輸出如下:

ADC獲取的電壓波動(dòng)在我們?cè)O(shè)定的范圍內(nèi),所以我們看到能夠正確的識(shí)別對(duì)應(yīng)的按鍵。

小結(jié)

學(xué)習(xí)實(shí)現(xiàn)的思想,自己可以使用自己的板子實(shí)現(xiàn)一下,無論51單片機(jī)還是STM32作為主控,實(shí)現(xiàn)的原理都是一樣的,文中提供的代碼,除了獲取ADC值的方式不一樣外,其他代碼都是可以通用參考的。

聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場(chǎng)。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請(qǐng)聯(lián)系:editor@netbroad.com
覺得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
贊 2
收藏 3
關(guān)注 69
成為作者 賺取收益
全部留言
0/200
成為第一個(gè)和作者交流的人吧
主站蜘蛛池模板: 国产拍精品一二三 | 国产精品视频色拍拍 | 成人免费视频xbxb入口 | 日本一二不卡 | 乱60一70归性欧老妇 | 毛茸茸xxxx免费视频 | 一区二区三区四区乱码 | 中文av之家 | 一级黄色大片网站 | 国产一二三区在线观看 | 欧美孕妇变态重口另类 | 日本二三本的区别免费 | 男女啪啪做爰高潮无遮挡 | 日韩一区二区在线观看视频 | 久久精品国产亚洲AV嫖农村妇女 | 乱60一70归性欧老妇 | 99玖玖视频 | 老少交欧美另类 | 亚洲精品视频在线观看视频 | 91caoporn超碰最新地址 | 亚洲日韩中文在线精品第一 | 亚洲3p激情在线观看 | 亚洲精品久久久无码白峰美 | 国产懂色av | 97久久超碰成人精品网站 | 超碰在线人人艹 | 色淫影院 | 成人黄色免费观看 | 国产野精品久久久久久久不卡 | 国产一区二区三区不卡在线看 | 啪一啪日一日 | 中午字幕无线码一区2020 | 亚洲中文有码字幕日本第一页 | 在线视频观看免费视频18 | 久久99免费视频 | 双腿被绑成M型调教PLAY照片 | 国产精品r级最新在线观看 一区三区在线观看 | 国产欧美日韩综合 | 熟女人妻aⅴ一区二区三区60路 | 黑人把女人弄到高潮a片 | 性高朝久久久久久久 |