声音定位系统优秀3篇

声音定位系统 篇1

2014年重庆理工大学电子设计竞赛

声音定位系统(C题)

摘要:本系统使用STM32产生频率为500Hz的正弦波信号,该信号用LM386进行功率放大及驱动后输入到蜂鸣器作为声源。接收部分使用拾音器进行接收,首先对接收的信号经过同相放大,使变化的电流信号转换为变化的电压信号。然后经过由OP07组成的有源带通滤波器,该滤波器的中心频率为500Hz,带宽为100Hz,增益为1倍,去除周围环境的声波,滤波后的信号正好是蜂鸣器发出的声音信号。再对滤波后的两路信号经过相移检测电路,可以把滤波后的正弦波转换为方波,以便单片机STM32对相位差信号进行捕获。声源定位是通过对四个拾音器接收到相位差信号进行处理,经过一套比较完善的算法可得声源的坐标,即可进行声源定位。

关键词:500Hz 声音定位 STM32

一、系统方案

1、声音信号产生的选择

方案一:采用NE555产生频率为500Hz的方波用来作为声音信号。它的作用是用内部的定时器来构成时基电路。外部通过简单的电路可获得所得的信号。该电路搭建比较简单,原理易于理解,电路中元器件参数也比较好计算。

方案二:用单片机STM32来产生频率为500Hz的正弦波用来作为声音信号。该正弦波信号的产生实质上是将正弦波转换的到的数组存入单片机,经DA转换输出正弦波。

方案比较:方案一中,用NE555产生信源不是很稳定,波形不太规范且信号的频率不固定,这样的信号对本系统不太合适。方案二中,用软件来产生信号,该信号很稳定,是比较标准的频率为500Hz的正弦波信号,而且,产生波形比较灵活,从而为发挥部分做好准备。因此选择方案二。

2、声源的选择

方案一:采用低音扬声器作为声源。扬声器是一种把电信号转变为声信号的换能器件。将单片机产生的频率为500Hz的信号接在扬声器的接收端,扬声器能发出强度比较大的声音信号。

方案二:采用无源蜂鸣器作为声源。无源蜂鸣器在提供一定频率的正弦波震荡源时,能够发出声音。试验中用无源蜂鸣器发声时,声音比较清晰,但声音强度比扬声器稍弱。

方案比较:这里选择方案二。

3、滤波方案的选择

方案一:用RC无源滤波器。通过计算可以较方便的通过匹配电阻电容得出所需要的通频带。该滤波电路抗干扰性较强,有较好的低频特性,并且选用标准的阻容元件易得。

方案二:用有源滤波器。有源滤波器是利用可关断电力电子器件,产生与负荷电流中谐波分量大小相等、相位相反地电流来抵消谐波的滤波装置。

有源滤波器除了滤除谐波外,同时还可以动态补偿无功功率。其优点是反映动作迅速,滤除谐波可达到95%以上,补偿无功细致。

方案比较:方案一中,谐波滤除率一般只有80%,对基波的无功补偿也是一定的,并且通频带比计算出的要宽,不太符合设计要求。方案二中,电路比较复杂,但通过匹配后能较好的完成带通滤波,能达到预期的要求。因此选择多路负反馈二阶有源带通滤波器,即方案二。

二、定位算法理论分析与计算

根据题目要求,A,B,C,D为声音接收模块,现对元坐标系进行坐标变换,以A点为坐标原点,建立笛卡尔坐标系,动点P(x,y)至点A,B,C,D的距离之差为一常数,建立数学模型:

x2(yb)2x2y2t1v.。.。.。.。.。.①(x-a)2y2x2y2t2v.。.。.。.。.。.。.②(x-a)2(y-b)2x2y2t3v.。.。.。.③令t1v=C1xRcost2vC2yRsint3vC3原方程转化为: 2R(C1bsin)b2C12.。.。.。.。.。.。.。④22R(C2acos)a2C2.。.。.。.。.。.。.⑤2R(C3acos+bsin)a2b2C32.。.。.。.。.。.。.⑥C1+bsinb2C12④得:=22⑤C2acosaC2 b2C12令2=1,得: 2aC24

C21C1b=arctanarccos221a1ab2b2C12R2(C1bsin)

三、电路与程序设计

1、声响模块电路设计

声响模块是由STM32单片机输出频率为500Hz的正弦波,然后从单片机引脚输出,输出的信号经过功率放大电路放大后,再接入到蜂鸣器,驱动发声。

2、声音接收放大器电路设计

接收部分是用拾音器接收声音信号。由于拾音器接收到的信号在不经过放大时信号很小,不易检测,故后级利用放大电路将接收的信号进行处理。

图 1 放大电路

3、测量、数据处理电路设计

根据要求只有当接收到的信号为500Hz时,我们才能保证接收到的信号是由声源发出的。而拾音器接收到的声音信号是任意频率的,故此 处要进行滤波处理。滤波采用的是带通滤波器,通过电容电阻的匹配,最终滤波器的中心频率为500Hz,带宽为50Hz。拾音器接收到的信号经过带通滤波器后,能够将声源发出的信号滤出,正符合本题要求。

图 2 二阶有源滤波电路

滤波后的信号为正弦波,但该信号不便于用单片机进行处理,故在后级加入了相移检测电路。其基本功能是对两路正弦波信号进行比较,并根据比较结果输出一路方波信号。并由此来判断声音信号的位置差。能够用单片机然后用单片机进行捕获处理,效果比较满意。

图 3 相移检测电路

4、程序设计

4.1该系统程序设计主要分为四部分:

1用STM32产生500hz正弦波; ○

2利用STM32的输入捕获捕获相移检测电路后的方波信号; ○3利用定位算法,○通过单片机对检测到的相位差信号进行处理,得到声源位置坐标;

4将得到的声源位置坐标送TFT屏显示,○并将位置坐标存入数组中,实现连续显示声源位置轨迹的功能

四、测试方案与测试结果

1、测试方法与仪器

声源定位测试方法:将声源放在坐标纸上的任意坐标,不让声源发声,记下坐标值(x0,y0)。然后启动声源,让声源发出1s左右的声音信号,同时单片机接收信号后开始进行计算,计算出的坐标值(x1,y1)通过TFTLCD屏显示出来。

2、测试结果与分析

该系统的软件部分设计经验证,实现了捕获、处理、定位功能,如图所示为当声源信号位于(200,100)mm位置时,通过单片机定位算法得到的位置坐标:

图 4 捕获的到的高电平及单片机处理得到的位置信息

该系统的缺陷为功率放大模块和滤波模块没有做好,滤波模块实际滤波中心频率约为460hz,带宽100hz。效果不够理想。

五、思考与总结

经过几天的努力,终于基本完成了声音定位系统的制作与程序设计,在此过程中,收益颇多,熟悉了功放、滤波、放大等模块的制作以及如何利用STM32单片机完成一个系统设计等。在此过程中也认识到了许多不足,为以后的学习指明了方向。

六、参考文献(略)

七、附录

1、主程序include“led.h”include“delay.h”include“key.h”include“sys.h”include“lcd.h”include“usart.h”include“timer.h”include“math.h”

//全局变量x,y为坐标,以坐标纸左下角为原点,单位mm s32 xx=0,yy=0;u8 xp=0,yp=0;u8 xp1=0,yp1=0;

u16 cap_num1=0,cap_num2=0;u32 sum1=0,sum2=0;s16 t1=0,t2=0;

u16 pointx[280];//定义点的位置数组 u16 pointy[280];

u8 DrawLine_flag=0;//定义画线标志位

extern u8 TIM5CH1_CAPTURE_STA;

//输入捕获状态

extern u16 TIM5CH1_CAPTURE_VAL;//输入捕获值

extern u8 TIM5CH2_CAPTURE_STA;

//输入捕获状态

extern u16 TIM5CH2_CAPTURE_VAL;//输入捕获值

void Display_Change(void);

//对声源信号进行处理,得到声源位置 //当t1、t2情况为负值时,情况如何? void pxf(int t1,int t2){ int a=500;

int b=350;float v=340;float c1=t1*v/1000;float c2=t2*v/1000;float delta=(b*b-c1*c1)/(a*a-c2*c2);float sita=atan2(b,delta*a)+acos((c2*delta-c1)/sqrt(delta*delta*a*a+b*b));

}

