OpenHarmony Neptune開(kāi)發(fā)板PWM驅(qū)動(dòng) 播放《小星星》
想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
本文介紹如何在Neptune開(kāi)發(fā)板上,使用openHarmony IoT硬件子系統(tǒng)的PWM接口 驅(qū)動(dòng)蜂鳴器 播放音樂(lè)。
一、環(huán)境準(zhǔn)備
1.1 開(kāi)發(fā)環(huán)境、編譯環(huán)境搭建,參考官方文檔,參考鏈接如下:
Neptune開(kāi)發(fā)板的環(huán)境搭建及使用
1.2 Neptune開(kāi)發(fā)板 openharmony V1.1.0 LTS 版本獲?。?/p>
- git clone https://gitee.com/hihopeorg_group/neptune-harmony-os1.1-iot.git
二、材料準(zhǔn)備
1、Neptune HarmonyOS物聯(lián)網(wǎng) IOT模組
2、無(wú)源蜂鳴器模塊
3、杜邦線(xiàn)若干
三、相關(guān)基礎(chǔ)知識(shí)介紹
鴻蒙系統(tǒng)IoT硬件子系統(tǒng)提供了一些外設(shè)相關(guān)的接口,目錄位于:
- base/iot_hardware/peripheral/interfaces/kits
PWM相關(guān)接口,接口頭文件為iot_pwm.h,其中用PWM輸出方波的API:
- unsigned int IoTPwmStart(unsigned int port, unsigned short duty, unsigned int freq);
接口參數(shù)介紹:(這里與HI3861不相同,其適配是使用W800 SDK中PWM接口,若需要了解可自行查看)
freq:IoTPwmStart接口中freq參數(shù)就是PWM實(shí)際輸出的方波頻率(頻率范圍0~65535)
duty:IoTPwmStart接口的duty參數(shù)是控制輸出方波的占空比的參數(shù),占空比是指PWM輸出的方波波形的高電平時(shí)間占整個(gè)方波周期的比例,具體占空比值是 duty /256的比值,,例如想要輸出占空比50%的方波信號(hào),那么duty填的值就要是128。
四、音符-頻率對(duì)應(yīng)關(guān)系

五、準(zhǔn)備曲譜
為了代碼實(shí)現(xiàn)起來(lái)簡(jiǎn)單,我選擇了《小星星》的曲譜作為素材,在簡(jiǎn)譜網(wǎng)找到了簡(jiǎn)譜:

六、簡(jiǎn)譜說(shuō)明------參考許思維老師用鴻蒙OS在蜂鳴器上播放一曲《兩只老虎》
七、編寫(xiě)代碼
有了以上知識(shí),我們就可以編寫(xiě)代碼了,關(guān)鍵代碼如下:
- #define PWM_DUTY 128
- static const uint16_t g_tuneFreqs[] = { 523,587,659,698,784,880,988};
- // 曲譜音符
- static const uint8_t g_scoreNotes[] = {
- 1,1,5,5, 6,6,5, 4,4,3,3, 2,2,1, 5,5,4,4, 3,3,2,
- 5,5,4,4, 3,3,2, 1,1,5,5, 6,6,5, 4,4,3,3, 2,2,1,
- };
- // 曲譜時(shí)值
- static const uint8_t g_scoreDurations[] = {
- 4,4,4,4, 4,4,8, 4,4,4,4, 4,4,8, 4,4,4,4, 4,4,8,
- 4,4,4,4, 4,4,8, 4,4,4,4, 4,4,8, 4,4,4,4, 4,4,8,
- };
- static void *BeeperMusicTask(const char *arg)
- {
- (void)arg;
- printf("BeeperMusicTask start!\r\n");
- for (size_t i = 0; i < sizeof(g_scoreNotes)/sizeof(g_scoreNotes[0]); i++) {
- uint32_t tune = g_scoreNotes[i]; // 音符
- uint16_t freqDivisor = g_tuneFreqs[tune];
- uint32_t tuneInterval = g_scoreDurations[i] * (1000 *100); // 音符時(shí)間
- printf("%d %d %d %d\r\n", tune,freqDivisor, PWM_DUTY,tuneInterval);
- IoTPwmStart(0,PWM_DUTY,freqDivisor);
- tls_os_time_delay(tuneInterval/1000);
- IoTPwmStop(0);
- }
- return NULL;
- }
八、功能展示
以上都完成之后,就可以編譯、燒錄,并測(cè)試最后的完成效果。
文章相關(guān)附件可以點(diǎn)擊下面的原文鏈接前往下載:
https://harmonyos.51cto.com/resource/1091
想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)