单片机如何发出类似和弦的声音

2023-05-16

蜂鸣器声音优化

1、优化思路

蜂鸣器的控制,在单片机领域,大多数人都是给一定周期的脉冲,蜂鸣器就会发出声音,而本质上,蜂鸣器只是一个金属弹片,声音大小取决于弹片的幅值,而幅值取决于施加的电压大小。电压大小可以使用PWM进行控制,所以这里跟电机的控制一样,可以使用SVPWM进行调制。一个调制频率一个运行频率。在蜂鸣器弹片的发声时间宽度内,用调制频率下PWM波形进行驱动。但是用这种方式,需要使用两个定时器,并进行串联。这种方式会多耗费一个定时器资源。

还有一种方式,是直接使用PWM波形进行驱动,脉宽控制电压,周期控制声音频率,这种方式程序实现更简洁,对硬件资源也更友好,但是有两个缺点,第一,就是声音的大小控制不线性(SVPWM是否线性,未验证)。第二,在低频率段比较生硬,工作在较高音频下效果比较好。

本文采用第二种方式实现蜂鸣器的声音优化,加上强弱控制,颤音控制。

2、强弱控制算法

2.1、 线性衰减

2.1.1、公式

y = a x + b y = ax +b y=ax+b
当 x = 0时,y = b;

当 y = 0时,x = -b/a;

2.1.2、程序

x为0时,y为最大的音量,y为0时,x为最大的时间长度,所以具体实现函数如下:

//线性衰减
float Voice_Curve_Linear(float volume,float len,uint16_t cnt)
{
	float a = -volume/len;
	float b = volume;
	float y = a*cnt + b;		
	return y;
}

2.2、 抛物线衰减

2.2.1、公式

y = a ∗ x 2 + b ∗ x + c y = a*x^2 + b*x +c y=ax2+bx+c
1 、当 x = 0时,y = c ,即最大音量;

2 、抛物线顶点公式

( − b / 2 a , ( 4 a c − b 2 ) / 4 a ) (-b/2a,(4ac-b^2)/4a) b/2a,(4acb2)/4a
顶点处:

x = − b / 2 a ; x = -b/2a; x=b/2a

y = ( 4 a c − b 2 ) / 4 a ; y = (4ac-b^2)/4a; y=(4acb2)/4a
3、由顶点公式推出

a = c / l e n 2 ( l e n 为 最 大 时 间 , c 为 最 大 音 量 ) a = c/len^2(len为最大时间,c为最大音量) a=c/len2(lenc)

b = − 2 c / l e n b = -2c/len b=2c/len
所以

y = v o l u m e / l e n 2 ∗ x 2 − 2 v o l u m e / l e n ∗ x + v o l u m e ; y =volume/len^2 * x^2 - 2volume/len * x + volume; y=volume/len2x22volume/lenx+volume;

2.2.2、程序

程序实现如下:

//抛物线衰减

float Voice_Curve_Para(float volume,float len,uint16_t cnt)
{
	float a = (float)volume/((float)len*(float)len);
	float b = - 2*(float)volume/(float)len;
	float y = a*cnt*cnt + b*cnt +(float)volume;		
	return y;
}

2.3 、sin曲线衰减

在整个的发声的时间段内,通过6个周期的正弦波进行衰减,将小于0的值,直接翻转到第一象限。

2.3.1、公式

正弦函数的公式如下

y = K s i n ( w x + f i ) y = Ksin(wx + fi) y=Ksin(wx+fi)

周 期 T = 2 P I / w 周期T = 2PI/w T=2PI/w

2 P I / w = l e n / 6 2PI/w = len/6 2PI/w=len/6
所以

w = 12PI/len

因为正弦函数在x为0时,有也为0,所以需要进行相移PI/4(2PI为一个周期),所以实际的相移为:

f i = l e n / 24 fi = len/24 fi=len/24

2.3.2、程序

//sin
float Voice_Curve_Sin(float volume,float len,uint16_t cnt)
{
	float w,f,K;
	w = 12*3.14/(len*0.001);
	f = len/24;
	K = Voice_Curve_Linear(volume,len,cnt);
	return (fabs(K*sin(w*cnt*0.001 + f)));
	
}

3、单片机硬件配置

单片机硬件配置为定时器基础配置,这里不表。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单片机如何发出类似和弦的声音 的相关文章

随机推荐