int main(void){ float R=(b*b-c1*c1)/2/(c1+b*sin(sita));xx=-R*cos(sita);yy=R*sin(sita);

Display_Change();//通过读取A3管脚IO口的状态选择打点还是画线

delay_init();//延时函数初始化

NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位u32 temp1=0,temp2=0;u16 i=0,j=0;响应优先级

uart_init(9600);//串口初始化为9600

//LED端口初始化 LED_Init();

LCD_Init();TIM3_Int_Init(1999,719);//每5ms进一次定时器3中断,进行液晶屏显示

TIM5_Cap_Init(0XFFFF,72-1);//以1Mhz的频率计数(每计数一次为1u秒)

LCD_ShowChar(10,210,'(',16,0);LCD_ShowChar(90,210,')',16,0);LCD_ShowChar(50,210,',',16,0);POINT_COLOR=RED;LCD_Clear(YELLOW);//背景色为黄色

while(1){

//进行400次输入捕获,理论应该执行800ms,for(i=0;i<400;i++)待验证

{ if(TIM5CH1_CAPTURE_STA&0X80)//成功完成一次捕获

{

cap_num1++;temp1=TIM5CH1_CAPTURE_STA&0X3F;temp1*=65536;//溢出时间总和 temp1+=TIM5CH1_CAPTURE_VAL;//得到总的高电平时间

sum1+=temp1;

TIM5CH1_CAPTURE_STA=0;//开启下一次捕获

}

if(TIM5CH2_CAPTURE_STA&0X80)//成功完成一次捕获

{

cap_num2++;

temp2=TIM5CH2_CAPTURE_STA&0X3F;

temp2*=65536;//溢出时间总和

temp2+=TIM5CH2_CAPTURE_VAL;//得到总的高电平时间

sum2+=temp2;

TIM5CH2_CAPTURE_STA=0;//开启下一次捕获

} }

t1=sum1/cap_num1;//求平均值,提高捕获精度

printf(“rn通道1High:%d usrn”,t1);sum1=0;cap_num1=0;

t2=sum2/cap_num2;printf(“rn通道2High:%d usrn”,t2);

sum2=0;cap_num2=0;

xp=xx/2.5;yp=140-yy/2.5;if(xp>10&&xp10&&yp<150)//判断点的坐标是否在正常范pxf(t1,t2);围内

{

//把点存入数组 if(xp!=xp1 | yp!=yp1){

pointx[j]=xp;pointy[j]=yp;j++;if(j==280)//只存280个点的位置 { } xp1=xp;//将上一次的位置值进行保存,与下一次进行比较,j=0;看是否有变化

}

}

yp1=yp;} }

2、定时器部分程序include“timer.h”include“led.h”include“usart.h”include“lcd.h”

extern s32 xx,yy;extern u8 xp,yp;//注意:对变量声明时不可以同时进行赋值 extern u8 xp1,yp1;extern u8 DrawLine_flag;

//在定时器3中断中进行液晶显示

void TIM3_Int_Init(u16 arr,u16 psc){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//时钟使能

//定时器TIM3初始化

TIM_TimeBaseStructure.TIM_Period = arr;//设置在下一个更新事件装入NVIC_InitTypeDef NVIC_InitStructure;活动的自动重装载寄存器周期的值

TIM_TimeBaseStructure.TIM_Prescaler =psc;//设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//设置时钟分割:TDTS = Tck_tim

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM

向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);//根据指定的参数初始化TIMx的时间基数单位

TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//使能指定的TIM3中断,允许更新中断

}

//定时器3中断服务程序(声源位置显示)void TIM3_IRQHandler(void)//TIM3中断 { if(TIM_GetITStatus(TIM3, TIM_IT_Update)!= RESET)//检查TIM3更TIM_Cmd(TIM3, ENABLE);//使能TIMx

//中断优先级NVIC设置

NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;//TIM3中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道被使能 NVIC_Init(&NVIC_InitStructure);//初始化NVIC寄存器

新中断发生与否

{ TIM_ClearITPendingBit(TIM3, TIM_IT_Update);//清除TIMx更新中断标志

LCD_ShowNum(20,210,xx,3,16);//显示数字

}

LCD_ShowNum(65,210,yy,3,16);

LCD_DrawRectangle(10, 10, 210, 150);//画矩形

LCD_DrawPoint(xp,yp);//画点

if((xp!=xp1 | yp!=yp1)&&DrawLine_flag==1)

} {

} LCD_DrawLine(xp1, yp1, xp, yp);ShowChinese(10,170);//显示汉字

//定时器5通道1和通道2输入捕获配置 TIM_ICInitTypeDef TIM5_ICInitStructure;

void TIM5_Cap_Init(u16 arr,u16 psc){

GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能GPIOA时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);//使能TIM5时

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;//PA0 清除

之前设置

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//PA0 下拉输入 GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1);

//初始化定时器时基参数 TIM5 TIM_TimeBaseStructure.TIM_Period = arr;//设定计数器自动重装值 TIM_TimeBaseStructure.TIM_Prescaler =psc;

//预分频器

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上计数模式 TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);

//

据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

//初始化TIM5输入捕获1参数

TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1;//CC1S=01 选择输入端 IC1映射到TI1上 TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿捕获 TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//映射到TI1上 TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//配置输入分频,不分频 TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波

TIM_ICInit(TIM5, &TIM5_ICInitStructure);

//初始化TIM5输入捕获2参数

TIM5_ICInitStructure.TIM_Channel = TIM_Channel_2;//CC1S=01 选择输入端 IC1映射到TI1上 TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿捕获 TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//映射到TI1上 TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//配置输入分频,不分频 TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波

TIM_ICInit(TIM5, &TIM5_ICInitStructure);

//中断分组初始化

NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;//TIM5中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//先占优先级2级

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//从优先级0级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道被使能 NVIC_Init(&NVIC_InitStructure);//根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1|TIM_IT_CC2,ENABLE);//允许更新中断 ,允许CC1IE捕获中断

//TIM_IT_CC1:TIM捕获/比较1中断源

TIM_Cmd(TIM5,ENABLE);//使能定时器5 }

u8 TIM5CH1_CAPTURE_STA=0;//输入捕获状态

u16 TIM5CH1_CAPTURE_VAL;//输入捕获值

u8 TIM5CH2_CAPTURE_STA=0;//输入捕获状态 u16 TIM5CH2_CAPTURE_VAL;//输入捕获值

//定时器5中断服务程序

void TIM5_IRQHandler(void){ //通道1进行捕获

if((TIM5CH1_CAPTURE_STA&0X80)==0)//表示还未成功完成捕获

{ if(TIM_GetITStatus(TIM5, TIM_IT_Update)!= RESET)//表示更新中断已经发生

{

} if(TIM_GetITStatus(TIM5, TIM_IT_CC1)!= RESET)//表示捕获1发if(TIM5CH1_CAPTURE_STA&0X40)//表示已经捕获到高电平了 {

if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//判断高电平太长了 {

} else TIM5CH1_CAPTURE_STA++;TIM5CH1_CAPTURE_STA|=0X80;//强制标记成功捕获了一次 TIM5CH1_CAPTURE_VAL=0XFFFF;}

生捕获事件

{ if(TIM5CH1_CAPTURE_STA&0X40)//表示捕获到一个下降沿

{

//标记成功捕获了一次 TIM5CH1_CAPTURE_STA|=0X80;

TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);//得到高电平的值 TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising);//CC1P=0 设置为上升沿捕获

} else {

TIM5CH1_CAPTURE_STA=0;TIM5CH1_CAPTURE_VAL=0;TIM_SetCounter(TIM5,0);TIM5CH1_CAPTURE_STA|=0X40;

//标记捕获到了上升沿

//清空

//还未开始,第一次捕获上升沿

TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);//CC1P=1 设置为下降沿捕获

}

}

}

//通道2进行捕获

if((TIM5CH2_CAPTURE_STA&0X80)==0)//表示还未成功完成捕获

{ if(TIM_GetITStatus(TIM5, TIM_IT_Update)!= RESET)//表示更新中断已经发生

{

if(TIM5CH2_CAPTURE_STA&0X40)//表示已经捕获到高电平了 { if((TIM5CH2_CAPTURE_STA&0X3F)==0X3F)//判断高电平太长了

}

{

} else TIM5CH2_CAPTURE_STA++;TIM5CH2_CAPTURE_STA|=0X80;//强制标记成功捕获了一次 TIM5CH2_CAPTURE_VAL=0XFFFF;}

if(TIM_GetITStatus(TIM5, TIM_IT_CC2)!= RESET)//表示捕获1发生捕获事件

{

{

//标记成功捕获了一次 if(TIM5CH2_CAPTURE_STA&0X40)

//表示捕获到一个下降沿

TIM5CH2_CAPTURE_STA|=0X80;

TIM5CH2_CAPTURE_VAL=TIM_GetCapture2(TIM5);//得到高电平的值 TIM_OC2PolarityConfig(TIM5,TIM_ICPolarity_Rising);//CC1P=0 设置为上升沿捕获

} else {

TIM5CH2_CAPTURE_STA=0;TIM5CH2_CAPTURE_VAL=0;TIM_SetCounter(TIM5,0);TIM5CH2_CAPTURE_STA|=0X40;

//标记捕获到了上升沿

//清空

//还未开始,第一次捕获上升沿

TIM_OC2PolarityConfig(TIM5,TIM_ICPolarity_Falling);//CC1P=1 设置为下降沿捕获

} }

}

TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_CC2|TIM_IT_Update);//清除中断标志位

}

声音定位系统 篇2

2012年XXXX电子小组练习竞赛

声音定位系统 【XX小组】

【金明小组】。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.1

一、系统方案。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.4 1.声音信号产生的选择。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.4 2.声源的选择。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.4 3.滤波方案的选择。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.5

二、理论分析与计算。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.5 1.声响模块分析、计算。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.5 2.声音接收放大器分析、计算。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.5 3.数据处理原理分析、计算。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.6

三、电路与程序设计。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.6 1.声响模块电路设计。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.6 2.声音接收放大器电路设计。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.7 3.测量、数据处理电路设计。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.7 4.程序设计及其流程图。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.9

四、测试方案与测试结果。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.12 1.测试方法与仪器。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.12

2、测试结果分析。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。12

摘要:本系统是用ATMEGA16单片机产生频率为500Hz的方波信号,该信号用三极管8550进行放大及驱动后输入到蜂鸣器作为声源。接收部分使用拾音器进行接收,首先对接收的信号经过单管放大,使变化的电流信号转换为变化的电压信号。然后经过由LM358组成的带通滤波器,该滤波器的中心频率为500Hz,带宽为50Hz,增益为10倍,去除周围环境的声波,滤波后的信号正好是蜂鸣器发出的声音信号。再对此级信号经过LM339N比较器,可以把滤波后的正弦波转换为方波,以便单片机ATMEGA16进行检测。声源定位是通过对三个麦克接收到信号的时间先后进行处理,经过一套比较完善的算法可得声源的坐标,即可进行声源定位。然后经过后级的更精确的算法,当声源移动时,可实时检测到声源坐标。

关键词:500Hz 声音定位 ATMEGA16

一、系统方案

1、声音信号产生的选择

方案一:采用NE555产生频率为500Hz的方波用来作为声音信号。它的作用是用内部的定时器来构成时基电路。外部通过简单的电路可获得所得的信号。该电路搭建比较简单,原理易于理解,电路中元器件参数也比较好计算。

方案二:用单片机ATMEGA16来产生频率为500Hz的方波用来作为声音信号。方波信号的产生实质上是在定时器溢出中断次数达到规定次数时,将输出I/O管脚的状态取反。该程序比较容易实现,且不会占用单片机太多资源。

方案比较:方案一中,用NE555产生信源不是很稳定,波形不太规范且信号的频率不固定,这样的信号对本系统不太合适。方案二中,用软件来产生信号,该信号很稳定,是比较标准的频率为500Hz的方波信号,而且,产生波形比较灵活,从而为发挥部分做好准备。因此选择方案二。

2、声源的选择

方案一:采用低音扬声器作为声源。扬声器是一种把电信号转变为声信号的换能器件。将单片机产生的频率为500Hz的信号接在扬声器的接收端,扬声器能发出强度比较大的声音信号。

方案二:采用无源蜂鸣器作为声源。无源蜂鸣器在提供一定频率的方波震荡源时,能够发出声音。试验中用无源蜂鸣器发声时,声音比较清晰,但声音强度比扬声器稍弱。

方案比较:两种器件发出的声音都能被接收端检测出来。方案一中,扬声器声音范围广能过很好的往四面八方传输,同时有利于三个角落里的麦克风采集信号。方案二中,蜂鸣器消耗的功率控制在200mW以内时,发出的声音强度比扬声器弱,并且其声音尖锐刺耳不利于在实验室调试。因此选择方案一++-·。

