基于STM32的电子琴/音乐播放器设计
引言
单片微型计算机室大规模集成电路技术发展的产物,属于第四代电子计算机它具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。他的应用必定导致传统的控制技术从根本上发生变革。因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。它在现代音乐扮演重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。本文的主要内容是用STM32f103rbt6单片机为核心控制元件,设计一个电子琴。
设计核心在于使用STM32单片机内置的
第一章 总体设计
1.1 系统功能
按照设计要求,本系统具有以下功能:
- 共有三个基本模式:电子琴模式、录音模式、播放器模式
- 电子琴模式下,7个基本按键控制产生7种音调,功能键实现调节音阶和音量
- 录音模式可分为录音和放音两个模块,录音状态下会记录弹奏的音调以及时间;放音模式调用音乐播放器某些模块,实现相同的功能。
- 音乐播放器模块下,可以实现音乐的播放、暂停、切歌、调速、顺序播放、单曲循环、随机播放、以及进度条显示。
- 有两个全局按键中断,可控制模式切换和全局静音/暂停。
1.2 主要技术性能指标
- 基本按键:7个;
- 功能按键:6个;
- 全局中断按键:2个;
- 扬声器:1个;
- 扬声器功率:1w;
- LCD1602:1块;
- 主要模式:3个;
- 曲库:8首;
- 音域范围:262Hz~2217Hz;
- 音量阶数:3阶;
- 速度阶数:4阶;
- 循环模式:3种;
第二章 系统设计
2.1 系统设计
总体系统设计上在硬件上共分为3个区域:基本按键区、功能按键区、LCD显示区。在软件的设计上共分为3个主要模式:电子琴模式、录音模式、播放器模式。主控模块选择使用STM32f103rbt6芯片,进行编程、控制、实现电子琴以及播放器功能。
2.2 硬件设计
2.2.1 整体仿真图
2.2.2 按键模块
按键模块分为两部分:基本按键和功能按键
俩个部分按键分别接在单片机的PC0-PC6以及PC8-PC13接口上。
2.2.3 扬声器模块
扬声器模块接在单片机的PC07接口上。
2.2.4 显示模块
将LCD1602的D0~D7分别连接到单片机的 PA0~7,使能端 E、 RW、 RS分别连接到单片机的 PA8、 PA11、 PA12。
2.2.5 主控模块
2.3 软件设计
2.3.1 主要工作原理
设计的主要工作原理是利用STM32所内置的定时器TIM3产生一个PWM信号驱动扬声器产生特定频率的声音。通过改变定时器TIM3的分频预置数改变PWM信号的频率从而产生不同音调的声音。通过改变占空比,从而产生不同音量的声音。
相关流程图如下:
2.3.2 PWM发生器
#include "pwm.h"
TIM_HandleTypeDef TIM3_Handler; //定时器句柄
TIM_OC_InitTypeDef TIM3_CH2Handler; //定时器3通道1句柄
//TIM1 PWM部分初始化
//arr:自动重装值。
//psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率,单位:Mhz
void TIM3_PWM_Init(u16 arr,u16 psc)
{
TIM3_Handler.Instance=TIM3; //定时器1
TIM3_Handler.Init.Prescaler=psc; //定时器分频
TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式
TIM3_Handler.Init.Period=arr; //自动重装载值
TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//分频因子
TIM3_Handler.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;//使能自动重载
HAL_TIM_PWM_Init(&TIM3_Handler); //初始化PWM
TIM3_CH2Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
TIM3_CH2Handler.Pulse=arr/2; //设置比较值,此值用来确定占空比,默认比较值为自动重装载值的一半,即占空比为50%
TIM3_CH2Handler.OCPolarity=TIM_OCPOLARITY_LOW; //输出比较极性为低
HAL_TIM_PWM_ConfigChannel(&TIM3_Handler,&TIM3_CH2Handler,TIM_CHANNEL_2);//配置TIM3通道2
HAL_TIM_PWM_Start(&TIM3_Handler,TIM_CHANNEL_2);//开启PWM通道2
}
//定时器底层驱动,时钟使能,引脚配置
//此函数会被HAL_TIM_PWM_Init()调用
//htim:定时器句柄
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
GPIO_InitTypeDef GPIO_Initure;
if(htim->Instance==TIM3)
{
__HAL_RCC_TIM3_CLK_ENABLE(); //使能定时器3
__HAL_AFIO_REMAP_TIM3_ENABLE(); //TIM3通道引脚完全重映射使能
__HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIOC时钟
GPIO_Initure.Pin=GPIO_PIN_7; //PC6
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOC,&GPIO_Initure);
}
}
//设置TIM3通道2的占空比
//compare:比较值
void TIM_SetTIM3Compare2(u32 compare)
{
TIM3->CCR2=compare;
}
//设置TIM3通道2的arr
void TIM_SetTIM3Autoreload(u32 Autoreload)
{
TIM3->ARR=Autoreload;
}
//定时器3中断服务函数
void TIM3_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM3_Handler);
}
2.3.3 music播放器模块
music模块包含了产生声音,静音,音乐播放,音乐切换,进度条展示等相关函数,全都由本人编写
静音模块:通过调用TIM_SetTIM3Compare2()
函数让占空比为0,进而达到静音效果。
void buzzerQuiet(void)//停止发声
{
TIM_SetTIM3Compare2