本文來(lái)源電子發(fā)燒友社區(qū),作者:juby, 帖子地址:https://bbs.elecfans.com/jishu_2009947_1_1.html
先上效果:《愛(ài)若琉璃》(蜂鳴器版本)

我們今天分享紅綠黃燈板上的資源,對(duì)應(yīng)原理圖在下面文件中:
HiSpark_WiFi_IoT_SSL_VER.A.pdf
這個(gè)紅綠燈板子上有三個(gè)LED,分別是紅黃綠三種顏色;
此外還有一個(gè)按鍵和一個(gè)無(wú)源蜂鳴器;
對(duì)應(yīng)資源如下表所示:
[td]
| 板載資源 | 系統(tǒng)資源 |
| 紅燈_RED | D10(GPIO10)/UART2_CTS/SPI0_CLK/PWM1_OUT/I2C0_SDA |
| 黃燈_YELLOW | A12(GPIO12)/UART2_RXD/SPI0_CS1/ADC0/PWM3_OUT |
| 綠燈_GREEN | A11(GPIO11)/UART2_TXD/SPI0_RXD/ADC5/PWM2_OUT |
| 蜂鳴器_BEEP(MLT-8530) | A9(GPIO09)/UART2_RTS/SPI0_TXD/ADC4/PWM0_OUT/I2C0_SC |
| 按鍵_SWITCH | MOSI(SPI0_TXD)/GPIO08/PWM1_OUT |
LED和按鍵的驅(qū)動(dòng)我們之前已經(jīng)分享過(guò)了,請(qǐng)參見(jiàn)下文:HarmonyOS實(shí)現(xiàn)點(diǎn)亮LED
基于鴻蒙OS的按鍵驅(qū)動(dòng)
一個(gè)ADC實(shí)現(xiàn)多個(gè)按鍵檢測(cè)
今天我們介紹一下鴻蒙系統(tǒng)下PWM的使用方法。
實(shí)現(xiàn)目標(biāo)1. 蜂鳴器演奏歌曲《愛(ài)若琉璃》2. 解決上次《你笑起來(lái)真好看》遺留問(wèn)題,實(shí)現(xiàn)點(diǎn)擊蜂鳴器板子上的按鍵,控制音樂(lè)播放或停止蜂鳴器原理圖
當(dāng)BEEP為高電平的時(shí)候,三極管MMBT3904導(dǎo)通,蜂鳴器B1有電流流過(guò);當(dāng)BEEP為低電平的時(shí)候,三極管截止,蜂鳴器B1沒(méi)有電流流過(guò)。
按鍵中斷按鍵初始化
設(shè)置按鍵對(duì)應(yīng)GPIO08為輸入、上拉模式的GPIO,并設(shè)置上升沿的中斷函數(shù)為:OnButtonPressed_isr
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_8, WIFI_IOT_IO_FUNC_GPIO_8_GPIO);GpioSetDir(WIFI_IOT_IO_NAME_GPIO_8, WIFI_IOT_GPIO_DIR_IN);
IoSetPull(WIFI_IOT_IO_NAME_GPIO_8, WIFI_IOT_IO_PULL_UP);
GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_8, WIFI_IOT_INT_TYPE_EDGE, WIFI_IOT_GPIO_EDGE_RISE_LEVEL_HIGH, OnButtonPressed_isr, NULL);
按鍵中斷函數(shù)
中斷函數(shù)中主要改變控制音樂(lè)播放的一個(gè)布爾變量,在真和假之間來(lái)回切換。
static void OnButtonPressed_isr(char* arg) {(void)arg;
printf("[beep_demo.c] OnButtonPressed() rn");
bSongPlaying = !bSongPlaying;
}
PWM脈沖產(chǎn)生PWM初始化hi_pwm_set_clock(PWM_CLK_XTAL); //設(shè)置時(shí)鐘源為晶體時(shí)鐘;
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_PWM0_OUT);//IO復(fù)用為PWM功能
ret = GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_GPIO_DIR_OUT);//設(shè)置為輸出
if (ret != WIFI_IOT_SUCCESS) {
printf("===== ERROR ======gpio -> GpioSetDir ret:%d rn", ret);
return;
}
hi_pwm_init(HI_PWM_PORT_PWM0);//初始化PWM
BUILD.gn文件
改寫(xiě)工程中的兩個(gè)BUILD.gn文件。
編譯
添加完上面代碼,如果直接編譯的話,會(huì)報(bào)如下錯(cuò)誤:

出錯(cuò)的原因是未開(kāi)啟PWM功能,開(kāi)啟PWM功能:
在 vendorhisihi3861hi3861buildconfigusr_config.mk 文件中下圖位置,添加一行代碼:CONFIG_PWM_SUPPORT=y

再編譯就沒(méi)有問(wèn)題了。
測(cè)試PWM功能
改變PWM輸出使用如下兩個(gè)函數(shù):
hi_u32 hi_pwm_stop(hi_pwm_port port)hi_u32 hi_pwm_start(hi_pwm_port port, hi_u16 duty, hi_u16 freq)
修改參數(shù)freq可以修改輸出脈沖的頻率,修改參數(shù) duty可以改變占空比。
執(zhí)行hi_pwm_start()函數(shù)開(kāi)始PWM輸出,執(zhí)行hi_pwm_stop()函數(shù)PWM輸出停止。
測(cè)試一hi_pwm_stop(HI_PWM_PORT_PWM0);hi_pwm_start(HI_PWM_PORT_PWM0, 1, 2); //25ns/25ns
測(cè)試一測(cè)試二hi_pwm_stop(HI_PWM_PORT_PWM0);hi_pwm_start(HI_PWM_PORT_PWM0, 3, 10); //75ns/250ns
測(cè)試二測(cè)試三hi_pwm_stop(HI_PWM_PORT_PWM0);hi_pwm_start(HI_PWM_PORT_PWM0, 30, 100); //0.75us/2.5us
測(cè)試三
由上面的測(cè)試,我們可以得出,參數(shù) duty 和 freq 的值,1單位代表25 ns。
實(shí)現(xiàn)《愛(ài)若琉璃》樂(lè)譜
現(xiàn)在我們實(shí)現(xiàn)了PWM輸出的控制,接下來(lái)就是實(shí)現(xiàn)本文的目標(biāo)了,實(shí)現(xiàn)蜂鳴器演奏《愛(ài)若琉璃》,蜂鳴器演奏音樂(lè)的原理詳見(jiàn)之前網(wǎng)文:
蜂鳴器演奏音樂(lè)“你笑起來(lái)真好看”
由上面的網(wǎng)文我們知道,要想完成一個(gè)樂(lè)譜,我們只要確定“音符(音調(diào))”和“節(jié)拍”即可。
音調(diào)表示一個(gè)音符響的頻率,節(jié)拍表示一個(gè)音符該唱多長(zhǎng)的時(shí)間。
音符(音調(diào))的確定
一般鋼琴鍵盤(pán)有88個(gè)按鍵:

鋼琴上88按鍵的頻率如下表所示:

比如中央C音的標(biāo)準(zhǔn)頻率就是261,在上面表格中就是:音名為C4的按鍵。
程序中定義一個(gè)音頻的數(shù)組:

因?yàn)樯厦娉跏蓟疨WM的時(shí)候,使用的是外部晶振作為時(shí)鐘源hi_pwm_set_clock(PWM_CLK_XTAL);

根據(jù)上面示波器中實(shí)測(cè)的結(jié)果可以推算出,這個(gè)時(shí)鐘源為40M。
而輸出的脈沖頻率由這個(gè)函數(shù)決定的:hi_u32 hi_pwm_start(hi_pwm_port port, hi_u16 duty, hi_u16 freq)
參數(shù)freq決定了脈沖的頻率,這個(gè)參數(shù)是hi_u16類(lèi)型,那么這個(gè)參數(shù)的有效范圍為:2~65535。
所以輸出的脈沖的最低頻率為:40M / 65535 (下面有計(jì)算方法) ,即40 * 1000 * 1000 / 65535 = 610.3608758678569?
所以這個(gè)Hi3861芯片只能產(chǎn)生頻率610以上的音,即D#5及以上的按鍵音,所以我們選擇C6那組按鍵的音作為主音。所以我們預(yù)定義正常音的C6對(duì)應(yīng)數(shù)組的索引為63。#define N_B 63

我們要想讓蜂鳴器發(fā)出某個(gè)音只需要讓PWM輸出對(duì)應(yīng)頻率的脈沖即可:
網(wǎng)上找個(gè)《愛(ài)若琉璃》的簡(jiǎn)譜,然后按照對(duì)應(yīng)關(guān)系創(chuàng)建如下樂(lè)譜數(shù)組:
在這里插入圖片描述節(jié)拍的確定
節(jié)拍就是一個(gè)音持續(xù)的時(shí)間,這里就是PWM脈沖持續(xù)的時(shí)間,那么持續(xù)的時(shí)間如何確定呢?
播放一個(gè)音
音符(音調(diào))和節(jié)拍的計(jì)算方法我們上面介紹完了,那么如果我們利用蜂鳴器播放第一個(gè)音,應(yīng)該怎么確定呢?

要想播放一個(gè)音,就要使用hi_pwm_start()函數(shù)來(lái)產(chǎn)生一定頻率的脈沖信號(hào)。
那頻率是怎么計(jì)算出來(lái)的呢?也就是下面代碼中delay_time這個(gè)變量是怎么計(jì)算出來(lái)的呢?
delay_time = 40 * 1000 * 1000/((hi_u32)pitch_names_frequency[ai_ruo_liu_li[0]]);hi_pwm_start(HI_PWM_PORT_PWM0, delay_time / 2, delay_time);
由上面示波器我們得出,hi_pwm_start()函數(shù)的最后一個(gè)參數(shù),一個(gè)單位長(zhǎng)度為25ns(即:1/(40*1000*1000)),所以我們發(fā)送一定頻率的脈沖,其實(shí)傳進(jìn)去的參數(shù)即為單位長(zhǎng)度(25ns)的個(gè)數(shù),具體推導(dǎo)過(guò)程如下:
參數(shù)換算原理
一個(gè)音確定完之后,只要將這個(gè)音按照節(jié)拍播放即可,然后遍歷完咱們自己轉(zhuǎn)換的樂(lè)譜數(shù)組即可完成整首歌曲的播放。
因?yàn)樵诎存I的中斷函數(shù)中,每按一次,改變一次布爾變量bSongPlaying的真假。

通過(guò)布爾變量bSongPlaying的真假,我們可以實(shí)現(xiàn)控制音樂(lè)播放的開(kāi)啟或停止。

