语音控制小车的设计 程文洪作品.docx

上传人:b****4 文档编号:3561579 上传时间:2022-11-23 格式:DOCX 页数:24 大小:863.04KB
下载 相关 举报
语音控制小车的设计 程文洪作品.docx_第1页
第1页 / 共24页
语音控制小车的设计 程文洪作品.docx_第2页
第2页 / 共24页
语音控制小车的设计 程文洪作品.docx_第3页
第3页 / 共24页
语音控制小车的设计 程文洪作品.docx_第4页
第4页 / 共24页
语音控制小车的设计 程文洪作品.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

语音控制小车的设计 程文洪作品.docx

《语音控制小车的设计 程文洪作品.docx》由会员分享,可在线阅读,更多相关《语音控制小车的设计 程文洪作品.docx(24页珍藏版)》请在冰豆网上搜索。

语音控制小车的设计 程文洪作品.docx

语音控制小车的设计程文洪作品

 

语音控制小车的设计

一、概述

语音处理技术是一门新兴的技术,它不仅包括语音的录制和播放,还涉及语音的压缩编码和解码,语音的识别等各种处理技术。

做这方面的设计,一般有两个途径:

一种方案是单片机扩展设计,另一种就是借助于专门的语音处理芯片。

普通的单片机往往不能实现这么复杂的过程和算法,即使勉强实现也要加很多的外围器件。

专门的语音处理芯片也比较多,像ISD系列、PM50系列等,但是专门的语音处理芯片功能比较单一,想在语音之外的其他方面应用基本是不可能的。

SPCE061A是一种16位μ'nSP结构的微控制器。

该芯片带有硬件乘法器,能够实现乘法运算、内积运算等复杂的运算。

它不仅运算能力强,而且处理速度快,单周期最高可以达到49MHz。

SPCE061A内嵌32K字的FLASH程序存储器以及2K的SRAM。

同时该SOC芯片具有ADC和DAC功能,其MIC_ADC通道带有AGC自动增益环节,能够很轻松的将语音信号采集到芯片内部,两路10位的电流输出型DAC,只要外接一个功放就可以完成声音的播放。

以上介绍的这些硬件资源使得该SPCE061A能够单芯片实现语音处理功能。

借助于SPCE061A的语音特色,我们设计出了这款语音控制小车。

小车不仅具有前进、后退、左转、右转停车等基本功能;同时配合SPCE061A的语音特色,实现语音控制功能。

 

二语音控制小车设计要求

(一)功能设计要求

语音控制小车是凌阳大学计划推出的基于SPCE061A的代表性兴趣产品,它配合61板推出,综合应用了SPCE061A的众多资源,打破了传统教学中单片机学习枯燥和低效的现状。

小车采用语音识别技术,可通过语音命令对其行驶状态进行控制。

语音控制小车的主要功能:

1.可以通过简单的I/O操作实现小车的前进、后退、左转、右转功能;

2.配合SPCE061A的语音特色,利用系统的语音播放和语音识别资源,实现语音控制的功能;

3.可以在行走过程中声控改变小车运动状态;

4.在超出语音控制范围时能够自动停车。

(二)参数说明

车体:

双电机两轮驱动供电:

电池(四节AA:

1.2V×4或1.5V×4)

工作电压:

DC4V~6V工作电流:

运动时约200mA

(三)注意事项

1.一定要注意电池的正负极性,切勿装反;

2.长期不用请将电池取出电池盒;

3.由于语音信号的不确定性,语音识别的过程会出现一定的误差和不准确性;

4.由于小车行动比较灵活,速度比较快,在使用时一定要注意保持场地足够大,且保证不会对周围的物体造成伤害;

5.不要让小车长时间运行在堵转状态(堵转状态:

由于小车所受阻力过大,造成小车电机加电但并不转动的现象),这样会造成很大的堵转电流,有可能会损坏小车的控制电路。

第三章核心器件简介

(一)SPCE061A特性简介

SPCE061A是一种十六位单片机,使用它可以非常方便灵活的实现语音的录放,该芯片拥有8路10位精度的ADC,其中一路为音频转换通道,并且内置有自动增益电路。

这为实现语音录入提供了方便的硬件条件。

两路10位精度的DAC,只需要外接功放(SPY0030A)即可完成语音的播放。

另外十六位单片机具有一套易学易用的指令系统和集成开发环境,在此环境中,它支持标准C语言编程,也支持C语言与汇编语言的互相调用。

另外还提供了语音录放的库函数,只要了解库函数的使用,就可以很容易的完成语音的录放、识别等功能,这些都为软件开发提供了方便的条件。

SPCE061是一款拥有2KRAM、32KFlash、32个I/O口,并集成了AD/DA功能强大的16位微处理器,它还拥有丰富的语音处理功能,为小车的功能扩展提供了相当大的空间。

只要按照该单片机的要求对其编制程序就可以实现很多不同的功能。

SPCE061A是继µ’nSP™系列产品SPCE500A等之后凌阳科技推出的又一款16位结构的微控制器。

与SPCE500A不同的是,在存储器资源方面考虑到用户的较少资源的需求以及便于程序调试等功能,SPCE061A里只内嵌32K字的闪存(FLASH)。

较高的处理速度使µ’nSP™能够非常容易地、快速地处理复杂的数字信号。

因此,与SPCE500A相比,以µ’nSP™为核心的SPCE061A微控制器是适用于数字语音识别应用领域产品的一种最经济的选择。

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)接口。

 

(二)精简开发板——61板

“61板”是SPCE061AEMUBOARD的简称,是以凌阳16位单片机SPCE061A为核心的精简开发-仿真-实验板,大小相当于一张扑克牌。

“61板”除了具备单片机最小系统电路外,还包括有电源电路、复位电路、ICE电路、音频电路(含MIC输入部分和DAC音频输出部分)等,“61板”可以采用电池供电。

图3-1所示为该精简开发板的实物图。

图3-161板实物图

 

第四章系统总体方案

(一)系统硬件方案

系统的结构框图如图4-1示。

图4-1系统结构框图

系统组成主要包括以下两部分:

SPCE061A精简开发板、语音小车控制电路板。

图中的语音输入部分MIC_IN、按键输入KEY、声音输出部分的功率放大环节等已经做到了精简开发板——61板上,为我们使用提供了很大的方便。

在电机的驱动方面,采用全桥驱动技术,利用四个I/O端口分为两组分别实现两个电机的正传、反转和停三态运行。

(二)系统控制方案

小车的运动控制采用语音控制和中断定时控制相结合,通过语音触发小车动作,小车动作之后,随时可以通过语音指令改变小车的运动状态。

在每一次动作触发的同时启动定时器,如果小车由于某些原因不能正常的接收语音指令,则只要定时时间到,中断服务程序会发出指令让小车停下来。

第五章系统硬件设计

小车驱动电机一般利用现成的玩具小车上的配套直流电机。

考虑到小车必须能够前进、倒退、停止,并能灵活转向,在左右两轮各装一个电机分别进行驱动。

当左轮电机转速高于右轮电机转速时小车向右转,反之则向左转。

为了能控制车轮的转速,可以采取PWM调速法,即由单片机的IOB8、IOB9输出一系列频率固定的方波,再通过功率放大来驱动电机,在单片机中编程改变输出方波的占空比就可以改变加到电机上的平均电压,从而可以改变电机的转速。

左右轮两个电机转速的配合就可以实现小车的前进、倒退、转弯等功能。

(一)车体介绍

语音控制小车为四轮结构,如图5-1所示。

其中前面两个车轮由前轮电机控制,在连杆和支点作用下控制前轮左右摆动,来调节小车的前进方向。

在自然状态下,前轮在弹簧作用下保持中间位置。

后面两个车轮由后轮电机驱动,为整个小车提供动力。

所以又称前面的轮子为方向轮,后面的两个轮子为驱动轮,如图5-2所示。

图5-1车体侧视图

 

图5-2车体顶视图

1.小车的行走原理

直走:

由小车的结构分析,在自然状态下,前轮在弹簧作用下保持中间状态,这是只要后轮电机正转小车就会前进。

如图5-3所示;

倒车:

倒车动作和前进动作刚好相反,前轮电机仍然保持中间状态,后轮电机反转,小车就会向后运动,如图5-4所示;

左转:

前轮电机逆时针旋转(规定为正转),后轮电机正转,这时小车就会在前后轮共同作用下朝左侧前进,如图5-5所示;

右转:

前轮电机反转,后轮电机正转,这时小车就是会在前后轮共同作用下朝右侧前进,如图5-6所示。

图5-3小车前进原理图图5-4小车倒车示意图

图5-5小车左转示意图图5-6小车右转示意图

(二)控制板原理图

控制板主要包括:

接口电路、电源电路和两路电机的驱动电路,控制板原理图如图5-7所示。

接口电路:

接口电路负责将61板的I/O接口信号传送给控制电路板,I/O信号主要为控制电机需要的IOB8~IOB11这四路信号,同时为了方便后续的开发和完善,预留了IOB12~IOB15以及IOA8~IOA15接口,可以在这些接口上添加一些传感器。

