前言
本片我们使用PWM输出不同频率占空比的信号来驱动喇叭,实现MIDI音乐播放器的Demo。
PWM驱动喇叭原理
PWM驱动喇叭有两种方法
一种是PWM-ADC方法,即控制PWM占空比实现不同电压等级的输出,来模拟DAC的输出;
一种是控制PWM频率,直接播放数字MIDI音乐即不同频率代表不同的音调。
我们这里采用第二种方式来实现音乐播放。
以国际标准音A-la-440HZ为准:
do的频率为261.6HZ,
re的频率为293.6HZ,
mi的频率为329.6HZ,
fa的频率为349.2HZ,
sol的频率为392HZ,
la的频率为440HZ,
si的频率为493.8HZ。
我们升一个八度则
Do频率为261.6x2=523.2Hz,其他的类推。
控制PWM频率就可以输出上述音调,控制PWM占空比则可对应声音的大小,播放时间长度则可对应音节时长。
以两只老虎为例
播放音乐需要三个参数
频率:beepfrep对应音调
声音大小: beepduty 占空比
播放时间: beeptime 对应节拍
简谱中可以看到
2/4拍子 4分音符一拍 每小节2拍
一分钟76拍。

于是可以定义音调和上述参数如下
DO = 523
RE = 587
MI = 659
FA = 698
_SO = 392
SO = 784
LA = 880
SI = 987
NO = 523
DUTY0 = 0
METERS = 76 #拍数76 1分钟76拍 每拍60/76秒
#2/4 4分音符一拍 每小节2拍
NOTE_4 = (60/METERS) #先定一拍对应的音符 4分音符
NOTE_8 = (NOTE_4/2) # 8分音符 一个下划线
NOTE_16 = (NOTE_8/2) # 16分音符 二个下划线
beepfrep = [DO,RE,MI,DO,
DO,RE,MI,DO,
MI,FA,SO,NO,
MI,FA,SO,NO,
SO,LA,SO,FA,MI,DO,
SO,LA,SO,FA,MI,DO,
DO,_SO,DO,NO,
DO,_SO,DO,NO]
beepduty = [400,400,400,400,
400,400,400,400,
400,400,400,DUTY0,
400,400,400,DUTY0,
400,400,400,400,400,400,
400,400,400,400,400,400,
400,400,400,DUTY0,
400,400,400,DUTY0,
]
beeptime = [NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_16,NOTE_16,NOTE_16,NOTE_16,NOTE_8,NOTE_8,
NOTE_16,NOTE_16,NOTE_16,NOTE_16,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_16,
NOTE_8,NOTE_8,NOTE_8,NOTE_16,
]
代码
完整代码如下
import time
from machine import Pin, PWM
pwm = PWM(Pin(21))
DO = 523
RE = 587
MI = 659
FA = 698
_SO = 392
SO = 784
LA = 880
SI = 987
NO = 523
DUTY0 = 0
METERS = 76 #拍数76 1分钟76拍 每拍60/76秒
#2/4 4分音符一拍 每小节2拍
NOTE_4 = (60/METERS) #先定一拍对应的音符 4分音符
NOTE_8 = (NOTE_4/2) # 8分音符 一个下划线
NOTE_16 = (NOTE_8/2) # 16分音符 二个下划线
beepfrep = [DO,RE,MI,DO,
DO,RE,MI,DO,
MI,FA,SO,NO,
MI,FA,SO,NO,
SO,LA,SO,FA,MI,DO,
SO,LA,SO,FA,MI,DO,
DO,_SO,DO,NO,
DO,_SO,DO,NO]
beepduty = [400,400,400,400,
400,400,400,400,
400,400,400,DUTY0,
400,400,400,DUTY0,
400,400,400,400,400,400,
400,400,400,400,400,400,
400,400,400,DUTY0,
400,400,400,DUTY0,
]
beeptime = [NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_16,NOTE_16,NOTE_16,NOTE_16,NOTE_8,NOTE_8,
NOTE_16,NOTE_16,NOTE_16,NOTE_16,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_16,
NOTE_8,NOTE_8,NOTE_8,NOTE_16,
]
while(1):
for i in range(len(beepfrep)):
pwm.freq(beepfrep[i])
pwm.duty_u16(beepduty[i])
time.sleep(beeptime[i])
测试
接上喇叭,这里使用了功放
PWM使用P21
运行程序

可以听到演奏的效果,详细见视频。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
播放器
+关注
关注
5文章
414浏览量
38822 -
编程
+关注
关注
90文章
3723浏览量
97439 -
开发板
+关注
关注
26文章
6423浏览量
120920 -
代码
+关注
关注
30文章
4976浏览量
74384 -
单板计算机
+关注
关注
0文章
90浏览量
16292 -
编译
+关注
关注
0文章
696浏览量
35282 -
MIDI
+关注
关注
0文章
79浏览量
16941 -
ESP32
+关注
关注
27文章
1223浏览量
22356
发布评论请先 登录
相关推荐
热点推荐
【FireBeetle 2 ESP32-S3开发板体验】使用PyCharm开发MicroPython体验
://wiki.dfrobot.com.cn/_SKU_DFR0975_FireBeetle_2_Board_ESP32_S3#target_0
由于最近在研究Python,所以拿到开发板就想着折腾一下,利用所学进行开发板
发表于 07-28 11:43
【FireBeetle 2 ESP32-S3开发板体验】1、资料获取、环境、固件烧写、点灯。
1、开发板资料获取:DFROBOT DFR0975 FireBeetle 2 Board ESP32-S3 产品资料 使用教程
2、我准备用
发表于 07-28 17:36
【FireBeetle 2 ESP32-S3开发板体验】时间显示 基于ssd1306 I2C 调用开源库 事半功倍
时间显示 基于ssd1306 I2C 调用开源库 事半功倍
简介
FireBeetle 2 ESP32-S3可以使用Arduino IDE、ESP
发表于 07-29 10:04
【FireBeetle 2 ESP32-S3开发板体验】测评1_搭建开发环境
第1章
开发板开箱以及开发环境搭建
感谢电子发烧友社区提供的测评机会,参加DFRobot 的FireBeetle 2
发表于 07-29 21:40
【FireBeetle 2 ESP32-S3开发板体验】001:开箱+搭建Arduino开发环境
、FireBeetle 2 Board ESP32 S3引脚示意该开发板相关资料在官方页面都有提供,内容非常详细,对
发表于 07-29 22:22
【FireBeetle 2 ESP32-S3开发板体验】在Arduino中充分利用FireBeetle 2 ESP32-S3的16MB Flash做SPIFFS
DFRobot提供的这款 FireBeetle 2 ESP32-S3 开发板,从官方WiKi上,可以了解到详细的硬件信息:
处理器:Xten
发表于 08-02 09:55
合宙ESP32-S3开发板特性解读
穿越万水千山,奔赴与工程师朋友的约定——合宙ESP32-S3超值MCU开发板,来了! 1 合宙ESP32-S3开发板简介 合宙CORE-ESP32S
ESP32-S3开发板烧录小智AI系统全流程指南
在AI语音交互领域不断发展的今天,开发者们对于功能强大、开源灵活的开发板需求日益增长。今天,我们就来详细了解一下ESP32AgentDevKit烧录小智的全流程,这款搭载乐鑫科技ESP32-S
【FireBeetle 2 ESP32-S3开发板测评】MIDI音乐播放器
评论