結(jié)果展示視頻展示請(qǐng)移步B站觀看:
https://www.bilibili.com/video/BV1sa411w7rh#reply3721065146
資料獲取
公眾號(hào)留言區(qū)置頂留言獲取本文對(duì)應(yīng)工程文件及《愛(ài)若琉璃》的簡(jiǎn)譜。
ps: 文章首發(fā)于電子發(fā)燒友。
歡迎關(guān)注
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
wi-fi
+關(guān)注
關(guān)注
15文章
2424瀏覽量
129553 -
HarmonyOS
+關(guān)注
關(guān)注
80文章
2153瀏覽量
36051 -
HiSpark
+關(guān)注
關(guān)注
1文章
156瀏覽量
7757
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
熱點(diǎn)推薦
技術(shù)資訊 I Wi-Fi 模塊設(shè)計(jì)
本文要點(diǎn)Wi-Fi模塊設(shè)計(jì)旨在打造一套緊湊且高效的硬件和軟件解決方案,使設(shè)備能夠通過(guò)Wi-Fi網(wǎng)絡(luò)實(shí)現(xiàn)通信。Wi-Fi模塊設(shè)計(jì)是一個(gè)復(fù)雜的過(guò)程,要求研發(fā)人員兼具硬件與軟件工程方面的專(zhuān)業(yè)知識(shí)
Wi-Fi:無(wú)線連接的全球通用語(yǔ)
與數(shù)據(jù)鏈路層的規(guī)范。 l Wi-Fi聯(lián)盟:成立于1999年的國(guó)際組織,負(fù)責(zé)Wi-Fi商標(biāo)認(rèn)證、技術(shù)推廣與互操作性測(cè)試。 l 頻段:主要使用2.4GHz與5GHz頻段,部分支持6GHz,不同頻段在覆蓋、穿透
發(fā)表于 01-07 09:49
淺談Wi-Fi 6E與Wi-Fi 7的關(guān)鍵器件——BAW濾波器新技術(shù)
作者: Qorvo 亞太區(qū)無(wú)線連接事業(yè)部高級(jí)行銷(xiāo)經(jīng)理林健富 ? 2020年1月,Wi-Fi聯(lián)盟正式宣布開(kāi)放6GHz頻段(5925MHz-7125MHz),并將其命名為Wi-Fi 6E。2020年4月
發(fā)表于 09-19 18:29
?2125次閱讀
解讀Nordic基于SSID的Wi-Fi定位解決方案
,與 nRF91 系列蜂窩物聯(lián)網(wǎng)模組配合使用,可實(shí)現(xiàn)基于 SSID 的 Wi-Fi 定位。Nordic基于SSID的Wi-Fi定位可以在室內(nèi)和室外、城市和郊區(qū)以極其省電的方式獲取精確的位置信息。這是對(duì)全球?qū)Ш叫l(wèi)星系統(tǒng)(GNSS)
基于 SSID 的 Wi-Fi 定位:與其他定位服務(wù)的性能比較
導(dǎo)航衛(wèi)星系統(tǒng)(GNSS)的重要補(bǔ)充,尤其是在建筑物和密集城區(qū),GNSS 可能會(huì)因信號(hào)衰減和中斷而失效。
本博文將介紹我們基于 SSID 的 Wi-Fi 定位解決方案的工作原理以及如何開(kāi)始測(cè)試。然后
發(fā)表于 08-31 21:01
LitePoint Wi-Fi測(cè)試軟件減輕客戶設(shè)計(jì)負(fù)擔(dān)
自Wi-Fi 7于一年多前獲得Wi-Fi聯(lián)盟認(rèn)證以來(lái),作為最新一代通信技術(shù),Wi-Fi正逐步成為用戶實(shí)現(xiàn)無(wú)所不在無(wú)線連接的新選擇。隨著每一代Wi-Fi信號(hào)復(fù)雜性的提升,建議將硬件測(cè)試納
【HarmonyOS 5】金融應(yīng)用開(kāi)發(fā)鴻蒙組件實(shí)踐
原生鴻蒙操作系統(tǒng)星河版,面向開(kāi)發(fā)者開(kāi)放申請(qǐng),余承東宣布鴻蒙生態(tài)設(shè)備數(shù)達(dá) 8 億臺(tái);建設(shè)銀行、郵儲(chǔ)銀行等完成鴻蒙原生應(yīng)用 Beta 版本開(kāi)發(fā)
Wi-Fi 8:開(kāi)啟極高可靠性 (UHR) 連接的新紀(jì)元——1
英國(guó)作家狄更斯在《雙城記》的開(kāi)頭寫(xiě)道:“這是最好的時(shí)代,也是最壞的時(shí)代。”
這句話若套用在現(xiàn)今Wi-Fi 的市場(chǎng)現(xiàn)狀,何嘗不是驚人的相似?
怎么說(shuō)呢?Wi-Fi 從被發(fā)明至今已經(jīng)經(jīng)過(guò)了20多年的迭代
發(fā)表于 06-13 11:09
連接到 WPA3_WPA2_PSK 或 WPA3_SAE Wi-Fi 網(wǎng)絡(luò)時(shí)系統(tǒng)掛起,為什么?
問(wèn)題:連接到 WPA3_WPA2_PSK 或 WPA3_SAE Wi-Fi 網(wǎng)絡(luò)時(shí)系統(tǒng)掛起
我遇到一個(gè)問(wèn)題,當(dāng)我嘗試連接啟用了CY_WCM_SECURITY_WPA3_WPA2_PSK安全性
發(fā)表于 06-05 07:23
基于 Wi-Fi 的定位服務(wù)
以下捕獲使用 location_wifi_get 函數(shù)請(qǐng)求 Wi-Fi 定位服務(wù)。該事件的總功耗為 125.85mC,日志顯示精確度為 30.0m。
Got location:
method
發(fā)表于 04-17 15:16
nRF Cloud Wi-Fi 定位服務(wù)
、Predictive-GPS、Single-Cell、Multi-Cell 和 Wi-Fi 定位。通過(guò)利用 nRF Cloud 的優(yōu)化定位算法,基于 Nordic SoC 和 模組的產(chǎn)品可在定位用例
發(fā)表于 04-17 15:07
Wi-Fi 定位服務(wù)
的 Wi-Fi 網(wǎng)絡(luò)數(shù)據(jù)庫(kù)進(jìn)行比較。
Wi-Fi 定位系統(tǒng)包含以下關(guān)鍵組件:
用戶設(shè)備中的 Wi-Fi 無(wú)線電設(shè)備,用于檢測(cè)附近的網(wǎng)絡(luò)。
將 MAC 地址等
發(fā)表于 04-17 15:01
推出了期待已久的 nRF7002 低功耗Wi-Fi 6
系統(tǒng)級(jí)芯片(SoC)以及nRF91?系列蜂窩物聯(lián)網(wǎng)系統(tǒng)級(jí)封裝(SiP)一起使用。nRF7002 還可以與非Nordic主機(jī)設(shè)備結(jié)合使用。
nRF7002是我們獨(dú)特的Wi-Fi產(chǎn)品組合中的第一款設(shè)備,它將
發(fā)表于 03-26 11:00
nRF7002是我們獨(dú)特的Wi-Fi產(chǎn)品組合中的第一款設(shè)備
?和nRF53?系列藍(lán)牙系統(tǒng)級(jí)芯片(SoC)以及nRF91?系列蜂窩物聯(lián)網(wǎng)系統(tǒng)級(jí)封裝(SiP)一起使用。nRF7002 還可以與非Nordic主機(jī)設(shè)備結(jié)合使用。
nRF7002是我們獨(dú)特的Wi-Fi
發(fā)表于 03-10 15:42
【HarmonyOS HiSpark Wi-Fi IoT 套件試用連載】基于鴻蒙操作系統(tǒng)的《愛(ài)若琉璃》(蜂鳴器版本)
評(píng)論