1基于STM32的音乐喷泉√♥

Posted 行走的皮卡丘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1基于STM32的音乐喷泉√♥相关的知识,希望对你有一定的参考价值。

1、基于STM32的音乐喷泉

Introduction

With the improvement of people’s living standards and the yearning to build a green city, musical fountains have become an important product in the leisure and entertainment industry with their unique charm and special functions, and more and more musical fountains have been built. According to the current development status of musical fountains, a small musical fountain control system with STM32F103C8T6 microcontroller as the core is introduced. Gives a simple single-chip control circuit, analyzes the audio output circuit and input circuit; introduces the principle of obtaining the spray pool data that determines the action of the spray pool from the audio signal of a specific structure; gives the main program block diagram and the use of program control To control the pattern. The audio signal also affects the changes in the brightness of the light. So that the flickering of the lights and the water posture of the fountain change with the rhythm of the music.

引言

随着人们生活水平的提高和建立绿色城市的向往,音乐喷泉以其独特的魅力和特殊的功能,愈来愈成为休闲娱乐产业中的一项重要产品,音乐喷泉的兴建也越来越多。根据目前音乐喷泉的发展现状,介绍了一个以STM32F103C8T6单片机为核心的小型音乐喷泉控制系统。给出了一个简洁的单片机控制电路,分析了音频输出电路和输入电路;介绍了从特定构造的音频信号中获得决定喷池动作的喷池数据的原理;给出了主程序框图和采用程序控制来控制花型。音频信号还影响灯光光线明暗的变化。从而使灯光的闪烁和喷泉水姿随音乐节奏而变化。

1、系统概述

1.1、设计任务

用STM32设计一个喷泉音乐盒

1.2、设计要求

基于STM32单片机音乐喷泉设计 音乐盒播放器频谱彩灯电子设计

  • 1.可以播放电脑、手机、MP3里面的音乐。

  • 2.产品具有8个LED频谱彩灯,随音乐变化闪烁。

  • 3.音乐停止,喷水电机停止工作。

  • 4.AD对音频信号的采集,转换为数字信号给单片机PWM控制水泵,实现水柱高低变化。

2、 方案设计

2.1、芯片选择方案

STM32单片机是整个温度控制系统的核心部分。因为对温度控制器具有较高的要求,例如高执行速度,高控制精度,高稳定性以及高灵敏度等,所以选择一个具有较高性能而又经济的单片机就成为必然。本设计选用属于STM32系列的STM32F103C8T6单片机作为控制电路的核心部件,该单片机属于ST意法半导体公司生产的32位高性能、低成本、低功耗的增强型系列单片机,它的内核采用的是ARM公司最新研发的Cortex-M3架构,该内核是专门设计于满足用户对高性能、低功耗和经济实用的要求。

2.2、 系统概述:

STM32F103C8T6单片机有3个不同的时钟源可供选择用以驱动系统时钟,分别为HSI振荡器时钟、HSE振荡器时钟和PLL时钟。这些设备还具有2个二级时钟源,分别是40KHz的低速内部RC和32.768KHz的低速外部时钟源,可以用来驱动看门狗时钟和RTC。任何一个时钟源在不被使用时,都可以被独立的关闭或者开启,以实现对系统功耗的优化。

2.3、系统总体设计思路

通过单片机程序来控制喷泉的水姿变化,成为一种新的喷泉艺术形式。单片机作为一种控制用微处理器,包含有基本的软硬件资源。本文采用了单片机控制技术,给出了单片机控制电路,水泵控制电路,流水灯控制电路及部分单片机I/O口初始化程序。单片机的输出通过数模转换通过水泵驱动电路驱动水泵,通过变频调速技术对电泵进行调速,实现程序控制喷泉的高度,不仅能够进行多种水型切换,而且能控制喷泉水柱上下起伏。同时单片机通过I/O来控制LED灯的亮灭。实现了对喷泉的水、光协同控制。

2.4、各功能模块程序实现原理分析

系统主要有STM32F103C8T6单片机和、音频功率放大电流和水泵驱动电路等组成。

2.4.1.水泵驱动模块

根据单片机的电流特性,不足以直接驱动水泵。有三极管的输出特性,利用晶体管的饱和和截止特性构成开关电路。通过二级三极管电流放大实现对水泵控制,P20为高电平时基极与集电极之间反向偏置,不导通;当P20为低电平时,基极与集电极之间正向偏置,导通。电路工作,水泵工作工作,单片机只需要吸收娇小的输入电流。

2.4.2输入音频功率放大模块

LM386是低电压小功率音频放大集成电路,采用8脚双列直插式塑封包装电路特点

  • 1、外接元件极少,不需要用输入耦合电容;

  • 2、负反馈电路在内部,增益有两种26db46db可供选用;

  • 3、输入级采用仪表用放大器的形式,带有同相输入和反响输入两个引脚4静态功耗小,当电源电压为6伏时,静态功耗为24mw

1与8脚为增益调整端,当两脚开路时,电压放大数为20倍,当两脚间接10uf电容时,电压放大倍数为200倍;2脚为反相输入端;3脚为同相输入端;4脚为地端;5脚为输出端;6脚为电源正端;7脚为旁路端;6脚与地之间接10uf电容可消除可能产生的自激震荡,如无震荡7脚可悬空不接。

3 、STM32性能介绍及硬件设计

3.1、 STM32单片机性能介绍

STM32它拥有的资源包括:48KB SRAM、256KB FLASH、2 个基本定时器、4 个通用定时器、2个高级定时器、2个DMA 控制器(共 12 个通道)、3 个SPI、2个IIC、5个串口、1个USB、1个CAN、3个12位ADC、1个12位DAC、1个SDIO接口及51 个通用IO口,该芯片性价比极高。

各个引脚说明如下

  • PA0 作用1,按键 KEY_UP 2,可以做待机唤醒脚(WKUP) 3,可以接 DS18B20 传感器接口(P2 设置)

  • PA1作用1,NRF24L01 接口 IRQ 信号 2,接 HS0038 红外接收头(P2 设置)

  • PA2 作用 作为W25Q64 的片选信号

  • PA3 作用 作为SD 卡接口的片选脚

  • PA4 作用 作为NRF24L01 接口的 CE 信号

  • PA5 作用 作为W25Q64、SD 卡和 NRF24L01 接口的 SCK 信号

  • PA6 作用 作为 W25Q64、SD 卡和 NRF24L01 接口的 MISO 信号

  • PA7 作用 作为 W25Q64、SD 卡和 NRF24L01 接口的 MOSI 信号

  • PA8 作用 作为 接 DS0 LED 灯(红色)

  • PA9 作用 作为串口 1 TX 脚,默认连接 CH340 的 RX(P4 设置)

  • PA10 作用 作为串口 1 RX 脚,默认连接 CH340 的 TX(P4 设置)

  • PA11 作用 作为接 USB D-引脚

  • PA12 作用 作为接 USB D+引脚

  • PA13作用 作为JTAG/SWD 仿真接口,没接任何外设

  • PA14 作用 作为JTAG/SWD 仿真接口,没接任何外设

  • PA15 作用 作为1,JTAG 仿真口(JTDI) 2,PS/2 接口的 CLK 信号 3,接按键 KEY1

3.2、音乐喷泉系统硬件设计\\

该程序所需要的电源电路,功率放大电路,音频输入电路,LED灯显示电路,水泵驱动电路,次如下图所示

图1.1电源电路图如下图

图1.2 功率放大电路图如下图

图1.3音频输入电路图如下图

图1.4 LED电路图如下图

图1.5 水泵驱动电路图如下图

4、 系统程序

4.1、主程序设计如下

音乐喷泉系统主要由单片机通过红外通信控制,当其完成红外信号,读取数据,其数据的传输根据协议的内容,音乐喷泉系统程序需要完成以下的功能:

  • 1、led灯随音频信号起伏;

  • 2、水泵的喷水量随音量的变化而变化。

程序流程图如下:

图1.5主程序流程设计图

4.2 主程序内容

#include "main.h"
#include "stm32f1xx_hal.h"

/* USER CODE BEGIN Includes */
#include <math.h>
#include <stdio.h>

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/
ADC_HandleTypeDef hadc1;

IWDG_HandleTypeDef hiwdg;

TIM_HandleTypeDef htim3;
TIM_HandleTypeDef htim4;

UART_HandleTypeDef huart1;

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/

//宏定义灯IO
#define LED0_0  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_15,GPIO_PIN_RESET)
#define LED0_1  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_15,GPIO_PIN_SET)

#define LED1_0  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET)
#define LED1_1  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_SET)

#define LED2_0  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET)
#define LED2_1  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET)

#define LED3_0  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET)
#define LED3_1  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET)

#define LED4_0  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET)
#define LED4_1  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET)

#define LED5_0  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET)
#define LED5_1  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET)

#define LED6_0  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET)
#define LED6_1  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET)

#define LED7_0  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET)
#define LED7_1  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET)


unsigned char PWM_falg=1;
uint8_t ch;
uint8_t ch_r;
//重写这个函数,重定向printf函数到串口,意思就是说printf直接输出到串口,其默认输出到控制台的
 /*fputc*/
 int fputc(int c, FILE * f)
 {
     ch=c;
     HAL_UART_Transmit(&huart1,&ch,1,1000);//发送串口
     return c;
 }
 //重定向scanf函数到串口 意思就是说接受串口发过来的数据,其默认是接受控制台的数据
 /*fgetc*/
 int fgetc(FILE * F)    
 {
     HAL_UART_Receive (&huart1,&ch_r,1,0xffff);//接收
     return ch_r;
 }
//#######################################################################################################//
//下面定义关于串口的
unsigned char Uart1_Buff[1024];  //串口1缓冲数组
unsigned char Uart1_Count=0;     //串口1累加变量
uint8_t aRxBuffer[3];            //定义一个暂存数组

//下面定义关于定时器的
unsigned int  Time4_ms=0;
//下面定义关于读取ADC的
unsigned char Scan_Fre=0;
unsigned int  ADC_Dat=0;
//下面定义启停部分
unsigned char Open_Close=1;
unsigned char System_Count=0;
unsigned int Open_Flsh=0;

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM4_Init(void);
static void MX_ADC1_Init(void);
static void MX_TIM3_Init(void);
static void MX_IWDG_Init(void);
static void MX_USART1_UART_Init(void);

void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);
                                

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

struct Complex {
char real;//实部
char imag;//虚部
}; //构造复数结构
typedef struct Complex COMPLEX;  
#define  N    128   //FFT点数(长度)
#define  PI2 128		//一周期分成128点
COMPLEX  S[N]; //FFT复数数组  
unsigned char  iw[128]={0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,10,11,11,12,12,12,13,13,14,14,14,15,15,15,16,16,16,17,17,17,17,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,22,22,22,22,23,23,23,23,23,24,24,24,24,25,25,25,25,25,26,26,26,26,26,27,27,27,27,27,27,28,28,28,28,28,29,29,29,29,29,29,30,30,30,30,30,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31};
char  costab[PI2]={
127,127,127,126,125,124,122,120,118,115,112,109,106,102,
98,94,90,85,81,76,71,65,60,54,48,43,37,31,24,18,12,6,0,
-6,-12,-18,-24,-31,-37,-43,-48,-54,-60,-65,-71,-76,-81,
-85,-90,-94,-98,-102,-106,-109,-112,-115,-118,-120,-122,
-124,-125,-126,-127,-127,-128,-127,-127,-126,-125,-124,
-122,-120,-118,-115,-112,-109,-106,-102,-98,-94,-90,-85,
-81,-76,-71,-65,-60,-54,-48,-43,-37,-31,-24,-18,-12,-6,0,
6,12,18,24,31,37,43,48,54,60,65,71,76,81,85,90,94,98,
102,106,109,112,115,118,120,122,124,125,126,127,127
//127,127,126,126,125,123,122,120,117,115,112,109,106,102,
//98,94,90,85,81,76,71,65,60,54,49,43,37,31,25,19,12,6,0,
//-6,-12,-19,-25,-31,-37,-43,-49,-54,-60,-65,-71,-76,-81,
//-85,-90,-94,-98,-102,-106,-109,-112,-115,-117,-120,-122,
//-123,-125,-126,-126,-127,-127,-127,-126,-126,-125,-123,
//-122,-120,-117,-115,-112,-109,-106,-102,-98,-94,-90,-85,
//-81,-76,-71,-65,-60,-54,-49,-43,-37,-31,-25,-19,-12,-6,
//0,6,12,19,25,31,37,43,49,54,60,65,71,76,81,85,90,94,98,
//102,106,109,112,115,117,120,122,123,125,126,126,127
};
char sintab[PI2]={
0,6,12,18,24,31,37,43,48,54,60,65,71,76,81,85,90,94,98,
102,106,109,112,115,118,120,122,124,125,126,127,127,128,
127,127,126,125,124,122,120,118,115,112,109,106,102,98,
94,90,85,81,76,71,65,60,54,48,43,37,31,24,18,12,6,0,-6,
-12,-18,-24,-31,-37,-43,-48,-54,-60,-65,-71,-76,-81,-85,
-90,-94,-98,-102,-106,-109,-112,-115,-118,-120,-122,-124,
-125,-126,-127,-127,-128  ,-127,-127,-126,-125,-124,-122,
-120,-118,-115,-112,-109,-106,-102,-98,-94,-90,-85,-81,
-76,-71,-65,-60,-54,-48,-43以上是关于1基于STM32的音乐喷泉√♥的主要内容,如果未能解决你的问题,请参考以下文章

基于STM32单片机项目设计目录-加油吧√

基于STM32单片机项目设计目录-加油吧√

基于STM32设计的音乐播放器

stm32 怎么让蜂鸣器发出音乐

STM32实现Airplay音乐播放器

LVGL|基于lvgl 7.11.0 编写的 STM32F103 GUI