标签:蜂鸣器 beat int beats 实验 GPIO 播放
STM32F4上的蜂鸣器引脚为PF8
蜂鸣器外部有上拉电源,因此引脚给1,只是为了有微小的驱动电源,通过三极管放大电流后驱动蜂鸣器。因此引脚为推挽下拉输出
不能IO口直接驱动大功率器件
IO口的电流很小,一般只做判断或基本驱动,一般会在外部接入三极管放大电流
stm32的IO口默认状况为浮空
1 void playTone(int beats, int tune){ 2 int time = 500000/tune; //计算频率半周期,us 3 if (tune != -1){ 4 for(int beat = 0; beat < beats; beat++){ 5 GPIO_SetBits(GPIOF, GPIO_Pin_8); 6 delay_us(time); 7 GPIO_ResetBits(GPIOF, GPIO_Pin_8); 8 delay_us(time); 9 } 10 11 } 12 else{ 13 GPIO_ResetBits(GPIOF, GPIO_Pin_8); 14 for(int beat = 0; beat < beats; beat++){ 15 delay_ms(2); 16 } 17 } 18 }
此代码为播放单音频率和延时函数,输入节拍数和音调频率
在这里需要将频率转化成半周期的时长,us
1.如何控制音调
通过delay_us(time)函数,一般里面为500-3000us秒左右,在经过快速的for循环的时候,达到播放音效的目的
2.如何控制声音播放时间
通过for()循环,众所周知,for循环在循环时有一定的时长,通过这个时长播放声音时间,一般来说当beats=400左右时,大概时间为0.5-1.5s左右
3.单音时长时间计算
如果发Do音(294)和So音(441),在4/4拍中的其中一个小节单独发声,假设一个拍子的beats=400,可以估算发Do的声音时长为(500000/294)*2*400/1000/1000=1.36s,而So音的声音时间长度为(500000/441)*2*400/1000/1000=0.9s。不难看出,其实此代码在同一节拍,播放相同时长的声音是比较困难的,因为每个音的发生频率都不一样,即延时不同,延时不同造成在同一时长节拍下,频率高的播放时间相对较短
4.if判断语句
if判断语句是用来检验是否有空闲非唱歌时间,在另外的代码里,空闲时会传入int 型数字-1,因此需要判断停止是否停止发声
标签:蜂鸣器,beat,int,beats,实验,GPIO,播放
来源: https://www.cnblogs.com/sailorwithoutsea/p/12395020.html
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。