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合成)相关推荐

  1. 【STM32 .Net MF开发板学习-02】GPIO测试

    前段时间我借用市面上现成的Corex-M3开发板,打造了最低价的.Net Micro Framework开发板(参见<免费发放firmwave,打造史上最低价.Net MF开发板>),在此 ...

  2. 【STM32 Net MF开发板学习-27】GPRS通信实现

    GPRS是General Packet Radio Service(通用分组无线服务技术)的简称,它是GSM移动电话用户可用的一种移动数据业务.GPRS和以往连续在频道传输的方式不同,是以封包(Pac ...

  3. 【STM32 .Net MF开发板学习-17】Wifi遥控智能小车

    恰好以前购买的一个PDA含Wifi功能,所以与其用PC通过Zigbee控制智能小车,不如用PDA来控制,这样更为方便,不过由于目前.NET MF开发板不直接支持Wifi功能,所以我们也只好间接控制了, ...

  4. 【STM32 .NET MF开发板学习-29】摄像头蓝牙图像远程获取

    目前生产串口摄像头的厂家有很多,每家的通信协议也不同,所以针对不同的摄像头都必须编写相对应的摄像头驱动程序. 最早做医疗项目的时候,开发过一款串口摄像头的驱动,不过是配合TinyIOs而使用,并没有把 ...

  5. 【STM32 .Net MF开发板学习-28】中文显示(WPF方式)

    在<为Cortex-M3打造轻量级TinyGUI>中我们提到.NET MF的官方图形库为WPF,考虑到内存的限制和CPU的性能,所以我们开发了TinyGUI库,并在<TinyGUI绘 ...

  6. 【STM32 NET MF开发板学习-29】摄像头蓝牙图像远程获取

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 目前生产串口摄像头 ...

  7. 【STM32 .Net MF开发板学习-11】步进电机控制(非PWM模式)

    选用的步进电机的型号为28BYJ-48(或MP28GA,5V,转速比1/64),驱动电路选用 uln2003芯片的驱动板,其控制时序图如下: 四相八拍:A->AB->B ->BC - ...

  8. 【STM32 Net MF开发板学习-11】步进电机控制(非PWM模式)

    选用的步进电机的型号为28BYJ-48(或MP28GA,5V,转速比1/64),驱动电路选用uln2003芯片的驱动板,其控制时序图如下: 四相八拍:A->AB->B ->BC -& ...

  9. 【STM32 Net MF开发板学习-19】DHT11温湿度传感器通信(上)

    前段时间开发远程医疗系统(Dr.Cloud)就曾用到过温湿度传感器,不过当时考虑到集成难度,选了一个RS485接口的传感器,该传感器实现了Modbus Rtu Slave的功能,只要客户程序实现Mod ...

最新文章

  1. 用什么软件测试mate9的闪存_超越苹果?余承东重拳出击,华为Mate40 Pro确认采用海思自研闪存!...
  2. [Android Pro] ScrollView使用fillViewport设置高度为MatchParent
  3. dubbo服务接口如何mock_2019年Dubbo你掌握的如何?快看看这30道高频面试题!
  4. Problem executing scripts APT::Update::Post-Invoke-Success ‘if /usr/bin/test -w /var/lib/command-not
  5. qstring 属于元数据类型吗_元数据,描述“数据”的“数据”
  6. 三个月计算机培训班,三个月复盘:学完两个设计软件,并开始学画画
  7. 黑马商城项目源代码_Python学习路线图--Python框架与项目
  8. MFC小笔记:系统托盘实现
  9. 使用RDKit将pdb文件转成SMILES
  10. 《MapReduce 2.0源码分析与编程实战》一1.5 看,大象也会跳舞
  11. python global用法_python可视化——pyechart库
  12. 细说ConcurrentHashMap扩容规则
  13. 领域模型 PO、VO、DAO、BO、DTO、POJO
  14. 常见UNIXLINUX系统
  15. (基础准备)多元相关与回归分析——一元线性相关与回归分析(一) python+numpy库 实现
  16. 如何从ZIP文件解压缩文件
  17. 桌面云、云桌面的区别
  18. ORA-12528: TNS: 监听程序: 所有适用例程都无法建立新连接
  19. 计算机技术创新型,面向企业需求的创新型计算机技术专业硕士胜任力模型研究.docx...
  20. 学习笔记:AC+AP配置:同一个SSID,多个AP的无缝连接漫游。

热门文章

  1. 图象处理基本算法[整理]
  2. 互联网日报 | 瑞幸咖啡股票6月29日停牌;B站举办十一周年演讲;Airbnb辟谣破产传闻...
  3. win time 修复服务器,Windows time 1058错误 修复
  4. Python 气象数据分析
  5. Word2016中文字间距突然变大了是怎么回事?
  6. 计算机领域十大世界难题,世界四大科学难题是什么,什么是四大科学难题
  7. 全民农场服务器维护上不去,全民农场签到页面空白解决方法
  8. 2022 极术通讯-安谋科技参与起草的PSA相关物联网终端安全标准介绍(电信终端产业协会发布)
  9. 微信图片怎么添加竖排文字_怎样在手机上给微信图片上添加文字?
  10. 脑电分析工具MNE教程