电源部分:

整个小车有4个电源信号:

电池电源,控制板工作电源,61板工作电源,61板的I/O输出电源。

系统供电由电池提供,控制板直接采用电池供电(VCC),然后经二极管D1后产生61板电源(VCC_61),通过61板的Vio跳线产生61板的端口电源(V1)。

二极管D1作用:

1.降压,4节电池提供的电压VCC最大可达到6V,D1可有效地降压。

2.2.保护,D1可以防止电源接反烧坏61板。

图5-7控制板原理图

1.全桥驱动原理

全桥驱动又称H桥驱动,下面介绍一下H桥的工作原理:

H桥一共有四个臂,分别为B1~B4,每个臂由一个开关控制,示例中为三极管Q1~Q4。

如果让Q1、Q2导通Q3、Q4关断,如图5-8所示,此时电流将会流经Q1、负载、Q2组成的回路,电机正转。

图5-8B1、B2工作时的H桥电路简图图5-9B3、B4工作时的H桥电路简图

如果让Q1、Q2关断Q3、Q4导通,如图5-9所示,此时电流将会流经Q3、负载、Q4组成的回路,电机反转。

如果让Q1、Q2关断Q3、Q4也关断,负载Load两端悬空,如图5-10所示,此时电机停转。

这样就实现了电机的正转、反转、停止三态控制。

如果让Q1、Q2导通Q3、Q4也导通,那么电流将会流经Q1、Q4组成的回路以及Q2和Q3组成的回路,如图5-11所示,这时桥臂上会出现很大的短路电流。

在实际应用时注意避免出现桥臂短路的情况,这会给电路带来很大的危害,严重会烧毁电路

图5-10B1~B4全部停止工作时的H桥简图图5-11B1~B4全部工作时的H桥简图

2.动力电机驱动电路

动力驱动由后轮驱动实现,负责小车的直线方向运动,包括前进和后退,后轮驱动电路是一个全桥驱动电路,如图3-12所示:

Q1、Q2、Q3、Q4四个三极管组成四个桥臂,Q1和Q4组成一组,Q2和Q3组成一组,Q5控制Q2、Q3的导通与关断,Q6控制Q1和Q4的导通与关断,而Q5、Q6由IOB9和IOB8控制,这样就可以通过IOB8和IOB9控制四个桥臂的导通与关断控制后轮电机的运行状态,使之正转反转或者停转,进而控制小车的前进和后退。

图5-12后轮电机驱动电路

当IOB8为高电平、IOB9为低电平时Q1和Q4导通,Q2和Q3截止,后轮电机正转,小车前进;反之当IOB8为低电平、IOB9为高电平时Q1和Q4截止,Q2和Q3导通,后轮电机反转,小车倒退;而当IOB8、IOB9同为低电平时Q1、Q2、Q3和Q4都截止,后轮电机停转,小车停止运动。

注意:

IOB8和IOB9不能同时置高电平,这样会造成后轮驱动全桥短路现象。

5.2.3方向电机控制电路

方向控制由前轮驱动实现,包括左转和右转,前轮驱动电路也是一个全桥驱动电路,如图3-12所示:

Q7、Q8、Q9、Q10四个三极管组成四个桥臂,Q7和Q10组成一组,Q8和Q9组成一组,Q11控制Q8、Q9的导通与关断,Q12控制Q7和Q10的导通与关断,而Q11、Q12由IOB10和IOB11控制,这样就可以通过IOB10和IOB11控制前轮电机的正转和反转,进而控制小车的左转和右转。

图5-13前轮电机驱动电路

当IOB10为高电平、IOB11为低电平时Q8和Q9导通,Q7和Q10截止,前轮电机正转,小车前轮朝左偏转;反之当IOB10为低电平、IOB11为高电平时Q8和Q9截止,Q7和Q10导通,前轮电机反转,小车前轮朝右偏转;而当IOB10、IOB11同为低电平时Q8和Q9截止,Q7和Q10也截止,前轮电机停转,在弹簧作用下前轮被拉回到中间位置,保持直向。

注意:

IOB10、IOB11不能同时为高电平,这样会造成前轮驱动全桥的桥臂短路。

结合以上对前轮和后轮的状态分析,得到小车的运行状态与输入的对照表,如下表所示:

表5.1基本的输入与小车运动状态对照表

IOB11

IOB10

IOB9

IOB8

后电机

前电机

小车

0

0

0

0

停转

停转

0

0

0

1

正转

停转

前进

0

0

1

0

反转

停转

倒退

0

1

0

1

正转

正转

左前转

1

0

0

1

正转

反转

右前转

 

另外还有一些不常用的运行状态,比如右后转、左后转等,结合以上对前轮和后轮的状态分析,其端口对照如表5.2所示:

表5.2输入与小车的运动状态对照表

IOB11

IOB10

IOB9

IOB8

后电机

前电机

小车

0

1

1

0

正转

正转

右后转

1

0

1

0

正转

反转

左后转

注意:

为了小车的安全请不要出现以下两种组合情况:

表5.3禁止的输入状态列表

IOB11

IOB10

IOB9

IOB8

后电机

前电机

小车

*

*

1

1

停转

*

1

1

*

*

*

停转

 

第六章系统软件设计

(一)系统的总体程序流程

系统的总体程序流程如图6-1所示:

图6-1系统总体程序流程图

语音识别小车的主程序流程如图6-1所示,分为四大部分:

初始化部分、训练部分、识别部分、重训操作。

初始化部分:

初始化操作将IOB8~IOB11设置为输出端,用以控制电机。

必要时还要有对应的输入端设置和PWM端口设置等。

训练部分:

训练部分完成的工作就是建立语音模型。

程序一开始判断小车是否被训练过,如果没有训练过则要求对其进行训练,并且会在训练成功之后将训练的模型存储到Flash,在以后使用时不需要重新训练;如果已经训练过会把存储在Flash中的模型调出来装载到辨识器中。

识别部分:

在识别环节当中,如果辨识结果是名字,停止当前的动作并进入待命状态,然后等待动作命令。

如果辨识结果为动作指令小车会语音告知相应动作并执行该动作,在运动过程中可以通过呼叫小车的名字使小车停下来。

重训操作:

考虑到有重新训练的需求,设置了重新训练的按键(61板的KEY3),循环扫描该按键,一旦检测到此键按下,则将擦除训练标志位(0xe000单元),并等待复位。

复位后,程序重新执行,当检测到训练标志位为0xffff时会要求重新对其进行训练。

1.语音识别的原理简介

在介绍子程序之前首先介绍一下语音识别的原理。

语音识别主要分为“训练”和“识别”两个阶段。

在训练阶段,单片机对采集到的语音样本进行分析处理,从中提取出语音特征信息,建立一个特征模型;在识别阶段,单片机对采集到的语音样本也进行类似的分析处理,提取出语音的特征信息,然后将这个特征信息模型与已有的特征模型进行对比,如果二者达到了一定的匹配度,则输入的语音被识别。

 

语音识别的具体流程如图6-2所示:

图6-2语音识别流程说明框图

2.训练子程序

当程序检测到训练标志位BS_Flag内容为0xffff,就会要求操作者对它进行训练操作,训练操作的过程如图6-3所示:

训练采用两次训练获取结果的方式,以训练名字为例:

小车首先会提示:

给我取个名字吧,这时你可以告诉它一个名字(比如Jack);然后它会提示:

请再说一遍,这时再次告诉它名字(Jack),如果两次的声音差别不大,小车就能够成功的建立模型,名称训练成功;如果没能够成功的建立模型,小车会告知失败的原因并要求重新训练。

成功训练名称后会给出下一条待训练指令提示音:

前进,参照名称训练方式训练前进指令。

依次训练小车的名称—前进指令—倒车指令—左转指令—右转指令,全部训练成功子程序返回,训练结束。

图6-3训练流程图

下面是训练部分的子程序,在训练时如果训练不成功TrainWord()返回值不为0,要求重复训练,只有当训练成功,TrainWord()返回0,进行下一条指令训练。

voidTrainSD()

{

while(TrainWord(NAME_ID,S_NAME)!

=0);//训练名称

while(TrainWord(COMMAND_GO_ID,S_ACT1)!

=0);//训练第1个动作

while(TrainWord(COMMAND_BACK_ID,S_ACT2)!

=0);//训练第2个动作

while(TrainWord(COMMAND_LEFT_ID,S_ACT3)!

=0);//训练第3个动作

while(TrainWord(COMMAND_RIGHT_ID,S_ACT4)!

=0);//训练第4个动作

}

 

3.语音识别子程序

语音识别流程如图6-4所示:

首先获取辨识器的辨识结果,判断是否有语音触发,如果有语音触发则会返回识别结果的ID号,ID号对应名称或者对应不同的动作。

如果ID号为名称,则结束运动(如果当前在运动状态),进入待命状态,等待下一次的指令触发;如果ID号为动作,则语音告知将要执行的动作,并执行该动作。

