嵌入式单片机教学——电子琴(二)

117
0
2021年1月12日 13时56分

引言

前一阵子一直在忙着期末考试,拖了很久,先跟各位说声抱歉呀,这章我们继续完成上一节未完成的内容。拿到了PCB焊接完了之后呢。我们就需要对这个芯片进行编程了。


正文

先来看一下焊接完之后的实物图吧。

 

嵌入式单片机教学——电子琴(二)插图

 

我们回顾一下上一期所提到的功能实现,我们首先对蜂鸣器输出PWM波,通过不同频率的调节,来使得其发出不同音调的声音。并且还增加了一个串口通信的语音播报模块。
我们看一下cubemx上关于pwm波生成的相关配置。

 

嵌入式单片机教学——电子琴(二)插图(1)

 

配置好了之后我们就需要在代码中编写生成pwm波的函数。
代码如下:

 

void pwm2_output(uint8_t pwm_CH,float duty)
{
  uint16_t CCR,ARR;

  if(!(pwm_CH!=1 || pwm_CH!=2 || pwm_CH!=3 || pwm_CH!=4)) return;
  if(duty<0||duty>100) return;

  ARR=htim2.Instance->ARR;
  CCR=(uint16_t)(ARR*(duty/100.0f)+0.5f);

  if(pwm_CH==1)
  {
    htim2.Instance->CCR1=CCR;
  }
  else if(pwm_CH==2)
  {
    htim2.Instance->CCR2=CCR;
  }
  else if(pwm_CH==3)
  {
    htim2.Instance->CCR3=CCR;
  }
  else if(pwm_CH==4)
  {
    htim2.Instance->CCR4=CCR;
  }
}

 

当然上面这个函数仅仅支持pwm波的占空比调节,我们本次项目需要对频率进行调节,占空比保持百分之五十即可。
如果需要对pwm波的频率进行调节,我们只需要调节该定时器下的ARR寄存器即可。
代码如下:

 

htim2.Instance->ARR = 频率;
频率取不同值达到不同的音调即可。
实现了DO,RE,MI,FA,SO,LA,XI之后,我们还需要增加一个语音模块。

 

嵌入式单片机教学——电子琴(二)插图(2)

 

通过语音模块的说明书,我们可以知道,我们只需要发送对应的数据包就能完成对应的操作了。
因此我们需要了解一下如何实现串口通信,首先是cubemx的配置。

 

嵌入式单片机教学——电子琴(二)插图(3)

 

如上图,我们对USART1的串口进行配置,采用异步通信模式,并设置波特率为9600。
生成工程之后我们需要写发送数据包来完成操作。首先是将语音模块的音量设置成最大,代码如下:

 

   HAL_UART_Receive_IT(&huart1,(uint8_t *)&RX_BUFF,1);
   tx_data_package0[0] = 0x7E;
   tx_data_package0[1] = 0x03;
   tx_data_package0[2] = 0x06;
   tx_data_package0[3] = 0x1E;
   tx_data_package0[4] = 0xEF;
   HAL_UART_Transmit(&huart1,tx_data_package0,sizeof(tx_data_package0),0xffff);

 

将这部分代码放在主循环之前的初始化函数中执行一次即可。之后我们只需要设置对应的按键事件触发播放曲目即可。由于没有SD卡的缘故,该语音模块板载flash仅支持放很小的文件,所以下面给大家演示一下成品的实验效果。

 



总结

通过简单的单片机使用,我们已经完成了这么一个电子琴的设计,如果有文字转语音软件的话,该模块还能进行播报等等各种功能,所以当你会使用简单的嵌入式单片机了,那么你就能够成为一名小创客,通过自己的技能来实现自己的想法。

发表评论

后才能评论