其他分享
首页 > 其他分享> > STM32CubeMX(06) STM32控制不同的开关,实现电子琴功能。

STM32CubeMX(06) STM32控制不同的开关,实现电子琴功能。

作者:互联网

在这里插入图片描述

文章目录


前言

好久都没有写cube相关的内容了,今天来学习用STM32控制不同的开关,实现电子琴功能。

硬件:STM32ZET6
软件:keil 5

一、实验内容

实现电子琴功能,控制不同的开关,可以实现不同频率的音频输出,完成歌曲《一闪一闪亮晶晶》的演奏。
在这里插入图片描述
按照建议电路连线后,==PB.14(TIM1的ch2)==控制蜂鸣器的输入引脚CTRL。8个开关可以用作不同频率的音频输出控制开关。

二、电路连线

我们可以看到8个按键连接着8个IO口,并且是上拉高电平。也就意味着我们按下去的时候,这个IO口就会变成低电平。这也是我们软件判断的依据之一。
这里是PC0到PC7,八个开关。
在这里插入图片描述

三、发音原理

1:如果PWM的频率落在交流蜂鸣器的发音区,交流蜂鸣器就可以发出音调,调节PWM的占空比,可以调节音量。
所以很简单,我们只要改变PWM波的频率。就可以发出我们常用的八个音。

在这里插入图片描述
那么如何改变频率呢,肯定是改变PSC,ARR的值。我们改一个就行了。就ARR。频繁的改分频系数不好,改计数器的值就可以。
我们用HAL库帮我们写好的库函数就行。
__HAL_TIM_SET_AUTORELOAD(&htim1,arr);
这个函数见名知意,直接改变重装载的值,当然,最后的原理肯定是直接改寄存器,官方已经帮我们封装好了,我直接用就行。传两个参数,一个定时器几,一个是自动重装载值。
在这里插入图片描述
诸如此类的函数还有
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
设置占空比的。
在这里插入图片描述
设置计数值的。这个在输入捕获用的比较多。
在这里插入图片描述

四、STM32cubeMX配置

前面讲了这么多,RCC,SYS,时钟树,应该要轻车熟路了。
固定的一个配置。上面三个就不讲了。上面三个可以去看前面如何配置。
我们讲我们的关键部分,。

4.1配置GPIO

首先把我们的PC0——PC7,配置成输入模式。上拉输入。
因为我们的按键是我们的外部输入,我们需要去检测引脚状态。
然后起一个名字。
在这里插入图片描述
在这里插入图片描述
其他7个也是一样的道理。

4.2配置定时器

实验明确指出是定时器1.通道2,我们刚开始就初始化为1kHz,占空比20%
他本来的GPIO 是PB0,根据实验要求我们需要重映射到PB14
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

那么到这里我们就配置完了。我们生成工程。看需求,我们就需要定时器输出PWM波,和IO口。

五、软件部分

软件部分我们就一直检测这八个引脚哪个状态发生了变化,我们就执行哪一个操作。
我们就写一个简单易懂的就行
首先在main.h头文件中定义,读取我们的引脚状态
在这里插入图片描述
然后在main.c文件中,定义按键扫描函数和修改装载值的函数。
那么这几个数字怎么来的,举个例子。168M的主频,分频系数是168,那么就变成1MHz了,然后1M再除以3816->1000000/3816=262,是不是就是我们DO的音调了。以此类推。
在这里插入图片描述
在这里插入图片描述
最后在我们的主函数里面调用我们的Playmusic 函数就可以了。注意,定时器的开启函数一定要加上 HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_2);。具体看我下面的代码。

/* USER CODE BEGIN 0 */
uint8_t KeyScan(void)
{
 if(KEY_0==0||KEY_1==0||KEY_2==0||KEY_3==0||KEY_4==0||KEY_5==0||KEY_6==0||KEY_7==0)
 {
  HAL_Delay(20);
	if(KEY_0==0) return KEY_0_PRES;
	else if(KEY_1==0) return KEY_1_PRES;
  else if(KEY_2==0) return KEY_2_PRES;
  else if(KEY_3==0) return KEY_3_PRES;
  else if(KEY_4==0) return KEY_4_PRES;
  else if(KEY_5==0) return KEY_5_PRES;
  else if(KEY_6==0) return KEY_6_PRES;
  else if(KEY_7==0) return KEY_7_PRES;
 }else if(KEY_0==1||KEY_1==1||KEY_2==1||KEY_3==1||KEY_4==1||KEY_5==1||KEY_6==1||KEY_7==1) return 8;
 return 9;

}

void PlayMusic(void)
{
  switch(KeyScan())
	{
	    case KEY_0_PRES:arr=3816;__HAL_TIM_SET_AUTORELOAD(&htim1,arr);break;
		case KEY_1_PRES:arr=3401;__HAL_TIM_SET_AUTORELOAD(&htim1,arr);break;
		case KEY_2_PRES:arr=3030;__HAL_TIM_SET_AUTORELOAD(&htim1,arr);break;
		case KEY_3_PRES:arr=2865;__HAL_TIM_SET_AUTORELOAD(&htim1,arr);break;
		case KEY_4_PRES:arr=2551;__HAL_TIM_SET_AUTORELOAD(&htim1,arr);break;
		case KEY_5_PRES:arr=2272;__HAL_TIM_SET_AUTORELOAD(&htim1,arr);break;
		case KEY_6_PRES:arr=2032;__HAL_TIM_SET_AUTORELOAD(&htim1,arr);break;
		case KEY_7_PRES:arr=1912;__HAL_TIM_SET_AUTORELOAD(&htim1,arr);break;
		default :       arr=0;__HAL_TIM_SET_AUTORELOAD(&htim1,arr);break;
	}
  
}
/* USER CODE END 0 */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM1_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_2);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
     PlayMusic();
  }
  /* USER CODE END 3 */

}

总结

今天的总结就到这里,希望能够帮助到大家。
在这里插入图片描述

标签:arr,CODE,06,STM32CubeMX,USER,KEY,HAL,电子琴,PRES
来源: https://blog.csdn.net/qq_45138815/article/details/120366346