图6-4语音识别部分流程图

 

4.动作子程序

动作子程序包括:

前进、倒车、左拐、右拐、停车子程序;

前进:

由小车的结构原理和驱动电路分析知:

只要IOB8为高电平,IOB9,IOB10,IOB11全部为低电平即可实现小车的前进。

前进子程序包括语音提示、置端口数据、启动定时器操作,该部分程序如下:

voidGoAhead()//前进

{

PlaySnd(S_ACT1,3);//语音提示

*P_IOB_Data=0x0100;//前进

*P_INT_Mask|=0x0004;//开2Hz中断

__asm("intfiq,irq");

uiTimecont=0;//清定时器

}

倒车:

由小车的结构原理分析和驱动电路分析知:

只要IOB9为高电平,IOB8,IOB10,IOB11全部为低电平即可实现小车的倒退。

倒退子程序包括语音提示、置端口数据、启动定时器操作,程序如下:

voidBackUp()//倒退

{

PlaySnd(S_ACT2,3);//语音提示

*P_IOB_Data=0x0200;//倒车

*P_INT_Mask|=0x0004;//开2Hz中断

__asm("intfiq,irq");

uiTimecont=0;//清定时器

}

 

左转:

由小车的结构原理分析和驱动电路分析知:

小车左转需要两个条件:

1.前轮左偏2.后轮前进,这时对应的I/O状态为:

IOB8、IOB10为高电平,IOB9、IOB11为低电平。

左转子程序包括语音提示、置端口数据、启动定时器操作,该部分程序如下:

voidTurnLeft()//左转

{

PlaySnd(S_GJG,3);//播放提示音

*P_IOB_Data=0x0900;//前轮右偏

Delay();//延时

*P_IOB_Data=0x0500;//前轮左偏

*P_INT_Mask|=0x0004;//打开2Hz中断

__asm("intfiq,irq");//允许总中断

uiTimecont=0;//清定时器

}

右转:

由小车的结构原理分析和驱动电路分析知:

小车右转需要两个条件:

1.前轮右偏2.后轮前进,这时对应的I/O状态为:

IOB8、IOB11为高电平,IOB9、IOB10为低电平。

右转子程序包括语音提示、置端口数据、启动定时器操作,该部分程序如下:

voidTurnLeft()//左转

{

PlaySnd(S_GJG,3);//播放提示音

*P_IOB_Data=0x0500;//前轮左偏

Delay();//延时

*P_IOB_Data=0x0900;//前轮右偏

*P_INT_Mask|=0x0004;//打开2Hz中断

__asm("intfiq,irq");//允许总中断

uiTimecont=0;//清定时器

}

5.中断子程序

虽然已经有了前进、后退以及停车(通过直接呼叫小车的名字使其停车)等语音控制指令,但是考虑环境的干扰因素,小车运行时的噪音影响和有效距离的限制,小车运行后可能接收不到语音指令而一直运行。

为了防止出现这种情况,加入了时间控制,在启动小车运行的同时启动定时器,定时器时间到停止小车的运行,该定时器借助于2Hz时基中断完成,图6-5所示为该程序的流程图。

可以在程序中修改uiTimeset参数来控制运行时间,当uiTimeset=2时,运行时间为1s,以此类推。

图6-52Hz定时中断子函数

(2)程序中需要说明的几个问题

在程序中有几个地方不易理解,需要特别说明一下:

首先,小车有没有被训练过是怎么知道的?

在这里利用了一个特殊的Flash单元,语音模型存储区首单元(该示例程序中为0xe000单元)。

当Flash在初始化以后,或者在擦除后为0xffff,在成功训练并存储后为0x0055(该值由辨识器自动生成)。

这样就可以根据这个单元的值来判断是否经过训练。

其次,为什么已经训练过的系统在重新运行时还要进行模型装载?

在首次训练完成之后,辨识器中保存着训练的模型,但是系统一旦复位辨识器中的模型就会丢失,所以在重新运行时必须把存储在Flash中的语音模型装载到辨识器(RAM)中去。

第三,在转弯时为什么前轮要先做一个反方向的摆动?

这是为了克服车体的限制,由于前轮电机的驱动能力有限,有时会出现前轮偏转不到位的情况,所以在转弯前首先让前轮朝反方向摆动,然后再朝目标方向摆动。

这样前轮的摆动范围更大,惯性更大,摆幅也最大,能更好实现转弯。

第四,关于语音的一些具体问题,关于语音的一些

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学反思汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1