依据32位的STM32F103,运用PWM发生的音频信号驱动蜂鸣器演奏乐曲,完结了音乐播映器的运用规划。该播映器能完结从低声到高音的21个音阶,并能依据曲谱演奏完好的曲目。测验结果表明,PWM的输出信号与各音阶对应的声响频率根本共同,计划切实可行。这一方法也可用于电机操控、电子琴规划等方面,具有较好的实用性。
在科研项目开发中,有时会遇到需求播映电话铃声、音乐等状况。简略的做法是购买专用音乐芯片,但该方法的缺陷是播映的内容不可变,不能很好地满意项目需求。一般地,可选用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的分频和倍频方法不同,需求运用者引起留意。
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。详细设置如下: