0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何用鸿蒙OS在蜂鸣器播放音乐

鸿蒙系统HarmonyOS 来源:oschina 作者:osc_2wq8ft8d 2020-11-11 12:04 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文介绍如何在HiSpark Wi-Fi IoT套件上,使用Harmony OS IoT硬件子系统的PWM接口 驱动蜂鸣器 播放音乐。

用PWM输出方波

PWM输出的方波频率

通过PwmStart接口的注释,可以知道freq参数是分频倍数,PWM实际输出的方波频率等于 PWM时钟源频率 除以 分频倍数,即

f = Fcs / freq

其中,Fcs是PWM时钟源频率;

PWM输出方波的占空比

通过PwmStart接口的duty参数可以控制输出方波的占空比,占空比是指PWM输出的方波波形的高电平时间占整个方波周期的比例,具体占空比值是 duty 和 freq的比值,例如想要输出占空比 50%的方波信号,那么duty填的值就要是 freq/2;

音符-频率对应关系

参考:https://liam.page/2018/04/09/pitch-interval-and-harmonic/

开发板可以输出的最低频率

通过前面的公式,我们知道:

PWM输出的方波频率和freq成反比,freq越大,输出的方波频率越小;

freq是unsinged short类型,最大值为65535;
因此,输出频率的最小值取决于时钟源,PWM的默认时钟源为160M:

unsignedintHalPwmInit(HalWifiIotPwmPortport){if(hi_pwm_set_clock(PWM_CLK_160M)!=HI_ERR_SUCCESS){return(unsignedint)HAL_WIFI_IOT_FAILURE;
}returnhi_pwm_init((hi_pwm_port)port);
}

我们通过直接调用hi_pwm_set_clock接口,可以修改时钟源:

/**
*@ingroupiot_pwm
*
*EnumeratesthePWMclocksources.CNcomment:PWM时钟源枚举。CNend
*/typedefenum{
PWM_CLK_160M,/**< 160M APB clock.CNcomment:160M 工作时钟 CNend */
    PWM_CLK_XTAL, /**< 24M/40M crystal clock.CNcomment:24M或40M 晶体时钟 CNend */
    PWM_CLK_MAX   /**< Maximum value, which cannot be used.CNcomment:最大值,不可使用CNend */} hi_pwm_clk_source;hi_u32 hi_pwm_set_clock(hi_pwm_clk_source clk_type);

通过注释我们知道hi_pwm_set_clock(PWM_CLK_XTAL);可以将时钟源设置为晶体时钟,晶体时钟可能为24M或40M;
那么问题来了——晶体时钟到底是多少?

晶体时钟频率是多少?

我们可以通过通过实验,测算出晶体时钟频率,具体步骤如下:

使用hi_pwm_set_clock(PWM_CLK_XTAL);设置时钟源为晶体时钟;

使用PwmStart(WIFI_IOT_PWM_PORT_PWM0, 20*1000, 40*1000);输出方波信号;

使用示波器测量方波频率;
经实际测量,方波评率为1000Hz,因此,时钟频率为1000 * 40 * 1000也就是 40 MHz;

可以输出的方波最低频率

因此,方波最低频率就是 40M / 65535 ,也就是:

>>>40*1000*1000/65535
610.3608758678569

对照上面的频率表,可以知道,能够输出E♭以上的所有音符;

准备曲谱

为了代码实现起来简单,我选择了《两只老虎》的曲谱作为素材,很快找到了简谱:

简谱说明

对于缺乏音乐基础的同学,简谱上的一些记号可能不太清楚是什么意思,这里简单说明一下:

左上角的1=C是表示调式(可以不用关心),1是唱名,C是音名,1=C是正调(就是常规的对应关系: 1-C,2-D, 3-E, 4-F, 5-G, 6-A, 7-B);

左上角的 4/4 是四四拍,是指 四分音符为一拍, 每小节有四拍;

下面谱子上的竖线就是每个小节分隔符,和4/4对应;

“跑得快”上面5后面的横线表示延时一拍;

“一直没有眼睛”一句,5后面的点表示顺延半拍,一条下划线表示二分之一时间,两条下划线表示四分之一时间;

编写代码

有了以上知识,我们就可以编写代码了,关键部分代码如下:

staticvolatileintg_buttonPressed=0;staticconstuint16_tg_tuneFreqs[]={0,//40MHz对应的分频系数:
38223,//11046.5
34052,//21174.7
30338,//31318.5
28635,//41396.9
25511,//51568
22728,//61760
20249,//71975.5
51021//5_783.99//第一个八度的5};//曲谱音符staticconstuint8_tg_scoreNotes[]={//《两只老虎》简谱:http://www.jianpu.cn/pu/33/33945.htm
1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,4,3,1,5,6,5,4,3,1,1,8,1,1,8,1,//最后两个5应该是低八度的,链接图片中的曲谱不对,声音到最后听起来不太对劲};//曲谱时值,根据简谱记谱方法转写,4/4拍中下面划一条线是半拍,划两条线是四分之一拍,点是顺延半拍staticconstuint8_tg_scoreDurations[]={4,4,4,4,4,4,4,4,4,4,8,4,4,8,3,1,3,1,4,4,3,1,3,1,4,4,4,4,8,4,4,8,
};staticvoid*BeeperMusicTask(constchar*arg){
(void)arg;printf("BeeperMusicTaskstart!\r\n");

hi_pwm_set_clock(PWM_CLK_XTAL);//设置时钟源为晶体时钟(40MHz,默认时钟源160MHz)

for(size_ti=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] * (125*1000); // 音符时间
        printf("%d %d %d %d\r\n", tune, (40*1000*1000) / freqDivisor, freqDivisor, tuneInterval);
        PwmStart(WIFI_IOT_PWM_PORT_PWM0, freqDivisor/2, freqDivisor);
        usleep(tuneInterval);
        PwmStop(WIFI_IOT_PWM_PORT_PWM0);
    }    return NULL;
}

其中谱子最后两个5是谱子的错误,应该是低八度的5,也就是5下面应该打一个点;我修改了代码,让整个曲子听起来更自然;

