引言
前一阵子一直在忙着期末考试,拖了很久,先跟各位说声抱歉呀,这章我们继续完成上一节未完成的内容。拿到了PCB焊接完了之后呢。我们就需要对这个芯片进行编程了。
正文
先来看一下焊接完之后的实物图吧。
我们回顾一下上一期所提到的功能实现,我们首先对蜂鸣器输出PWM波,通过不同频率的调节,来使得其发出不同音调的声音。并且还增加了一个串口通信的语音播报模块。 我们看一下cubemx上关于pwm波生成的相关配置。
配置好了之后我们就需要在代码中编写生成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之后,我们还需要增加一个语音模块。
通过语音模块的说明书,我们可以知道,我们只需要发送对应的数据包就能完成对应的操作了。 因此我们需要了解一下如何实现串口通信,首先是cubemx的配置。
如上图,我们对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仅支持放很小的文件,所以下面给大家演示一下成品的实验效果。
总结
通过简单的单片机使用,我们已经完成了这么一个电子琴的设计,如果有文字转语音软件的话,该模块还能进行播报等等各种功能,所以当你会使用简单的嵌入式单片机了,那么你就能够成为一名小创客,通过自己的技能来实现自己的想法。