3、滤波方案的选择

方案一:用RC无源滤波器。通过计算可以较方便的通过匹配电阻电容得出所需要的通频带。该滤波电路抗干扰性较强,有较好的低频特性,并且选用标准的阻容元件易得。

方案二:用有源滤波器。有源滤波器是利用可关断电力电子器件,产生与负荷电流中谐波分量大小相等、相位相反地电流来抵消谐波的滤波装置。有源滤波器除了滤除谐波外,同时还可以动态补偿无功功率。其优点是反映动作迅速,滤除谐波可达到95%以上,补偿无功细致。

方案比较:方案一中,谐波滤除率一般只有80%,对基波的无功补偿也是一定的,并且通频带比计算出的要宽,不太符合设计要求。方案二中,电路比较复杂,但通过匹配后能较好的完成带通滤波,能达到预期的要求。因此选择多路负反馈二阶有源带通滤波器,即方案二。

二、理论分析与计算

1、声响模块分析、计算

声响模块是由蜂鸣器产生生源信号。该单独的声源模块供电电压为5V,经过测量后电路中的电流在35mA左右。功率计算公式: P=U*I;

经计算声源模块的功耗约为175mW左右,该系统要求的声响模块功率低于200mW,所以经过该计算本设计符合设计标准。

2、声音接收放大器分析、计算

声音接收电路中在进行带通滤波的同时对接收到的信号进行了放大。带通滤波的中心频率为500Hz。相关参数的计算:

Req=R13//R16=R13*R16/(R13+R16)=31.8*1.68*1000/(31.8+1.68)=1.6K;

fc= 1/(2*π*错误!未找到引用源。)

=10^8/(2*3.14*错误!未找到引用源。)=497.6Hz; Q=fc/BW=1/2*(R3/Req)1/2=9.97 3.数据处理原理分析、计算

数据处理部分是将信号通过比较器进行处理。信号经过带通滤波后,其幅值可达到3.8V左右,而没有信号时噪声信号幅值比较小。声源信号经过比较器后可以被检测出来,比较器端输出3.3V的高电平,当没接收到有用信号时,比较器端输出0V低电平。再将这种信号输入到单片机中进行处理,很方便的能判断是否检测到有用声源信号。比较器是由LM339构成,在运放的同向端经过10K滑线变阻器分压,进行阈值设定,反相端输入滤波后的信号,输出端则会输出3.3V或0V的方波信号。

三、电路与程序设计

1、声响模块电路设计

声响模块是由C8051F310单片机输出频率为500Hz的方波,然后从单片机引脚输出,输出的信号经过三极管后放大后,再接入到蜂鸣器。此时蜂鸣器的输出电流为35mA左右,供电电源为5V,发声模块的功率低于200mW,符合本题的要求。

2、声音接收放大器电路设计

接收部分是用拾音器接收声音信号。由于拾音器接收到的信号在不经过

放大时信号很小,不易检测,故后级利用单管放大将接收的信号进行处理,电路中通过RC可以把集电极电流的变化转换成电压的变化送到输出端。

3、测量、数据处理电路设计

根据要求只有当接收到的信号为500Hz时,我们才能保证接收到的信号是由声源发出的。而拾音器接收到的声音信号是任意频率的,故此处要进行滤波处理。滤波采用的是带通滤波器,通过电容电阻的匹配,最终滤波器的中心频率为500Hz,带宽为50Hz。拾音器接收到的信号经过带通滤波器后,能够将生源发出的信号滤出,正符合本题要求。

滤波后的信号为正弦波,但该信号不便于用单片机进行处理,故在后级加入了一级LM393比较器。其基本功能是对两个输入电压进行比较,并根据比较结果输出高电平或低电平。并由此来判断输入信号的大小和极性。从滤波器中输出的信号的幅值为1V以上,故将比较器的比较端给的比较电压设定为500mV左右,这样当输出的信号是频率为500Hz的方波,幅值为3.3V,能够用单片机进行检测,效果比较满意。

4、程序设计及其流程图 4.1程序设计思想:

设坐标纸为图中的矩形ABCD。声源在点O,拾音器分别位于矩形四角A、B、C、D。声源到A点的距离为Da,到B点的距离为Db,到C点的距离为Dc,到D点的距离为Dd。分别经过时间Ta,Tb,Tc,Td后,拾音器A、B、C、D接收到信号,然后可以计算出三个时间差值t1,t2,t3,声音传播速度为v。通过下列算法后可计算出声源O的坐标值(x,y):

4.1.1定位算法一:

错误!未找到引用源。(1)

错误!未找到引用源。(2)

错误!未找到引用源。(3)

错误!未找到引用源。(4)

单片机检测到的为四个时间点算出三个时间差,上面四个式子可用时间差表示出 错误!未找到引用源。

错误!未找到引用源。;(5)

错误!未找到引用源。;(6)

错误!未找到引用源。;(7)

错误!未找到引用源。;(8)

解出:

错误!未找到引用源。;

错误!未找到引用源。;

错误!未找到引用源。;

错误!未找到引用源。;

错误!未找到引用源。;

错误!未找到引用源。;

上式总共两个未知数四个等式,可以根据任意三个式子解出一组解,总共会有两组解。由于测出的结果会有误差,所以将所得的两组解进行平均值求解,则结果误差会减小,准确度会进一步提高。该算法程序比较简短,适合用单片机处理。

4.1.2定位算法二:

错误!未找到引用源。(1)

错误!未找到引用源。(2)f1(x,y)=错误!未找到引用源。=0(3)f2(x,y)=错误!未找到引用源。=0(4)然后对(3)(4)分别对x,y求一介微分: f1x(x,y)=错误!未找到引用源。;

f1y(x,y)=错误!未找到引用源。;

f2x(x,y)=错误!未找到引用源。; f2y(x,y)=错误!未找到引用源。;

然后将f1(x,y),f2(x,y)进行泰勒级数展开,则可得出递推公式: Xk+1=Xk+错误!未找到引用源。; Yk+1=Yk+错误!未找到引用源。;

经过递推后可得出比较准确的O(x,y)的坐标,程序比较大,适合在PC机上运行,准确度比较高。

4.2程序流程图:

主程序流程图:

中断程序流程图:

四、测试方案与测试结果

1、测试方法与仪器

声源定位测试方法:将声源放在坐标纸上的任意坐标,不让声源发声,记下坐标值(x0,y0)。然后启动声源,让声源发出1s左右的声音信号,同时单片机接收信号后开始进行计算,计算出的坐标值(x1,y1)通过LCD显示频显示出来。

2、测试结果分析

测试结果与实际存在一定的误差,因声速会随外界环境的不同而不同,如温度介质等。在整个系统运算中我们所用的声速为340m/s,这样计算出来的结果与实际值之间不可避免的产生了误差,但这种误差是允许存在的,且对结果不会产生很大的影响。经测试最终能够满足基本部分和发挥部分的要求。

声音定位系统设计报告 篇3

参赛学生:王学庆 宋辉指导教师:段英宏 学校: 天津科技大学 院系: 电信学院

尚翰

声音定位系统设计与总结报告

摘要:

本文描述了声音定位系统的设计原理和实现方法。该系统由XS128单片机控制,利用555电路产生500HZ电平信号。主控制器利用不同声音接收器间产生的误差信号,并通过合适的算法定位其运动。系统最大特点在于软件设计采用层次化、模块化的设计方法,使得复杂数学模型和控制算法得以简化和快速开发。经调试和测试,系统各项性能参数已基本达到设计指标。且本系统在设计中注意低功耗处理和力求高性价比等细节。关键词:

声音定位 SX128单片机 555电路 算法

Abstract

This paper describes the sound positioning system design principle and method of the system XS128 single-chip microcomputer control, use 555 HZ level signal circuitry 500 main controller using different voices in the generation between receiver the error signals, and through the appropriate algorithm positioning their movement system lies with the software design by the greatest feature hierarchical modular design method, make complex mathematical model and control algorithm to simplify and rapid development by commissioning and testing, the system has basically achieve their performance parameters and the system design index in the design process and low power consumption attention to details such as high performance.

一、系统方案

1.方案比较与论证(1)处理器的选择

方案一:采用51 单片机控制。其优点是价格便宜,应用广泛,资料比较容易搜集。但是功能较弱,不适于复杂的系统控制。方案二:采用飞思卡尔公司的XS128 单片机。XS128是高性能、低功耗的16 位微处理器,功能强大,IO 端口数量多,有丰富的定时器计数器以及中断接口,集成有可工作于主机/从机模式的SPI 串行接口,并且支持JTAG 在线调试,使用方便。

考虑到XS128单片机功能强大和使用熟练程度比较高,并且数据计算要求较高,所以选用方案二,(2)声源以及声音检测器的选择

方案一: 采用蜂鸣器等发声器件作为声源,使用放大电路连接LM567 集成音频选频芯片所组成的具有选频功能的声音开关电路检测出蜂鸣器的固有频率信号。由于加入了音频选频,抗干扰能力强,能很轻松地滤除杂声干扰,检测到给定频率的声音信号。

方案二:采用蜂鸣器等发声器件作为声源,用MIC、三极管放大电路和比较器等器件组成的简单声音开关电路检测声源的音频信号,由于比较器的滤除一大部分杂音干扰,可在环境干扰较少的情况下使用。优点:设计原理简单,可360°多方位检测。缺点:受环境杂声干扰较大,需要环境较为安静。若加入选频和滤波电路,会增加系统的复

二、理论设计与论证

1.设计任务

本声音定位系统要求设计并制作一声音定位系统,示意图如图1 所示。

图中,声音定位系统有一个可移动声源S,三个声音接收器A、B 和C,声音接收

器之间可以有线连接。声音接收器能利用可移动声源和接收器之间的不同距离,产生一个可移动声源离各个接收器的误差信号。

可移动声源运动的起始点必须在坐标纸内,位置可以任意指定。

555延时电路

555信号发生电路

2.声音接收放大器电路设计

声音接收模块采用驻极体话筒作为声电转换原件。驻极体话筒输出端是内部场效应管的漏极D和源极S,此电路采用漏极输出的连接方式,故在漏极D与电源正极之间须接入电阻R3。通过单电源供电的同向

以A为原点,则声源S坐标为(xs,ys),利用式(1)如何求出xs、ys的值呢?这里根据各点位置关系列出方程,以mm为单位:(ZB + △A)=xs2+ ys2 ZB2=(xs-1000)2+ys2

(ZB+△C)2=xs2+(ys-1000)2(2)式(2)中,△A和△C为已知,ZB、xs和 ys为未知 数,解此方程组,得到以ZB为变量的一元二次方程: a*ZB + b*ZB + c=0(3)式中:

a=4*(△A2+(△A-△C)2-106)b=4*[△A2+(△A —△C)*(△A2 一△C2 +106)一△A×106 ] c=(△A2+ 106)2 +(△A2 一△C2 + 106)2 一4*△A2 *106 则ZB =(-b-sqrt(b2-4*a*c))/(2*a)(4)代人式(2),则

Xs=(2*△A *ZB + △A2 + 106)/2000 Ys =((2×△A一2*△C)*ZB+△A2-△C2+106)/2000(5)这样就可根据接收器A和c的接收时间差,计算 出声源位置坐标(xs,ys).当移动声源移动到位于AF 线以上位置时,计算时把上式中ZB作为ZC即可,求 出3:

5、ys值后,则声源位置坐标为(ys,).

2-10

四、测试方案与测试结果

赛场建立坐标系,A点作为坐标原点,AB为X轴、AC为Y轴,米为坐标单位。以随机的方式放置声源的初始位置。分别将基本部分和发挥部分的测试结果记录在表1和表2中。

表1 基本要求部分测试结果

次数

放置位置

测量位置

(126,175)

(131,166)

(256,132)

(251,115)

(326,89)

(306,55)

五、参考文献

[1]全国大学生电子设计竞赛组委会。全国大学生电子设计竞赛获奖作品选编[M] .北京理 工大学出版社,2007 [2]黄开胜。学做智能车——挑战“飞思卡尔”杯[M] .北京航天航空大学出版社,2007 [3]万福君,潘松峰.单片微机原理系统设计及应用[M] .合肥:中国科学技术大学出版社,2001 [4](日)森政弘,(日)铃木泰博.机器人竞赛指南[M] .北京:科学出版社,2002 [5] 王灏,毛宗源.机器人的智能控制方法[M] .北京:国际工业出版社,2002

一键复制全文保存为WORD