编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 有源无源蜂鸣器

    关注

    0

    文章

    2

    浏览量

    1248
  • 鸿蒙
    +关注

    关注

    60

    文章

    2859

    浏览量

    45359
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    何用FPGA控制ADV7513实现HDMI画面显示和音频播放

    HDMI接口显示使用DMT时序+TMDS编码来实现。当用FPGA控制HDMI的数据传输时,通常可以采用纯RTL实现TMDS算法或者使用专门的HDMI芯片(如ADV7513)这两种方案来完成。本文主要是介绍如何用FPGA控制ADV7513实现HDMI画面显示和音频播放
    的头像 发表于 12-02 11:05 2581次阅读
    如<b class='flag-5'>何用</b>FPGA控制ADV7513实现HDMI画面显示和音频<b class='flag-5'>播放</b>

    RV-STAR开发板蜂鸣器播放音乐

    下载:music_player 本工程由nucleistudio建立,连接蜂鸣器引脚为PA8,具体代码见附件。 #include "beep.h"
    发表于 11-05 06:16

    基于开源鸿蒙的视频播放开发样例

    开源鸿蒙生态建设中,多媒体能力是构建丰富用户体验的核心要素。本开发样例针对视频播放场景,聚焦开源鸿蒙原生媒体框架,通过Video组件实现视频资源加载、
    的头像 发表于 08-19 10:41 1324次阅读
    基于开源<b class='flag-5'>鸿蒙</b>的视频<b class='flag-5'>播放</b>开发样例

    蜻蜓FM开源“SmartXPlayer”音频播放组件,打造鸿蒙多端音频播放新引擎

    近日,由蜻蜓FM研发的音频播放组件“SmartXPlayer”正式开源并上线 OpenHarmony 三方库中心仓。作为一款专为鸿蒙多端场景打造的音频播放引擎,SmartXPlayer基于鸿蒙
    的头像 发表于 07-21 16:31 439次阅读
    蜻蜓FM开源“SmartXPlayer”音频<b class='flag-5'>播放</b>组件,打造<b class='flag-5'>鸿蒙</b>多端音频<b class='flag-5'>播放</b>新引擎

    Made with KiCad(135):Echo - 开源的音乐播放

    “  Echo 是一个开源硬件平台,专为音乐播放器设计。该项目的目标是开发一款基于开源软件并采用开源设计的高品质音乐播放器。 ”   Made with KiCad 系列将支持新的展示
    的头像 发表于 07-16 11:17 2735次阅读
    Made with KiCad(135):Echo - 开源的<b class='flag-5'>音乐</b><b class='flag-5'>播放</b>器

    【正点原子STM32MP257开发板试用】5.播放音乐

    前言 感谢正点原子和电子发烧友论坛提供的这次机会让我有机会体验这款正点原子STM32MP257开发板,希望可以借这个机会好好学习一下。 环境搭建 播放音乐有很多Python库比如pygame
    发表于 06-28 14:27

    基于STM32的音乐播放器电路+PCB源文件+源码+论文等打包下载

    基于STM32的音乐播放器电路+PCB源文件+源码+论文等打包,推荐下载!
    发表于 05-29 21:37

    fx3枚举成usb扬声器,电脑无法播放音频是哪里出了问题?

    参考fx3 sdk 1.3.5例程uac_examples,将fx3修改为usb 扬声器,电脑能识别到设备,但电脑无法正常播放音频,fx3也收不到音频数据。请问是哪里出了问题?有没有相关的例程可以参考?#EZ-USB FX3
    发表于 05-23 08:21

    【开源获奖案例】基于T5L智能屏的音乐播放与歌词显示方案

    ——来自迪文开发者论坛本期为大家推送迪文开发者论坛获奖开源案例——基于T5L智能屏的音乐播放与歌词显示方案。该方案通过T5L串口与通用开发板、解码板进行数据交互,将解析完成的音频和歌词通过串口发送给智能屏,实现音乐
    的头像 发表于 05-08 09:52 640次阅读
    【开源获奖案例】基于T5L智能屏的<b class='flag-5'>音乐</b><b class='flag-5'>播放</b>与歌词显示方案

    Made with KiCad:Tangara 便携式音乐播放

    、3D 及 BOM,查询设计中器件、走线、焊盘的属性详情。还可以原理图中与AI小助手互动,帮您更高效地学习设计细节: 概览 Tangara 是一款便携式音乐播放器。它通过3.5毫米耳机插孔或
    发表于 04-16 14:01

    PCM2912APJTR设计的USB声卡播放声音有哒哒的声音的原因有哪些

    最近学习PCB设计设计了一个USB声卡,电路图参考了官方demo模块的原理图,但是设计出来的板子发现播放音乐会有哒哒的声音。本人由于是初学者,所以有点不懂是PCB不对的问题还是原理图设计的问题了。 希望有人能够给点修改建议。 下面是原理图。 布线图如下:
    发表于 03-21 11:54

    【ELF 2学习板试用】06 alsa-lib安装和播放音乐

    的开发环境的安装。 3 alsa-lib应用程序 使用alsa-lib库编写程序,实现播放音乐的功能。 下面是程序源码 #include <stdio.h>
    发表于 02-18 16:31

    毕业设计竞赛选题推荐 | 嵌入式Linux应用之音乐播放器项目实战(含文档及源码)

    提升了效率和心情。嵌入式Linux开发的音乐播放器,凭借其高效能与低能耗的特点,便携设备、智能家电以及车载系统等领域中展现出独特的优势。它不仅能够提供高品质的音乐
    的头像 发表于 12-23 16:50 1359次阅读
    毕业设计竞赛选题推荐 | 嵌入式Linux应用之<b class='flag-5'>音乐</b><b class='flag-5'>播放</b>器项目实战(含文档及源码)

    瑞芯微主板/开发板Linux系统播放音频方法,触觉智能RK3562开发板演示

    本文介绍瑞芯微方案主板/开发板Linux系统播放音频的方法,触觉智能RK3562开发板演示,通用RK3566、RK3568、RK3588等
    的头像 发表于 12-13 11:40 1402次阅读
    瑞芯微主板/开发板Linux系统<b class='flag-5'>播放音</b>频方法,触觉智能RK3562开发板演示

    海贝R1便携音乐播放器开箱

    ,插上耳机,你就拥有了一片独立的小天地。 海贝R1这款便携音乐播放器的颜值相当出色,75克的机身塞进去了3英寸的高清触摸屏。圆润的外形配合透明中框和多色可选主题配色,颜值非常的能打。纯净的HiBy OS不仅简单易用,也进一步优化
    的头像 发表于 12-09 09:40 1983次阅读
    海贝R1便携<b class='flag-5'>音乐</b><b class='flag-5'>播放</b>器开箱