09电信董龙生 语音控制小车设计.docx
《09电信董龙生 语音控制小车设计.docx》由会员分享,可在线阅读,更多相关《09电信董龙生 语音控制小车设计.docx(19页珍藏版)》请在冰点文库上搜索。
09电信董龙生语音控制小车设计
西藏大学
《单片机应用基础》课程设计
题目:
基于单片机的语音控制小车设计
学院:
工学院
专业:
09电子信息工程
姓名:
董龙生
学号:
22040840208
指导老师:
肖伟、陈延利
目录
1引言………………………………………………………3
2语音控制小车设计要求…………………………………3
2.1功能要求……………………………………………………………….3
2.2参数说明………………………………………………………………..3
3SPCE061A特性简介………………………………………3
4系统总体方案介绍………………………………………4
5系统硬件设计……………………………………………5
5.1车体介绍……………………………………………………………..5
5.2小车的行走原理………………………………………………………..5
5.3控制板原理图………………………………………………………….6
6系统软件设计……………………………………………7
6.1系统的主程序设计……………………………………………………..7
6.2主程序………………………………………………………………...8
6.3语音识别的原理简介…………………………………………………..12
7结束语……………………………………………………12
基于单片机技术的语音控制小车设计
1、引言
语音处理技术是一门新兴的技术,它不仅包括语音的录制和播放,还涉及语音的压缩编码和解码,语音的识别等各种处理技术。
以往做这方面的设计,一般有两个途径:
一种方案是单片机扩展设计,另一种就是借助于专门的语音处理芯片。
普通的单片机往往不能实现这么复杂的过程和算法,即使勉强实现也要加很多的外围器件。
专门的语音处理芯片也比较多,如ISD系列、PM50系列等,但是专门的语音处理芯片功能比较单一,想在语音之外的其他方面应用基本是不可能的。
SPCE061A是一款16位μ'nSP结构的微控制器。
该芯片带有硬件乘法器,能够实现乘法运算、内积运算等复杂的运算。
它不仅运算能力强,而且处理速度快,单周期最高可以达到49MHz。
SPCE061A内嵌32K字的FLASH程序存储器以及2K的SRAM。
同时该SOC芯片具有ADC和DAC功能,其MIC_ADC通道带有AGC自动增益环节,能够很轻松的将语音信号采集到芯片内部,两路10位的电流输出型DAC,只要外接一个功放就可以完成声音的播放。
以上介绍的这些硬件资源使得该SPCE061A能够单芯片实现语音处理功能。
借助于SPCE061A的语音特色,“基于单片机技术的语音控制小车设计”实现了对小车前进、后退、左转、右转、停车等语音控制功能.
2、语音控制小车设计要求
2.1功能要求:
1.可以通过简单的I/O操作实现小车的前进、后退、左转、右转功能;
2.配合SPCE061A的语音特色,利用系统的语音播放和语音识别资源,实现语音控制的功能;
3.可以在行走过程中声控改变小车运动状态;
4.在超出语音控制范围时能够自动停车。
2.2参数说明
车体:
双电机两轮驱动
供电:
电池(四节AA:
1.2V×4或1.5V×4)
工作电压:
DC4V~6V
工作电流:
运动时约200mA
3.SPCE061A特性简介
SPCE061A是一款性价比很高的十六位单片机,使用它可以非常方便灵活的实现语音的录放,该芯片拥有8路10位精度的ADC,其中一路为音频转换通道,并且内置有自动增益电路。
这为实现语音录入提供了方便的硬件条件。
两路10位精度的DAC,只需要外接功放(SPY0030A)即可完成语音的播放。
该单片机具有一套易学易用的指令系统和集成开发环境,在此环境中,它支持标准C语言编程,也支持C语言与汇编语言的互相调用。
另外还提供了语音录放的库函数,只要了解库函数的使用,就可以很容易的完成语音的录放、识别等功能,这些都为软件开发提供了方便的条件。
SPCE061A特性:
16位μ’nSP微处理器;
工作电压:
内核工作电压VDD为3.0V~3.6V(CPU),I/O口工作电压VDDH为VDD~5.5V(I/O);
CPU时钟:
0.32MHz~49.152MHz;
内置2K字SRAM;
内置32K闪存ROM;
可编程音频处理;
晶体振荡器;
系统处于备用状态下(时钟处于停止状态),耗电小于2μA@3.6V;
2个16位可编程定时器/计数器(可自动预置初始计数值);
2个10位DAC(数-模转换)输出通道;
32位通用可编程输入/输出端口;
14个中断源可来自定时器A/B,时基,2个外部时钟源输入,键唤醒;
具备触键唤醒的功能;
使用音频编码SACM_S240方式(2.4K位/秒),能容纳210秒的语音数据;
锁相环PLL振荡器提供系统时钟信号;
32768Hz实时时钟;
7通道10位电压模-数转换器(ADC)和单通道声音模-数转换器;
声音模-数转换器输入通道内置麦克风放大器和自动增益控制(AGC)功能;
具备串行设备接口;
低电压复位(LVR)功和低电压监测(LVD)功能;
内置在线仿真板(ICE,In-CircuitEmulator)接口。
4、系统总体方案介绍
小车的运动控制采用语音控制和中断定时控制相结合,通过语音触发小车动作,小车动作之后,随时可以通过语音指令改变小车的运动状态。
在每一次动作触发的同时启动定时器,如果小车由于某些原因不能正常的接收语音指令,则只要定时时间一到,中断服务程序就会发出指令让小车停下来。
图1控制系统所需硬件
5、系统硬件设计
系统的硬件方面,由于大部分的功能实现都是在61板上完成的,只有电机控制部分电路另外设计在一块独立的电路板上,我们称之为控制板。
下面详细的介绍小车的结构和运行原理以及控制电路板的结构和功能实现。
图2系统硬件框图
5.1车体介绍
语音控制小车为四轮结构。
其中前面两个车轮由前轮电机控制,在连杆和支点作用下控制前轮左右摆动,来调节小车的前进方向。
在自然状态下,前轮在弹簧作用下保持中间位置。
后面两个车轮由后轮电机驱动,为整个小车提供动力。
所以又称前面的轮子为方向轮,后面的两个轮子为驱动轮。
5.2小车的行走原理.
直走:
由小车的结构分析,在自然状态下,前轮在弹簧作用下保持中间状态,这是只要后轮电机正转小车就会前进。
倒车:
倒车动作和前进动作刚好相反,前轮电机仍然保持中间状态,后轮电机反转,小车就会向后运动。
图4小车前进、后退示意图
左转:
前轮电机逆时针旋转(规定为正转),后轮电机正转,这时小车就会在前后轮共同作用下朝左侧前进。
右转:
前轮电机反转,后轮电机正转,这时小车就是会在前后轮共同作用下朝右侧前进。
图5小车转向示意图
5.3控制板原理图
控制板主要包括:
接口电路、电源电路和两路电机的驱动电路,控制板原理图如下。
接口电路:
接口电路负责将61板的I/O接口信号传送给控制电路板,I/O信号主要为控制电机需要的IOB8~IOB11这四路信号,同时为了方便后续的开发和完善,预留了IOB12~IOB15以及IOA8~IOA15接口,可以在这些接口上添加一些传感器。
电源部分:
整个小车有4个电源信号:
电池电源,控制板工作电源,61板工作电源,61板的I/O输出电源。
系统供电由电池提供,控制板直接采用电池供电(VCC),然后经二极管D1后产生61板电源SPCE061A在语音控制小车中的应用(VCC_61),通过61板的Vio跳线产生61板的端口电源(V1)。
图6小车控制电路图
6、系统软件设计
6.1系统的主程序设计
系统的主程序流程如下图所示:
图7主程序流程图
共分为四大部分:
初始化部分、训练部分、识别部分、重训操作。
初始化部分:
初始化操作将IOB8~IOB11设置为输出端,用以控制电机。
必要时还要有对应的输入端设置和PWM端口设置等。
训练部分:
训练部分完成的工作就是建立语音模型。
程序一开始判断小车是否被训练过,如果没有训练过则要求对其进行训练,并且会在训练成功之后将训练的模型存储到Flash,在以后使用时不需要重新训练;如果已经训练过会把存储在Flash中的模型调出来装载到辨识器中。
识别部分:
在识别环节当中,如果辨识结果是名字,停止当前的动作并进入待命状态,然后等待动作命令。
如果辨识结果为动作指令小车会语音告知相应动作并执行该动作,在运动过程中可以通过呼叫小车SPCE061A在语音控制小车中的应用的名字使小车停下来。
重训操作:
考虑到有重新训练的需求,设置了重新训练的按键(61板的KEY3),循环扫描该按键,一旦检测到此键按下,则将擦除训练标志位(0xe000单元),并等待复位。
复位后,程序重新执行,当检测到训练标志位为0xffff时会要求重新对其进行训练。
6.2主程序:
//Theinformationcontainedhereinistheexclusivepropertyof
//SunnnorthTechnologyCo.Andshallnotbedistributed,reproduced,
//ordisclosedinwholeinpartwithoutpriorwrittenpermission.
//(C)COPYRIGHT2003SUNNORTHTECHNOLOGYCO.
//ALLRIGHTSRESERVED
//Theentirenoticeabovemustbereproducedonallauthorizedcopies.
//========================================================
//========================================================
//工程名称:
Car_Demo
//功能描述:
实现小车的语音控制
//涉及的库:
CMacro1016.lib
//bsrv222SDL.lib
//sacmv26e.lib
//组成文件:
main.c
//Flash.asm,hardware.asm,ISR.asm
//hardware.h,s480.h,hardware.inc
//硬件连接:
IOA0-----KEY1
//IOA1-----KEY2
//IOA2-----KEY3
//IOB8-----前进
//IOB9-----倒车
//IOB10----左拐
//IOB11----右拐
//========================================================
#include
#include
#defineP_IOA_Data(volatileunsignedint*)0x7000
#defineP_IOA_Dir(volatileunsignedint*)0x7002
#defineP_IOA_Attrib(volatileunsignedint*)0x7003
#defineP_IOB_Data(volatileunsignedint*)0x7005
#defineP_IOB_Dir(volatileunsignedint*)0x7007
#defineP_IOB_Attrib(volatileunsignedint*)0x7008
#defineP_TimerA_Data(volatileunsignedint*)0x700A
#defineP_TimerA_Ctrl(volatileunsignedint*)0x700B
#defineP_TimerB_Data(volatileunsignedint*)0x700C
#defineP_TimerB_Ctrl(volatileunsignedint*)0x700D
#defineP_Watchdog_Clear(volatileunsignedint*)0x7012
#defineP_INT_Mask(volatileunsignedint*)0x702D
#defineP_INT_Clear(volatileunsignedint*)0x7011
#defineNAME_ID0x100
#defineCOMMAND_GO_ID0x101
#defineCOMMAND_BACK_ID0x102
#defineCOMMAND_LEFT_ID0x103
#defineCOMMAND_RIGHT_ID0x104
#defineS_NAME0//给我取个名字吧
#defineS_ACT11//前进
#defineS_ACT22//倒车,请注意
#defineS_ACT33//左拐
#defineS_ACT44//右拐
#defineS_RDY5//Yeah
#defineS_AGAIN6//请再说一遍
#defineS_NOVOICE7//没有听到任何声音
#defineS_CMDDIFF8//说什么暗语呀
#defineS_NOISY8//说什么暗语呀
#defineS_START9//准备就绪,开始辨识
#defineS_GJG10//拐就拐
#defineS_DCZY11//倒车,请注意
externunsignedintBSR_SDModel[100];//外部变量BSR_SDModel[100],辨识器自带
externvoidF_FlashWrite1Word(unsignedintaddr,unsignedintValue);
externvoidF_FlashErase(unsignedintsector);
unsignedintuiTimeset=3;//运行时间定时,调整该参数控制运行时间
unsignedintuiTimecont;//运行时间计时
//=============================================================
//语法格式:
voidDelay();
//实现功能:
延时
//参数:
无
//返回值:
无
//============================================================
intTrainWord(unsignedintWordID,unsignedintSndID)
{
intResult;
PlaySnd(SndID,3);
while
(1)
{
Result=BSR_Train(WordID,BSR_TRAIN_TWICE);//训练两次,获得训练结果
if(Result==0)break;
switch(Result)
{
case-1:
//没有检测出声音
PlaySnd(S_NOVOICE,3);
return-1;
case-2:
//需要训练第二次
PlaySnd(S_AGAIN,3);
break;
case-3:
//环境太吵
PlaySnd(S_NOISY,3);
return-3;
case-4:
//数据库满
return-4;
case-5:
//检测出声音不同
PlaySnd(S_CMDDIFF,3);
return-5;
case-6:
//序号错误
return-6;
default:
break;
}
}
return0;
}
intmain(void)
{unsignedintBS_Flag;//Train标志位
*P_IOA_Dir=0xff00;//初始化IOA,IOA0~7下拉输入
*P_IOA_Attrib=0xff00;
*P_IOA_Data=0x0000;
*P_IOB_Dir=0x0f00;//初始化IOB,IOB8~11同向输出
*P_IOB_Attrib=0x0f00;
*P_IOB_Data=0x0000;
BSR_DeleteSDGroup(0);//初始化存储器RAM
BS_Flag=*(unsignedint*)0xe000;//读存储单元0xe000
if(BS_Flag==0xffff)//没有经过训练(0xe000内容为0xffff)
{
TrainSD();//训练
StoreSD();//存储训练结果(语音模型)
}
else//经过训练(0xe000内容为0x0055)
{
LoadSD();//语音模型载入识别器
}
PlaySnd(S_START,3);//开始识别提示
BSR_InitRecognizer(BSR_MIC);//初始化识别器
while
(1)
{
BSR();
if((*P_IOA_Data)&0x0004)//是否重新训练
{
F_FlashErase(0xe000);
while
(1);
}
}
}
子程序:
voidF_FlashErase(unsignedintsector)
{}
voidBSR()
{}
voidBSR_InitRecognizer()
{}
voidPlaySnd()
{}
voidLoadSD()
{}
voidStoreSD()
{}
voidTrainSD()
{}
voidBSR_DeleteSDGroup()
{}
voidBSR_Train()
{}
6.3语音识别的原理简介
语音识别主要分为“训练”和“识别”两个阶段。
在训练阶段,单片机对采集到的语音样本进行分析处理,从中提取出语音特征信息,建立一个特征模型;在识别阶段,单片机对采集到的语音样本也进行类似的分析处理,提取出语音的特征信息,然后将这个特征信息模型与已有的特征模型进行对比,如果二者达到了一定的匹配度,则输入的语音被识别。
语音识别的具体流程如下图所示:
7结束语
本设计综合应用了SPCE061A丰富的软硬件资源,成功的实现了语音控制功能。
在硬件方面,有较高的执行速度、内置的硬件乘法器、ADC和DAC功能、内置的AGC自动增益环节,这些为语音处理提供了强大基础。
在软件方面,标准的C语言编程,丰富的语音资源函数为编程提供了很大的方便。
该设计方案结构简单,以单芯片实现了语音播放与识别以及电机控制功能,相当于“语音识别芯片+普通单片机”的功能。
但是比“语音识别芯片+普通单片机”方案实现起来要简单很多,而且成本也会降低很多。
该语音控制小车操作比较简单,训练和识别成功的几率也比较高,是一个典型的语音识别应用方案。
致谢
感谢肖老师、陈老师这学期来的教导和关怀