声音引导系统毕业论文.doc
声音导引系统摘要: 该声音引导系统采用高性能、低功耗的AVR系列8位ATmega8单片机和ATmega16组成核心控制单元,可成功实现误差信号产生、可移动声源的定位及移动,并附有声光提示、LCD显示、语音播报等功能。位于接收器上的声音接收模块接收声波,通过时差计算确定路径后通过无线模块将数据传至声源,利用电机控制芯片ASSP(型号MMC-1)实现可移动声源的运动。该系统性能稳定,电源模块、主控模块等的设计使系统整体具有功耗低、性价比高的特点。关键词:声音引导系统;无线通信;性价比;声音接收Abstract: The sound-guided system is designed to have 8-bit ATmega 8 and ATmega 16 single-chips as the core control units which are high-powered and have low power consumption. This system has the ability of error signal generating 、positioning and movement of mobile Source, apart from acoustic optical alert、LCD display and Text To Speech. Sonic waves are received by the sound receiver, after computing delta-T, the data will be transmitted to sound source by the wireless module, and the path can be decided now. The Mobile Source can move under the control of Electrical Machine Control ASSP chip (MMC-1 chip). This system has steady performance over life, it is also cost-effective and has low power consumption, owing to the designation of power supply module and main control module. Key Words: sound-guided system 、wireless communications 、cost-effective 、sound receiving一 方案设计与论证 1.1 车体的选择 通常的运动方法有轮式和履带驱动式两种,其选择依赖于路面状况、机械复杂性和控制复杂性。方案一:采用普通三轮车或者四轮车优点为体积小,摩擦力小,在相同牵引力下速度快,但不易控制,由于车体承载能力不强,在承受一定负重后会明显影响车速并且转向不稳。方案二:采用履带式结构特点:两个电机分别驱动两条履带。优点是可以在原地转动,可负重较大时不会明显影响车的性能;在不平的路面上性能稳定,摩擦力很大,牵引力大。缺点为只有在加大功率情况下才能保证车速不会太慢、能量损耗大,机械结构复杂。在实际应用中,车体运动的范围小(不大于2m),且需要车行进缓慢以便定位。三轮或普通的四轮车通常摩擦力小于履带车,综合考虑选择方案二。1.2 电源选择方案方案一: 采用开关电源开关电源是通过调节开关的导通时间来调节电压有效值,通过滤波电路来输出平稳的电压。开关电源的输出功率大,效率高,都在65%以上,可以达到93%,功率体积有3-6 。方案二: 采用线性稳压电源线性稳压电源一般小巧灵活,成本低,在小功率时输出稳定。它的体积小,功率体积只有0.5-2 。但线性稳压的输出功率较低,电流或压差较大时一般低于35%。 考虑到电源的功率和整体的性价比,选择方案一。1.3 主控制器芯片的选择方案一:采用FPGA为系统的控制器,FPGA可以实现各种复杂的逻辑功能,模块大,密度高,它将所有器件集成在一块芯片上,减少了体积,提高了稳定性,并易于进行功能控制,适合作为大规模实时系统的控制核心。由于其集成度高,使其成本高,同时由于芯片的引脚较多,实物硬件电路板布线复杂,加重了电路设计和实际焊接的工作。方案二:51系列单片机。特点为价格低廉,技术成熟,应用广泛。但相对于AVR等系列单片机,功耗较高,片内中断/flash等资源不足,运算速度较慢。方案三:AVR系列单片机。其主要特点为高性能、低功耗,资源丰富,并且支持高级语言编程,在运行速度,内存容量,内部功能模块集成化等诸多方面比51系列优越,。正常模式下(1MHz,3v),功耗为仅为1.1mA,掉电模式下甚至不足1uA,功耗远低于51系列单片机。综合题目,考虑到功耗、性价比和运算能力,选用方案三,为进一步提高性价比,选择用ATmega16和ATmega8协同工作。二 理论分析与计算1mCDO1mAOByxS图1系统平面示意图图将可移动声源放置于ox右侧任意点S,当声源发声时,A、B、C三点会根据S点的位置按一定先后顺序收到声音信号,设A接收器和B接收器接收的时间差为,A和C之间接收的时间差为,设S的初始坐标为(x,y),则方程为:带入OA,OB,OC得: Matlab编程解得:y=-1/2*(-b-a/(4*a2-4+4*b2)*(-4*a*b-4*a2*b2+4*a3*b+4*a2-4+4*b2-4*(b6 +4*b4*a2-2*a3*b3-2*a*b5+a4*b2+2*b2-3*a2*b2+2*a*b3-3*b4-a4*b4-b6*a2+2*a3*b5)(1/2)+a+a2*b-b2*a)/bx=1/2/(4*a2-4+4*b2)*(-4*a*b-4*a2*b2+4*a3*b+4*a2-4+4*b2-4*(b6+4*b4*a2-2*a3*b3-2*a*b5+a4*b2+2*b2-3*a2*b2+2*a*b3-3*b4-a4*b4-b6*a2+2*a3*b5)(1/2)三 硬件电路设计及实现该声音引导系统可分为核心控制模块、电源管理模块、电机驱动模块、LCD显示、键盘输入模块、语音播放模块、无线通信模块、声音接收模块、声波整形放大滤波模块等构成。系统框图如图2所示。3.1 主控模块考虑到系统整体的性价比和功耗,采用低功耗单片机ATmega8和ATmega16协同工作。由于大部分的计算过程是在接收器的主控芯片上进行,而移动声源上主控芯片不参与定位运算,因此在移动声源上使用ATmega8,在接收器上使用ATmega16,尽最大可能提高性价比。3.2 电机驱动模块采用电机控制ASSP 芯片MMC-1控制直流电机,输出PWM波,传输到L298,驱动直流电机运动。L298驱动电路如3。NRF2401接收器C语音播报ATmega8NRF2401声波整形放大滤波声音接收模块接收器A声音接收模块声音接收模块声波整形放大滤波声波整形放大滤波声源天线天线图2 系统框图接收器BATmega16电机驱动液晶显示图3 L298驱动原理图3.3 声波整形放大滤波模块采用LM358实现声波的放大。LM358 内部包括有两个独立的、高增益、内部频率补偿的双运算放大器。该声音放大模块采用单向MIC。具体电路图如图4。3.4无线通信模块系统中采用NRF2401无线通信模块来实现主控模块与键盘输入、液晶显示模块之间的无线通信。将移动声源的坐标等数据传至主控模块,同时也将键盘输入的命令传至主控模块。NRF2401模块与Atmeaga16和Atmeaga8之间为SPI总线连接。 图4 声波放大整形原理图四 软件系统设计及实现通过控制键盘输入来实现系统的不同功能,若选择不同的操作,则进行相应的指令。首先声源发出音频信号,三个器根据所接收到信号的时差求出声源的信号,避免了两个系统间的同步时差,消除了系统的静态误差。通过无线传输给声源,声源收到数据后沿x轴行驶至ox直线。主程序流程图和误差信号记算流程图如图5、6所示。五 系统特点及创新功能1、开关电源的使用。相对于线性电源,开关电源的输出功率大,效率高,效率在65%以上,可以达到93%。2、ATmega16和ATmega8的协同工作。AVR系列单片机具有低功耗、高性能、高性价比的优点。正常模式下(1Mhhz,3v),功耗仅为1.1mA,本系统在选择芯片时将资源相对较少的ATmega8用作移动声源部分的主控芯片,进一步提高了性价比。3、语音播放功能的运用使系统更加人性化。六 测试结果分析与总结测试仪器:示波器,频率计,秒表,卷尺,数字万用表,我们也采用了蓝天工作室制作的示波器,具体材料驱动是 可以下载到。测试数据如表1。x为声源的实际横坐标,x为测量值于实际值的误差值,m为声源运动后停止点的横坐标,如表一所示。测试结果分析:由于测试所得到的x坐标精确,y坐标精度不够,误差在1cm内,由于行至ox线的原理是使声源沿x轴行进,因此此部分在误差范围内实现。发送相应命令到小车等待小车行驶结束发送坐标到小车计算小车坐标语音播放小车情况显示菜单等待按键信号开始光标上移光标下移输入子菜单图5主程序流程图开始等待命令发出声音信号等待小车坐标信号发出结束提示按命令要求行使图6 误差信号计算流程图次数xxtm1600.6150.32700.92.3513801.03.550.64903.05.951.4表1 测试数据误差分析:由于使用直流电机,而且是根据电机转动时间来确定所走路程,小车速度因电量和承载不同,因而产生一定误差。总结:我们在整个设计制作过程中,始终关注系统的性能指标和运行的稳定性,本着稳定性和精确性并重的原则,我们采取了诸多的有效措施,完成了设计题目所规定的要求,但在精度上还需改进。参考文献1 谭永宏,张辉. 智能寻迹小车的研究与设计J. 微计算机信息,2008(3-2):310-312. 2 韩东波,曹兵,葛良全等. 基于SPCE061A的语音控制智能小车设计J.计算机测量与控制,2007.15(9):1183-1185.附录一:元件清单元件个数ATmega161ATmega81L2981扬声器2NEC芯片1音频解码模块112864液晶显示屏174LS041LED数码管若干电阻、电容、电感等若干附录二:部分程序/主函数部分#include <avr/io.h>#include <avr/delay.h>#include "electromotor.h"#include "NRF2401.h"#include <avr/interrupt.h>#include "delay.c"volatile unsigned int LEFT,RIGHT;unsigned char STOP;void Interrupt_Init(void)MCUCR|=(0x01<<2)|(0x01<<0);GICR|=(0x01<<7)|(0x01<<6);void main(void)unsigned char temp;unsigned int i;unsigned int time;double x,y;RIGHT=0;LEFT=0;cli();UART_Init();Init_NRF2401();x=85;x=x-50;x=x*10;time=x*9;Elec_On();Run_Left(1,170);/250 180 164Run_Right(1,172);/230 190 165for(i=1;i<time;i+)_delay_ms(1);Stop_Right();Stop_Left();DDRB|=(0x01<<5);PORTB|=(0x01<<5);_delay_ms(30);_delay_ms(30);PORTB&=(0x01<<5);while(1)RXEN_HIGH();Wait_Receive();NRF2401_Receive();DDRB|=(0x01<<5);PORTB|=(0x01<<5);_delay_ms(30);_delay_ms(30);PORTB&=(0x01<<5);Wait_Receive();NRF2401_Receive();_delay_ms(30);_delay_ms(30);DDRB|=(0x01<<5);PORTB|=(0x01<<5);_delay_ms(30);_delay_ms(30);PORTB&=(0x01<<5);if(RECEIVEDATA0=0x01)x=RECEIVEDATA2+RECEIVEDATA3/100-50;x=x*10*9;time=x;Elec_On();Run_Left(1,170);/250 180 164Run_Right(1,172);/230 190 165for(i=1;i<time;i+)_delay_ms(1);Stop_Right();Stop_Left();TXEN_LOW(); SENDDATA0=0x53; /接受通道1地址 1401060105SENDDATA1=0x82;SENDDATA2=0x7b;SENDDATA3=0x09;SENDDATA4=0x01;SENDDATA5=0x01;SENDDATA6=0x01;SENDDATA7=0x01;NRF2401_Send();asm volatile("sei");RXEN_HIGH();Wait_Receive();NRF2401_Receive();while(STOP!=1)if(RIGHT>LEFT)Run_Right(1, 185);elseRun_Right(1, 190);while(1)if(LEFT=68)DDRB=0xff;PORTB=0xff;/*右电机计数*/ISR(INT0_vect)RIGHT+;if(RIGHT=460) ; /463 46PORTB=PORTB;if(RIGHT=800)Stop_Right ();Stop_Left ();RIGHT=0;LEFT=0;STOP=1; /*左电机计数*/ISR(INT1_vect)LEFT+; /*防止未定义中断复位*/ISR(_vector_default);/电机驱动部分#include <avr/io.h>#include <avr/delay.h>void UART_Init (void)UCSRA=0x02;UCSRB=0x18;UCSRC=0xB6;/86UBRRH=0x00;UBRRL=103;void UART_Sent (unsigned char addr, unsigned char data) unsigned char temp,i;temp=0x50+(addr&0x0f);UDR=temp;_delay_ms(1.11); UDR=data;void Elec_On (void)unsigned char temp;temp=0;temp=(0x01<<6)|(0x01<<7)|(0x01<<5);UART_Sent(0x00, temp);_delay_ms(2);UART_Sent(0x04, temp);_delay_ms(2);void Run_Left (unsigned char f_b, unsigned char speech)unsigned char temp;temp=0;if(f_b=1)temp=(0x01<<6)|(0x01<<7)|(0x01<<5);UART_Sent(0x04, temp);_delay_ms(2);temp=speech;UART_Sent(0x07, temp);_delay_ms(2);elsetemp=(0x01<<6)|(0x01<<7);UART_Sent(0x04, temp);_delay_ms(2);temp=255-speech;UART_Sent(0x07, temp);_delay_ms(2);void Run_Right (unsigned char f_b, unsigned char speech)unsigned char temp;temp=0;if(f_b=1)temp=(0x01<<6)|(0x01<<7)|(0x01<<5);UART_Sent(0x00, temp);_delay_ms(2);temp=speech;UART_Sent(0x03, temp);_delay_ms(2);elsetemp=(0x01<<6)|(0x01<<7);UART_Sent(0x00, temp);_delay_ms(2);temp=255-speech;UART_Sent(0x03, temp);_delay_ms(2);void Stop_Right (void)UART_Sent(0x00, 0x00);_delay_ms(2);UART_Sent(0x03, 0x00);_delay_ms(2);void Stop_Left (void)UART_Sent(0x04, 0x00);_delay_ms(2);UART_Sent(0x07, 0x00);_delay_ms(2);/控制板主函数#include <avr/io.h>#include <avr/delay.h>#include <avr/interrupt.h>#include <math.h>#include "128.h"#include "check_key.h"#include "menu.h"#include "NRF2401.h"#define V 340const unsigned char tabl2=" 声音引导系统 "" 2.反向到达OX轴"" 1.到达OX轴 "" 3.到达中点 " ;double X,Y;double T1,T2,T3;double TT1,TT2;unsigned char num= '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ;volatile unsigned char P;void AVR_Init (void)MCUCR|=0x0b;MCUCR&=(0x01<<2);/MCUCSR|=0x01<<6;MCUCSR&=(0x01<<6);/GICR|=(0x01<<7)|(0x01<<6)|(0x01<<5);void Coordinate_X1 (double a, double b)double x;x=-3*a*a-2*b*pow(a,3)+2*pow(b,3)*pow(a,3)-pow(a,4)*b*b+2+pow(a,4)-3*b*b+pow(b,4)-2*pow(b,3)*a+2*b*a-pow(b,4)*a*a+4*a*a*b*b;x=pow(x,0.5);x=-4*pow(b,3)+8*a*b*b-4*a+4*pow(a,3)+4*b+4*x;X=0.5-0.5/(4*b*b+4*a*a-4)*x*b+b*a-0.5*b*b;void Coordinate_X2 (double a, double b)double x;x=-3*a*a-2*b*pow(a,3)+2*pow(b,3)*pow(a,3)-pow(a,4)*b*b+2+pow(a,4)-3*b*b+pow(b,4)-2*pow(b,3)*a+2*b*a-pow(b,4)*a*a+4*a*a*b*b;x=pow(x,0.5);x=-4*pow(b,3)+8*a*b*b-4*a+4*pow(a,3)+4*b-4*x;X=0.5-0.5/(4*b*b+4*a*a-4)*x*b+b*a-0.5*b*b;void Coordinate_Y1 (double a, double b)double y;y=-3*a*a-2*b*pow(a,3)+2*pow(b,3)*pow(a,3)-pow(a,4)*b*b+2+pow(a,4)-3*b*b+pow(b,4)-2*pow(b,3)*a+2*b*a-pow(b,4)*a*a+4*a*a*b*b;y=pow(y,0.5);y=-4*pow(b,3)+8*a*b*b-4*a+4*pow(a,3)+4*b+4*y;Y=0.5-0.5/(4*b*b+4*a*a-4)*y*a+0.5*a*a;void Coordinate_Y2 (double a, double b)double y;y=-3*a*a-2*b*pow(a,3)+2*pow(b,3)*pow(a,3)-pow(a,4)*b*b+2+pow(a,4)-3*b*b+pow(b,4)-2*pow(b,3)*a+2*b*a-pow(b,4)*a*a+4*a*a*b*b;y=pow(y,0.5);y=-4*pow(b,3)+8*a*b*b-4*a+4*pow(a,3)+4*b-4*y;Y=0.5-0.5/(4*b*b+4*a*a-4)*y*a+0.5*a*a;void Coordinate (double t1, double t2)unsigned char i;double a,b;a=V*t1;b=V*t2;/a=-0.414;/b=-0.414;Coordinate_X2 (a, b);if(X<0.5)Coordinate_X1 (a, b);if(a<=0)Coordinate_Y2 (a, b);if(Y<0.5)Coordinate_Y1 (a, b);elseCoordinate_Y1 (a, b);if(Y>0.5)Coordinate_Y2 (a, b);void Time_Init(void)TCCR1A=0x00;TCCR1B|=(0x01<<3)|(0x01<<1);OCR1A=0xc350;TCNT1=0x00;/TIMSK|=(0x01<<4);void Menu_0(unsigned char pin)unsigned char i,j;double x1,y1;TXEN_LOW(); SENDDATA0=0x53; /接受通道1地址 1401060105SENDDATA1=0x82;SENDDATA2=0x7b;SENDDATA3=0x09;SENDDATA4=0x01;SENDDATA5=0x01;SENDDATA6=0x01;SENDDATA7=0x01;NRF2401_Send();GICR|=(0x01<<7)|(0x01<<6)|(0x01<<5);while(GICR&0xe0)!=0)LCD_WR (comm,0x30);LCD_WR (comm,0x80); LCD_WR(dat,numP);T1=62;T2=800;TT1=T1-T2;TT1=-738;TT1=TT1/100;TT1=TT1/100;TT1=TT1/100;T3=460;T2=800;TT2=T3-T2;TT2=-340;TT2=TT2/100;TT2=TT2/100;TT2=TT2/100;TT1=-0.000738;TT2=-0.000340;Coordinate (TT1, TT2);clrram ();x1=X;y1=Y;LCD_WR (comm,0x30);LCD_WR (comm,0x80); i=X;LCD_WR(dat,numi);X=X-i;X=X*10;i=X;LCD_WR(dat,numi);X=X-i;X=X*10;i=X;LCD_WR(dat,numi);X=X-i;X=X*10;i=X;LCD_WR(dat,numi);X=X-i;X=X*10;i=X;LCD_WR(dat,numi);LCD_WR (comm,0x30);LCD_WR (comm,0x90);i=Y;LCD_WR(dat,numi);Y=Y-i;Y=Y*10;i=Y;LCD_WR(dat,numi);Y=Y-i;Y=Y*10;i=Y;LCD_WR(dat,numi);Y=Y-i;Y=Y*10;i=Y;LCD_WR(dat,numi);Y=Y-i;Y=Y*10;i=Y;LCD_WR(dat,numi);if(pin=2)SENDDATA0=0x53; /接受通道1地址 1401060105SENDDATA1=0x82;SENDDATA2=0x7b;SENDDATA3=0x09;SENDDATA4=0x01;SENDDATA5=0x01;SENDDATA6=x1*100;x1=x1*100-SENDDATA6;SENDDATA7=x1*100;NRF2401_Send();RXEN_HIGH();Wait_Receive();NRF2401_Receive();void Menu_1(void)unsigned char i,j;LCD_WR(comm,0x30);LCD_WR(comm,0x80);return;void Menu_2(void)unsigned char i,j;LCD_WR(comm,0x30);LCD_WR(comm,0x80);return;void main (void)unsigned char pin,i,j;pin=2;P=0;Time_Init();DDRB|=(0x01<<3);DDRC=0xff;AVR_Init();asm volatile("sei");LCD_Start();Init_NRF2401();while(1)Check_Key();if(KEY=3)if(pin<4)pin+;Finger(pin);KEY=0;if(KEY=1)if(pin>2)pin-;Finger(pin);KEY=0;if(KEY=4)KEY=0;if(pin=2)Menu_0(pin);if(pin=3)Menu_1();if(pin=4)Menu_2();LCD_WR (comm,0x30);LCD_WR (comm,0x80); for(i=0;i<4;i+)for(j=0;j<16;j+)LCD_WR(dat,tabl2i*16+j);Finger(pin); /*定时计数器2中断处理函数(左电机)*/ISR(INT0_vect)if(P=0)T1=0;P=1;TCNT1=0x00;elseT1=TCNT1;P=P+1;GICR&=(0x01<<6); ISR(INT1_vect)PORTC=PORTC+1;if(P=0)T2=0;P=1;TCNT1=0x00;elseT2=TCNT1;P=P+1;GICR&=(0x01<<7); ISR(INT2_vect)PORTC=PORTC+1;if(P=0)T3=0;P=1;TCNT1=0x00;elseT3=TCNT1;P=P+1;GICR&=(0x01<<5); ISR(TIMER1_COMPA_vect)i+;if(i=20)LCD_WR(dat,'1');i=0; /*防止未定义中断复位*/ISR(_vector_default);#include <avr/io.h>#include "128.h"/*LCD基本动作*/ #define LCD_EN PORTD|=(0x01<<0)