STM32与无源蜂鸣器

发布者:静逸心境最新更新时间:2017-11-07 来源: eefocus关键字:STM32  无源蜂鸣器 手机看文章 扫描二维码
随时随地手机看文章

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

 

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

STM32与无源蜂鸣器



 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)有如下含义:在一串理想的脉冲周期序列(如方波)中,正脉冲的持续时间与脉冲总周期的比值。
    

STM32与无源蜂鸣器


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

3.2 程序设计

STM32与无源蜂鸣器



 

改变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与无源蜂鸣器

上一篇:STM32通用定时器使用
下一篇:STM32与有源蜂鸣器

推荐阅读最新更新时间:2024-03-16 15:43

基于STM32的嵌入式数字示波器设计
  嵌入式数字示波器是近年来发展起来的一种集显示、测量、运算、分析、记录等多种功能于一体的智能化测量终端设备。凭借其强大的性能优势,己逐步取代传统模拟示波器。当前国内通用的数字示波器多数采用51单片机、FPGA、DSP等结构。但是51单片机处理能力有限,无法实现数字示波器的基本指标,FPGA虽然能深入开发数字示波器,然而,其成本偏高,即使加入SOPC软核,其软件压力也很大。   本设计选用ARM处理器中基于Cortex-M3内核的32位STM32F103VCT6作为主控芯片。该芯片内部集成了16通道的12位高精度A/D转换器,转换时间仅为1μs,而且STM32芯片具省电模式,功耗低,与传统MCU相比,其在性能和处理能力上都比较
[测试测量]
基于<font color='red'>STM32</font>的嵌入式数字示波器设计
STM32-----LED
#include stm32f10x.h /* 为了使用编程书写方便,我们定义几个控制LED开关的宏 */ #define LED1_ON() {GPIO_ResetBits(GPIOF, GPIO_Pin_6);} /* PF6 = 0 点亮LED1 */ #define LED1_OFF() {GPIO_SetBits(GPIOF, GPIO_Pin_6);} /* PF6 = 1 熄灭LED1 */ #define LED2_ON() {GPIO_ResetBits(GPIOF, GPIO_Pin_7);} /* PF7 = 0 点亮LED2 */ #define LED2_OFF() {GPIO_SetBits(GP
[单片机]
STM32 DMA通道外设基地址的配置
简介:看了许多资料都没有讲如何配置DMA通道外设基地址 ADC 规则数据寄存器(ADC_DR)的地址偏移:4Ch #define ADC1_DR_Address ((u32)0x4001244C) 就是ADC1的外设基地址(0x4001 2400)加上ADC数据寄存器(ADC_DR)的偏移地址(0x4c)计算得到的。 Example: /************************************************************************************ * 文件名 :main.c * 描述 :串口1(USART1)向电脑发送当前ADC1的转换电压值 * 库版本 :ST3.5.0
[单片机]
STM32程序的烧录方式 与 ISP一键下载
一、启动模式(Boot modes) 阅读:STM32中文参考手册_V10.pdf 查看启动配置(Boot modes)。 在STM32F10xxx里,可以通过BOOT 引脚选择三种不同启动模式。 STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 1)用户闪存 = 芯片内置的Flash。 2)系统存储器 = 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区 域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM区。 3)SRAM = 芯片内置的RAM区,就是内存啦。 在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时的电平
[单片机]
<font color='red'>STM32</font>程序的烧录方式 与 ISP一键下载
基于STM32的无人售货机系统设计
一、项目背景 随着科技的发展和生活水平的提高,人们对于购物体验的要求越来越高。传统的商场、超市购物方式已经无法满足消费者的需求,因此无人售货机应运而生。本文针对现有售货机存在的缺陷,设计了一款基于STM32的无人售货机系统。该系统采用STM32作为主控芯片,使用液晶屏显示各种商品库存与售价,用户按下对应按键选择购买指定商品,在矩阵键盘输入账号密码付款。若付款成功,对应电机旋转一定角度使商品出库,同时修改库存;若余额不足,则进行声光提示。手机端还可查看消费流水、商品库存情况,并进行补货和充值操作。 二、系统设计 2.1 系统硬件设计 该系统的核心部件是STM32主控芯片,它负责整个售货机的控制和管理。液晶屏用于显示商品信息、价格
[单片机]
基于<font color='red'>STM32</font>的无人售货机系统设计
STM32开发笔记45:看门狗驱动程序的移植
单片机型号:STM32F070F6P6 本文介绍将看门狗驱动程序移植到自己工程中的方法,本项目使用的是独立看门狗IWDG。 1、在STM32CubeMX中使能看门狗,如下图所示。 2、查看看门狗时钟。 3、对看门狗进行设置,这里主要的是设置IWDG down-counter reload value。IWDG counter clock prescaler为分频系数,我现在项目设置的IWDG的时钟是40KHz,所以分频后为40000/64=625Hz,我先在项目需要使用5秒的看门狗,则625*5=3125,就是IWDG down-counter reload value的数值。 4、在自己的工
[单片机]
<font color='red'>STM32</font>开发笔记45:看门狗驱动程序的移植
STM32学习笔记之RTC实时时钟2
5. 程序实现 5.1 初始化 u8 RTC_Init(void){ u8 temp=0; RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟 PWR_BackupAccessCmd(ENABLE); //使能后备寄存器访问 if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050) //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎 { BKP_DeInit(); //复位备份区域
[单片机]
<font color='red'>STM32</font>学习笔记之RTC实时时钟2
STM32上的SDRAM硬件电路设计
SDRAM简介 SDRAM(synchronous dynamic random-access memory)即同步动态随机存取内存。在介绍SDRAM前,我们先了解下DRAM(Dynamic random-access memory),DRAR中文译为动态随机存取内存,也叫动态随机存取器,为什么叫动态随机存取器,原因是它的实现原理跟静态存储器SRAM不一样,DRAM是在芯片里集成很多个阵列的电容,DRAM存储二进制数据0和1就是通过给这些阵充放电荷实现。一个简单的单个DRAM存储单元示例图如下图所示。 单个DRAM单元实现电容充放电原理 电容C用来存储电荷,信号WRITE 1、WRITE 0控制开关晶体管Q1和Q2给电容充电和
[单片机]
<font color='red'>STM32</font>上的SDRAM硬件电路设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved