微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于STM32的PWM音乐播放器应用设计

基于STM32的PWM音乐播放器应用设计

时间:12-08 来源:互联网 点击:
在科研项目开发中,有时会遇到需要播放电话铃声、音乐等情况。简单的做法是购买专用音乐芯片,但该方法的缺点是播放的内容不可变,不能很好地满足项目需求。一般地,可采用89C51等单片机实现音乐播放,其播放内容及歌曲数量都可以随时修改,使用上相对方便。随着STM32系列微处理器的出现,其基于ARM Cortex—M内核的32位闪存微控制器,高达72 MHz的主频,高集成度、实时性、数字信号处理、低功耗、低电压操作等众多特点,使得其应用越来越广泛。本文基于STM32处理器,根据乐曲简谱制作供程序识别的乐谱,并利用内部定时器产生PWM输出信号,驱动蜂鸣器完成自定义乐谱的播放。经测试,播放效果良好。

1 乐谱简析
1.1 音阶
音阶是音乐必不可少的要素,主要由声音的频率决定。通过给蜂鸣器不同频率的音频脉冲,可以产生不同的音阶,而要产生某频率的音频脉冲,最简单的办法是算出该音频的周期,然后将此周期除以2即为半周期的时间。通过程序控制单片机某引脚半周期为“高”、半周期为“低”,不断交替变换,即可产生该频率的矩形波,接到蜂鸣器上就可发出该频率的声音。若想改变音阶,只需要改变半周期时间即可。表1为C调时音符频率对照表,据此可产生不同音阶的音符。“#”表示半音,用于上升或下降半个音,乘以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 系统时钟设置
要保证定时的准确性,必须先确保系统时钟的设置是我们所预期的。定时器时钟分配如图1所示。通过编程使SYSCLK为72 MHz,APB1预分频后得到PCLK1为36 MHz,再经TIM2~TIM7倍频器得到TIM2~TIM7时钟72 MHz。时钟源多采用HSE(外部时钟源),对于STM32F103,其外部时钟为8 MHz,而STM32F107外部时钟为25 MHz,因此,在使用HSE做时钟源时,这两种器件产生SYSCLK的分频和倍频方式不同,需要使用者引起注意。




3 用PWM控制蜂鸣器播放音乐
3.1 硬件电路设计
蜂鸣器电路如图2所示。需要注意的是,有源蜂鸣器是以固定频率工作,加电即可鸣叫,无源蜂鸣器可以用不同频率输入信号来控制发声,因此,需要选择无源蜂鸣器。核心控制器件选择STM32F103VET6,其引脚PB5连接到BEEP。由电路可知,当PB5为高电平时,蜂鸣器可工作,只要控制PB5高低电平输出形成的矩形波的频率就可以控制蜂鸣器演奏音乐。


3.2 程序设计
3.2.1 制作乐谱
音阶的产生依赖于PWM输出信号的频率。为了简化设计,我们令定时器的TIM_Period为1 999,且占空比始终为50%,根据式(1)则TIM_ Pulse为1000。此时,PWM输出信号频率仅与定时器预分频系数TIM_Prescaler有关,只需要调整该系数,即可得到所需信号频率。
TIM_Prescaler由下式得到:

式(2)中,fsound为音阶对应的频率,如低音Do频率为262 Hz。要产生该音频,TIM_Prescaler应为136。
乐谱由音阶和节拍组成,每两个元素为一组,前者表示音阶,后者表示节拍。节拍以1/4拍为基准,存放的数值为1/4拍的倍数。相关代码如下:

3.2.2 主程序设计
程序流程如图3所示。由于STM32的PWM输出引脚是PB5,所以我们采用TIM3的通道2来产生PWM输出。在GPIO设置程序中,将TIM3的通道2引脚部分重映像到PB5,GPIO模式选择为复用推挽输出。程序循环读取乐谱,根据音阶修改定时器的预分频系数,并重新设置定时器和PWM。同时,利用STM32的内部SysTick进行精确计时,根据节拍实现ms级延时,并减少内核消耗。图4为示波器测量得到的低音So的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top