使用有源蜂鸣器,只能发出固定的”滴滴“声,当然不能满足于此呀。使用无源蜂鸣器,只要输出不同频率的PWM波,即可发出不同的音符。不同的音符组合起来就是一个曲子了。

1 乐谱简析

1.1 音阶

音阶是音乐必不可少的要素,主要由声音的频率决定。通过给蜂鸣器不同频率的音频脉冲,可以产生不同的音阶,而要产生某频率的音频脉冲,最简单的办法是算出该音频的周期,然后将此周期除以2即为半周期的时间。通过程序控制单片机某引脚半周期为“高”、半周期为“低”,不断交替变换,即可产生该频率的矩形波,接到蜂鸣器上就可发出该频率的声音。若想改变音阶,只需要改变半周期时间即可。下表为各音调音符频率对照表,据此可产生不同音阶的音符。“#”表示半音,用于上升或下降半个音,乘以2就提升该声音一个8度音阶,减半则降一个8度。

1.2 节拍

若要构成音乐,光有音阶是不够的,还需要节拍,也就是音符持续时间的长短,一般用拍数表示。至于1拍是多少秒,没有严格的规定,只要节拍适宜,声音悦耳即可。假如某首歌曲的节奏是每分钟120拍,那么1拍为0.5 s,1/4拍为0.125 s,以此类推可得到其他节拍对应的时长。这样,利用不同的频率,加上与拍数对应的延时,就构成了乐曲。

2 STM32中的定时器

音阶的产生与声音频率有关,为了实现不同音阶,必须能为蜂鸣器提供不同频率的脉冲。为此,选择STM32芯片,利用其自带的定时器,通过PWM产生脉冲信号。STM32中一共有11个定时器,包含2个高级控制定时器、4个普通定时器、2个基本定时器,以及2个看门狗定时器和1个系统滴答定时器SysTiek。其中,TIM1和TIM8是高级定时器,时钟由APB2的输出产生。TIM2~TIM5是普通定时器,TIM6和TIM7是基本定时器,这6个定时器的时钟由APB1的输出产生。

2.1 定时时长的计算

定时器的一个主要功能就是到指定时间就会产生一个溢出事件,这个时间的设置与定时器时钟有关,在定时器时钟基础上进行预分频,设置计数溢出大小即可。

2.1.1 系统时钟设置

要保证定时的准确性,必须先确保系统时钟的设置是我们所预期的。定时器时钟分配可查看数据手册。通过编程使SYSCLK为72 MHz,APB1预分频后得到PCLK1为36 MHz,再经TIM2~TIM7倍频器得到TIM2~TIM7时钟72 MHz。时钟源多采用HSE(外部时钟源),对于STM32F103,其外部时钟为8 MHz,而STM32F107外部时钟为25 MHz,因此,在使用HSE做时钟源时,这两种器件产生SYSCLK的分频和倍频方式不同,需要使用者引起注意。

2.1.2 定时器相关参数设置

定时器的参数由结构体TimeBaselnitTypeDef定义,主要包括预分频系数、时钟分割、计数器模式、计数溢出大小等。例如,要由TIM3(定时器3)产生一个时长为1 s的定时,首先,应进行系统时钟的设置,得到TIM3CLK=72MHz,然后进行定时器设置。其中,预分频系数为35 999,此时,TIM3时钟为72 MHz/36 000=2 kHz,无时钟分割。设置计数溢出大小为1 999,即每计2 000个数就产生一个更新事件,输出频率为2 kHz/2 000=1 Hz。

2.2 STM32的PWM输出

脉冲宽度调制(Pulse Width Modulation,PWM)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,简而言之,就是实现对输出信号脉冲宽度的控制,一般用来控制步进电机等。STM32的定时器除了TIM6和TIM7之外,其他的定时器都可以用来产生PWM输出,其中,高级定时器TIM1和TIM8能够产生3对PWM互补输出,而TIM2~TIM5也能同时产生4路的PWM输出。

2.2.1 PWM输出引脚

STM32给不同的定时器分配了不同的输出引脚,考虑到引脚复用功能,STM32还提出了一个“重映像”的概念,就是通过设置某一些相关的寄存器,使得在其他非原始指定的引脚上也能输出PWM波形,但是这种重映像不是随意的,使用方法可参照参考文献。例如,TIM3的通道2,在没有重映像的时候,指定的引脚是PA7。如果设置部分重映像之后,输出就被映像到PB5上了;如果设置完全重映像的话,输出就被映像到PC7上。

2.2.2 占空比的计算

占空比(Duty Ratio)有如下含义:在一串理想的脉冲周期序列(如方波)中,正脉冲的持续时间与脉冲总周期的比值。

当TIM_Period为1 999时,若想得到占空比50%,则TIM_Pulse应设置为(1999+1)/2=1000。

3.2 程序设计

改变PWM的音调,可以输出Do re mi fa so la si do这样的7个音符,还可以输出不同音调的Do re mi fa so la si do。

在实例程序里面,我定义了低中高三个音阶。音符的频率则是mbed提供的。已经宏定义好了。

只要改变PWM的输出周期,即可发出不同的音调(频率是周期的倒数)。

为了方便起见,写了一个音阶类(Pitch),虚基类。里面有一个perform函数,参数是音符和持续时间。例如要发出Do这个声音,持续0.5s,只要perform(1,0.5)就好。

还有一个Stop函数,停止响声0.5s则stop(0.5),无参数则直接停止。后面的Low、Mid、High类则是派生类,实现了Pitch的虚函数。

程序里面包括:

1、发出低中高三个声调的Do re mi fa so la si do音。

2、中音版的小星星。

3、低音版的小星星。

#include "mbed.h"

#define NOTE_B0  31

#define NOTE_C1  33

#define NOTE_CS1 35

#define NOTE_D1  37

#define NOTE_DS1 39

#define NOTE_E1  41

#define NOTE_F1  44

#define NOTE_FS1 46

#define NOTE_G1  49

#define NOTE_GS1 52

#define NOTE_A1  55

#define NOTE_AS1 58

#define NOTE_B1  62

#define NOTE_C2  65

#define NOTE_CS2 69

#define NOTE_D2  73

#define NOTE_DS2 78

#define NOTE_E2  82

#define NOTE_F2  87

#define NOTE_FS2 93

#define NOTE_G2  98

#define NOTE_GS2 104

#define NOTE_A2  110

#define NOTE_AS2 117

#define NOTE_B2  123

#define NOTE_C3  131

#define NOTE_CS3 139

#define NOTE_D3  147

#define NOTE_DS3 156

#define NOTE_E3  165

#define NOTE_F3  175

#define NOTE_FS3 185

#define NOTE_G3  196

#define NOTE_GS3 208

#define NOTE_A3  220

#define NOTE_AS3 233

#define NOTE_B3  247

#define NOTE_C4  262

#define NOTE_CS4 277

#define NOTE_D4  294

#define NOTE_DS4 311

#define NOTE_E4  330

#define NOTE_F4  349

#define NOTE_FS4 370

#define NOTE_G4  392

#define NOTE_GS4 415

#define NOTE_A4  440

#define NOTE_AS4 466

#define NOTE_B4  494

#define NOTE_C5  523

#define NOTE_CS5 554

#define NOTE_D5  587

#define NOTE_DS5 622

#define NOTE_E5  659

#define NOTE_F5  698

#define NOTE_FS5 740

#define NOTE_G5  784

#define NOTE_GS5 831

#define NOTE_A5  880

#define NOTE_AS5 932

#define NOTE_B5  988

#define NOTE_C6  1047

#define NOTE_CS6 1109

#define NOTE_D6  1175

#define NOTE_DS6 1245

#define NOTE_E6  1319

#define NOTE_F6  1397

#define NOTE_FS6 1480

#define NOTE_G6  1568

#define NOTE_GS6 1661

#define NOTE_A6  1760

#define NOTE_AS6 1865

#define NOTE_B6  1976

#define NOTE_C7  2093

#define NOTE_CS7 2217

#define NOTE_D7  2349

#define NOTE_DS7 2489

#define NOTE_E7  2637

#define NOTE_F7  2794

#define NOTE_FS7 2960

#define NOTE_G7  3136

#define NOTE_GS7 3322

#define NOTE_A7  3520

#define NOTE_AS7 3729

#define NOTE_B7  3951

#define NOTE_C8  4186

#define NOTE_CS8 4435

#define NOTE_D8  4699

#define NOTE_DS8 4978

//7个音符组成了美妙的音乐

//低   Do re mi fa so la si do

int melody[] = {  NOTE_C4, NOTE_D4,NOTE_E4, NOTE_F4, NOTE_G4,NOTE_A4,NOTE_B4,NOTE_C5};

//中   Do re mi fa so la si do

int melody2[] = {  NOTE_C5, NOTE_D5,NOTE_E5, NOTE_F5, NOTE_G5,NOTE_A5,NOTE_B5,NOTE_C6};

//高

int melody3[] = {  NOTE_C6, NOTE_D6,NOTE_E6, NOTE_F6, NOTE_G6,NOTE_A6,NOTE_B6,NOTE_C7};

//PWM输出口

PwmOut m(PB_13);

//音调类

class Pitch{

public:

virtual void perfrom(int,double)=0;

void stop(double time = 0){

if(time==0)

m = 1;

else{

m = 1;

wait(time);

}//end else

}//end stop

};

class Low:public Pitch{

public:

void perfrom(int index,double time){

m.period_us(1000000/melody[index-1]);

m.write(0.5);

wait(time);

}

};

class Mid:public Pitch{

public:

void perfrom(int index,double time){

m.period_us(1000000/melody2[index-1]);

m.write(0.5);

wait(time);

}

};

class Hig:public Pitch{

public:

void perfrom(int index ,double time){

m.period_us(1000000/melody3[index-1]);

m.write(0.5);

wait(time);

}

};

int main()

{

//低音版

Low low;

//11 55 66 5

low.perfrom(1,0.5);

low.perfrom(1,0.5);

low.perfrom(5,0.5);

low.perfrom(5,0.5);

low.perfrom(6,0.5);

low.perfrom(6,0.5);

low.perfrom(5,0.8);

low.stop(0.2);

//44 33 22 1

low.perfrom(4,0.5);

low.perfrom(4,0.5);

low.perfrom(3,0.5);

low.perfrom(3,0.5);

low.perfrom(2,0.5);

low.perfrom(2,0.5);

low.perfrom(1,0.5);

low.stop(0.2);

//55 44 33 2

low.perfrom(5,0.5);

low.perfrom(5,0.5);

low.perfrom(4,0.5);

low.perfrom(4,0.5);

low.perfrom(3,0.5);

low.perfrom(3,0.5);

low.perfrom(2,0.5);

low.stop(0.2);

//55 44 33 2

low.perfrom(5,0.5);

low.perfrom(5,0.5);

low.perfrom(4,0.5);

low.perfrom(4,0.5);

low.perfrom(3,0.5);

low.perfrom(3,0.5);

low.perfrom(2,0.5);

low.stop(0.2);

//11 55 66 5

low.perfrom(1,0.5);

low.perfrom(1,0.5);

low.perfrom(5,0.5);

low.perfrom(5,0.5);

low.perfrom(6,0.5);

low.perfrom(6,0.5);

low.perfrom(5,0.5);

low.stop(0.2);

//44 33 22 1

low.perfrom(4,0.5);

low.perfrom(4,0.5);

low.perfrom(3,0.5);

low.perfrom(3,0.5);

low.perfrom(2,0.5);

low.perfrom(2,0.5);

low.perfrom(1,0.5);

low.stop();

}

本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

stm32无源蜂鸣器定时器_STM32与无源蜂鸣器相关推荐

  1. stm32无源蜂鸣器定时器_stm32实现无源蜂鸣器发声

    蜂鸣器是一种发声设备,被广泛用于计算机.打印机.复印机.报警器.电子玩具等.蜂鸣器分为有源蜂鸣器和无源蜂鸣器.那么什么是有源,什么是无源呢?这里的"源"指的是,振荡电路.也就是说, ...

  2. stm32无源蜂鸣器定时器_STM32无源蜂鸣器播放音乐

    1.STM32产生PWM波驱动无源蜂鸣器使其发声 1)查看原理图,找到对应引脚(我这里时PA1) 2)打开CubeMax,输入自己芯片的类型确定后,配置好系统时钟RCC,我这里是80Mhz,找到相应引 ...

  3. stm32无源蜂鸣器定时器_STM32单片机实现无源蜂鸣器产生音乐声的设计

    使用有源蜂鸣器,只能发出固定的"滴滴"声,当然不能满足于此呀.使用无源蜂鸣器,只要输出不同频率的PWM波,即可发出不同的音符.不同的音符组合起来就是一个曲子了. 1 乐谱简析 1. ...

  4. stm32无源蜂鸣器定时器_stm32定时器实现PWM输出控制无源蜂鸣器(HAL)

    (一)PWM概念和原理 脉冲宽度调制(PWM),是英文"Pulse Width Modulation"的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有 ...

  5. STM32单片机基础12——使用通用定时器产生PWM驱动蜂鸣器

    本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的通用定时器外设,产生PWM驱动无源蜂鸣器. 1. 准备工作 硬件准备 开发板 首先需要准备一个开发板,这里我准备的是STM ...

  6. 有源蜂鸣器和无源蜂鸣器的区别_电磁式蜂鸣器和压电式蜂鸣器的区别以及驱动方法...

    蜂鸣器是设计电子产品时比较常用的发声元器件,根据工作原理的不同,可以分为电磁式蜂鸣器和压电式蜂鸣器.在开发板.实验板上常用的蜂鸣器为电磁式蜂鸣器.这两者最大的区别在于工作原理.下面详细介绍其工作原理. ...

  7. 【正点原子STM32连载】第十四章 蜂鸣器实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  8. python蜂鸣器占空比调节音量_蜂鸣器音量的控制方法和控制系统的制作方法

    蜂鸣器音量的控制方法和控制系统的制作方法 [技术领域] [0001]本发明属于控制领域,尤其涉及一种家电蜂鸣器音量的控制方法和控制系统. [背景技术] [0002]目前多数家电产品的蜂呜器都是单一的通 ...

  9. STM32:配置定时器为PWM输出模式以及编码器接口模式

    一:STM32的高级定时器TIM8配置为PWM输出模式 最近在工程项目中,需要用stm32的定时器 (以高级定时器TIM8为例 ) 产生两路PWM输出,作为电机的pwm输入,方法如下: /****** ...

  10. c语言定时器定时1ms程序,STM32 Cubemx 配置定时器定时1mS

    最近才发现原来我把定时器里的配置参数代表的意义给搞混了,这里记录一下,防止以后自己忘记. 以建立一个定时1mS定时器为例: 1.先打开定时器 2.配置好时钟 3.配置定时器设置 重点来了,以前在这里我 ...

最新文章

  1. 删除电脑里的空文件夹
  2. java 异常继承树_java中的error与exception
  3. tomcat(14)服务器组件和服务组件
  4. linux 磁盘簇,linux系统exec簇工作原理
  5. 2019中国民营企业500强发布:华为、海航、苏宁位列前三
  6. Django 2.0 学习(12):Django 模板语法
  7. 2d-x中Lua类型强转问题
  8. 阿里淘宝:“杀死”拼多多!
  9. 常用的 iptables配置脚本
  10. pdo mysql_num_rows_PHP-mysql_num_rows()期望参数1为资源,给定布尔...
  11. Windows核心编程_PE文件格式详细介绍
  12. 给“网吧”做管理系统
  13. 伴风网易博客linux,伙伴 - 成凹的日志 - 网易博客
  14. Android Layout
  15. Emacs入门:重要的基本概念、基本读写操作以及一些常用的快捷键
  16. 《Hibernate上课笔记》----class4----Hibernate继承关系映射实现详解
  17. Lazy and Hungry
  18. 大一上计算机导论期末试题及答案,郑州大学计算机导论大一试题答案.doc
  19. 运筹说 第28期|论文速读之环境经济学中的影子价格
  20. 百度掀起电商助农新战争

热门文章

  1. 我的求学十年(00至10):从中学到大学,年少轻狂立大志
  2. 十年深圳人,是真的吗?
  3. 你有哪些独到的识人技巧?(转自知乎)
  4. PS 滤镜算法原理——碎片效果
  5. 2018怎样发英文外链才能提升谷歌排名
  6. PHP资源汇总-内容包括模板、框架、数据库、安全等方面的库和工具
  7. vue实现中英文切换
  8. QChartView绘制可缩放和平移的图表QChart(此例子为折线图)
  9. 阿里云 python_阿里云python sdk
  10. 计算机基础技能培养,计算机基础技能培养大纲(非计算机专业).doc