【STM32 .Net MF开发板学习-12】跳动的音符(PWM合成)
PWM除了可驱动电机外,还可以设置不同频率以模拟不同音阶的音符输出,实际测试发现,声音还是蛮动听的,不过常见的有源蜂鸣器可不行(红牛开发板自带),需要专门采购无源蜂鸣器,这二者的区别是有源蜂鸣器通电就响,而无源蜂鸣器需要输入一定频率的信号才能发声。
我们采用Timer3作为PWM的输出源,我们计数固定为为36,占空比也固定为1/2,通过分频系数来设定相对应的PWM输出频率。
底层代码如下,由于官方无PWM驱动模板,如下函数由我自行定义。
//采用Timer3 36M PB0输出
CPU_TIMER_Initialize(timer,36,PSC,Music_ISR,(void *)timer);
CPU_TIMER_SetCCR(timer,2,param0==0 ? 0:18);
UINT32 m_Count= param0*param1/1000;
CPU_TIMER_SetCCM(timer,2,6); //PWM1模式
CPU_TIMER_PWM_Start(timer,2);
CPU_TIMER_Start(timer);
音符频率对应表如下,根据这个,我们通过PWM就可以输出不同音阶的音符:
音符 |
频率/HZ |
半周期/us |
音符 |
频率/HZ |
半周期/us |
音符 |
频率/HZ |
半周期/us |
低 |
音 |
区 |
中 |
音 |
区 |
高 |
音 |
区 |
1 |
262 |
1908 |
1 |
523 |
0956 |
1 |
1046 |
0478 |
1# |
277 |
1805 |
1# |
554 |
0903 |
1# |
1109 |
0451 |
2 |
294 |
1700 |
2 |
578 |
0842 |
2 |
1175 |
0426 |
2# |
311 |
1608 |
2# |
622 |
0804 |
2# |
1245 |
0402 |
3 |
330 |
1516 |
3 |
659 |
0759 |
3 |
1318 |
0372 |
4 |
349 |
1433 |
4 |
698 |
0716 |
4 |
1397 |
0358 |
4# |
370 |
1350 |
4# |
740 |
0676 |
4# |
1480 |
0338 |
5 |
392 |
1276 |
5 |
784 |
0638 |
5 |
1568 |
0319 |
5# |
415 |
1205 |
5# |
831 |
0602 |
5# |
1661 |
0292 |
6 |
440 |
1136 |
6 |
880 |
0568 |
6 |
1760 |
0284 |
6# |
466 |
1072 |
6# |
932 |
0536 |
6# |
1865 |
0268 |
7 |
494 |
1012 |
7 |
988 |
0506 |
7 |
1976 |
0253 |
"#"表示半音,用于上升或下降半个音,乘以二就提升该声音一个八度音阶,减半则降一个八度。
考虑到IO的驱动能力,所以添加一个NPN三极管作为放大输出(实际测试,效果不太明显,和直接驱动差别不大),原理图如下:
相关的实际器件有如下几种:
实际的物理接线图如下:
(直接连接和三极管放大连接)
为了便于应用程序访问,我封装了一个Music库,相关声明如下:
namespace YFSoft.Hardware
{
public sealed class Music
{
public static ushort DO1;
public static ushort DO1x;
public static ushort DO2;
… …
public static ushort SO3;
public static ushort SO3x;
public static int Play(ushort[] buff);
public static int Play(uint addr, uint size);
public static int Sound(ushort freq, ushort duration);
}
}
Play(uint addr, uint size)函数是播放WAV文件用的,不过目前我还没有调试成功,等成功了在进行相关说明。
我们以实际的例子,来说明Play(ushort[] buff)和Sound的使用,我们编写一个最简单的曲子,就是两只老虎,其简谱如下:
对应的编码数据如下:
//两只老虎
UInt16[] lzlh = new UInt16[]
{
Music.DO2,Music.S1_4,
Music.RE2,Music.S1_4,
Music.MI2,Music.S1_4,
Music.DO2,Music.S1_4,
Music.P,Music.S1_16,
Music.DO2,Music.S1_4,
Music.RE2,Music.S1_4,
Music.MI2,Music.S1_4,
Music.DO2,Music.S1_4,
Music.P,Music.S1_16,
Music.MI2,Music.S1_4,
Music.FA2,Music.S1_4,
Music.SO2,Music.S1_2,
Music.P,Music.S1_16,
Music.MI2,Music.S1_4,
Music.FA2,Music.S1_4,
Music.SO2,Music.S1_2,
Music.P,Music.S1_16,
Music.SO2,Music.S1_8,
Music.LA2,Music.S1_8,
Music.SO2,Music.S1_8,
Music.FA2,Music.S1_8,
Music.MI2,Music.S1_4,
Music.DO2,Music.S1_4,
Music.P,Music.S1_16,
Music.SO2,Music.S1_8,
Music.LA2,Music.S1_8,
Music.SO2,Music.S1_8,
Music.FA2,Music.S1_8,
Music.MI2,Music.S1_4,
Music.DO2,Music.S1_4,
Music.P,Music.S1_16,
Music.DO2,Music.S1_4,
Music.SO1,Music.S1_4,
Music.DO2,Music.S1_2,
Music.P,Music.S1_16,
Music.DO2,Music.S1_4,
Music.SO1,Music.S1_4,
Music.DO2,Music.S1_2,
Music.P,Music.S1_16,
};
数据成对出现,第一个是音符,第二是节拍的长度。
好了,让我们播放一下,播放代码如下,很简单,就一句。
Music.Play(lzlh); //音乐播放
再来看看Sound函数的使用,参数很简单,第一个是发声频率,第二个是持续时间,示例如下:
//播放单个音符
Music.Sound(Music.DO1, 1000);
Music.Sound(Music.RE1, 1000);
Music.Sound(Music.MI1, 1000);
Music.Sound(Music.FA1, 1000);
Music.Sound(Music.SO1, 1000);
Music.Sound(Music.LA1, 1000);
Music.Sound(Music.SI1, 1000);
OK,有兴趣,并且对谱子有研究的网友,可以多编码一些好听的曲子,记得到时候一定与我们分享一下。
注:该示例程序,红牛开发板需要部署最新的V0.9.8固件。
文章相关器件:http://item.taobao.com/auction/item_detail.htm?item_num_id=7135239572
【低价开发板】http://item.taobao.com/item.htm?id=7117999726
源码下载:http://www.sky-walker.com.cn/yefan/MFV40/SourceCode/SoundTest.rar
文章参考: 《.Net Micro Framework 快速入门》
中文讨论组:http://space.cnblogs.com/group/MFSoft/
【STM32 .Net MF开发板学习-12】跳动的音符(PWM合成)相关推荐
- 【STM32 .Net MF开发板学习-02】GPIO测试
前段时间我借用市面上现成的Corex-M3开发板,打造了最低价的.Net Micro Framework开发板(参见<免费发放firmwave,打造史上最低价.Net MF开发板>),在此 ...
- 【STM32 Net MF开发板学习-27】GPRS通信实现
GPRS是General Packet Radio Service(通用分组无线服务技术)的简称,它是GSM移动电话用户可用的一种移动数据业务.GPRS和以往连续在频道传输的方式不同,是以封包(Pac ...
- 【STM32 .Net MF开发板学习-17】Wifi遥控智能小车
恰好以前购买的一个PDA含Wifi功能,所以与其用PC通过Zigbee控制智能小车,不如用PDA来控制,这样更为方便,不过由于目前.NET MF开发板不直接支持Wifi功能,所以我们也只好间接控制了, ...
- 【STM32 .NET MF开发板学习-29】摄像头蓝牙图像远程获取
目前生产串口摄像头的厂家有很多,每家的通信协议也不同,所以针对不同的摄像头都必须编写相对应的摄像头驱动程序. 最早做医疗项目的时候,开发过一款串口摄像头的驱动,不过是配合TinyIOs而使用,并没有把 ...
- 【STM32 .Net MF开发板学习-28】中文显示(WPF方式)
在<为Cortex-M3打造轻量级TinyGUI>中我们提到.NET MF的官方图形库为WPF,考虑到内存的限制和CPU的性能,所以我们开发了TinyGUI库,并在<TinyGUI绘 ...
- 【STM32 NET MF开发板学习-29】摄像头蓝牙图像远程获取
分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 目前生产串口摄像头 ...
- 【STM32 .Net MF开发板学习-11】步进电机控制(非PWM模式)
选用的步进电机的型号为28BYJ-48(或MP28GA,5V,转速比1/64),驱动电路选用 uln2003芯片的驱动板,其控制时序图如下: 四相八拍:A->AB->B ->BC - ...
- 【STM32 Net MF开发板学习-11】步进电机控制(非PWM模式)
选用的步进电机的型号为28BYJ-48(或MP28GA,5V,转速比1/64),驱动电路选用uln2003芯片的驱动板,其控制时序图如下: 四相八拍:A->AB->B ->BC -& ...
- 【STM32 Net MF开发板学习-19】DHT11温湿度传感器通信(上)
前段时间开发远程医疗系统(Dr.Cloud)就曾用到过温湿度传感器,不过当时考虑到集成难度,选了一个RS485接口的传感器,该传感器实现了Modbus Rtu Slave的功能,只要客户程序实现Mod ...
最新文章
- 用什么软件测试mate9的闪存_超越苹果?余承东重拳出击,华为Mate40 Pro确认采用海思自研闪存!...
- [Android Pro] ScrollView使用fillViewport设置高度为MatchParent
- dubbo服务接口如何mock_2019年Dubbo你掌握的如何?快看看这30道高频面试题!
- Problem executing scripts APT::Update::Post-Invoke-Success ‘if /usr/bin/test -w /var/lib/command-not
- qstring 属于元数据类型吗_元数据,描述“数据”的“数据”
- 三个月计算机培训班,三个月复盘:学完两个设计软件,并开始学画画
- 黑马商城项目源代码_Python学习路线图--Python框架与项目
- MFC小笔记:系统托盘实现
- 使用RDKit将pdb文件转成SMILES
- 《MapReduce 2.0源码分析与编程实战》一1.5 看,大象也会跳舞
- python global用法_python可视化——pyechart库
- 细说ConcurrentHashMap扩容规则
- 领域模型 PO、VO、DAO、BO、DTO、POJO
- 常见UNIXLINUX系统
- (基础准备)多元相关与回归分析——一元线性相关与回归分析(一) python+numpy库 实现
- 如何从ZIP文件解压缩文件
- 桌面云、云桌面的区别
- ORA-12528: TNS: 监听程序: 所有适用例程都无法建立新连接
- 计算机技术创新型,面向企业需求的创新型计算机技术专业硕士胜任力模型研究.docx...
- 学习笔记:AC+AP配置:同一个SSID,多个AP的无缝连接漫游。
热门文章
- 图象处理基本算法[整理]
- 互联网日报 | 瑞幸咖啡股票6月29日停牌;B站举办十一周年演讲;Airbnb辟谣破产传闻...
- win time 修复服务器,Windows time 1058错误 修复
- Python 气象数据分析
- Word2016中文字间距突然变大了是怎么回事?
- 计算机领域十大世界难题,世界四大科学难题是什么,什么是四大科学难题
- 全民农场服务器维护上不去,全民农场签到页面空白解决方法
- 2022 极术通讯-安谋科技参与起草的PSA相关物联网终端安全标准介绍(电信终端产业协会发布)
- 微信图片怎么添加竖排文字_怎样在手机上给微信图片上添加文字?
- 脑电分析工具MNE教程