声音控制小车 gai.docx

上传人:b****5 文档编号:6021701 上传时间:2023-01-03 格式:DOCX 页数:21 大小:663.25KB
下载 相关 举报
声音控制小车 gai.docx_第1页
第1页 / 共21页
声音控制小车 gai.docx_第2页
第2页 / 共21页
声音控制小车 gai.docx_第3页
第3页 / 共21页
声音控制小车 gai.docx_第4页
第4页 / 共21页
声音控制小车 gai.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

声音控制小车 gai.docx

《声音控制小车 gai.docx》由会员分享,可在线阅读,更多相关《声音控制小车 gai.docx(21页珍藏版)》请在冰豆网上搜索。

声音控制小车 gai.docx

声音控制小车gai

基于单片机技术的语音控制小车设计

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系统硬件框图

 

图3系统硬件组装效果图

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.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----右拐

//维护记录:

2005-12-12v1.0

//========================================================

#include"s480.h"

#include"bsrsd.h"

#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();

//实现功能:

延时

//参数:

//返回值:

//=============================================================

voidDelay()

{

unsignedinti;

for(i=0;i<0x3Fff;i++)

{

*P_Watchdog_Clear=0x0001;

}

}

//=============================================================

//语法格式:

voidPlaySnd(unsignedSndIndex,unsignedDAC_Channel);

//实现功能:

语音播放函数

//参数:

SndIndex-播放语音资源索引号

//DAC_Channel-播放声道选择

//返回值:

//=============================================================

voidPlaySnd(unsignedSndIndex,unsignedDAC_Channel)

{

BSR_StopRecognizer();//停止识别器

SACM_S480_Initial

(1);//初始化为自动播放

SACM_S480_Play(SndIndex,DAC_Channel,3);//开始播放一段语音

while((SACM_S480_Status()&0x0001)!

=0)//是否播放完毕?

{

SACM_S480_ServiceLoop();//解码并填充队列

*P_Watchdog_Clear=0x0001;//清看门狗

}

SACM_S480_Stop();//停止播放

BSR_InitRecognizer(BSR_MIC);//初始化识别器

}

//=============================================================

//语法格式:

intTrainWord(intWordID,intSndID);

//实现功能:

训练一条指令

//参数:

WordID-指令编码

//SndID-指令提示音索引号

//返回值:

//=============================================================

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;

}

//=============================================================

//语法格式:

voidTrainSD();

//实现功能:

训练函数

//参数:

//返回值:

//=============================================================

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个动作

}

//=============================================================

//语法格式:

voidStoreSD();

//实现功能:

存储语音模型函数

//参数:

//返回值:

//=============================================================

voidStoreSD()

{unsignedintulAddr,i,commandID,g_Ret;

F_FlashWrite1Word(0xef00,0xaaaa);

F_FlashErase(0xe000);

F_FlashErase(0xe100);

F_FlashErase(0xe200);

ulAddr=0xe000;//********

for(commandID=0x100;commandID<0x105;commandID++)

{

g_Ret=BSR_ExportSDWord(commandID);

while(g_Ret!

=0)//模型导出成功?

g_Ret=BSR_ExportSDWord(commandID);

for(i=0;i<100;i++)//保存语音模型SD1(0xe000---0xe063)

{

F_FlashWrite1Word(ulAddr,BSR_SDModel[i]);

ulAddr+=1;

}

}

}

//=============================================================

//语法格式:

voidStoreSD();

//实现功能:

装载语音模型函数

//参数:

//返回值:

//=============================================================

voidLoadSD()

{unsignedint*p,k,jk,Ret,g_Ret;

p=(int*)0xe000;

for(jk=0;jk<5;jk++)

{

for(k=0;k<100;k++)

{

Ret=*p;

BSR_SDModel[k]=Ret;//装载语音模型

p+=1;

}

g_Ret=BSR_ImportSDWord();

while(g_Ret!

=0)//模型装载成功?

g_Ret=BSR_ImportSDWord();

}

}

//=============================================================

//语法格式:

voidGoAhead();

//实现功能:

前进子函数

//参数:

//返回值:

//=============================================================

voidGoAhead()//前进

{

PlaySnd(S_ACT1,3);//提示

*P_IOB_Data=0x0100;//前进

*P_INT_Mask|=0x0004;//以下为中断定时操作

__asm("intfiq,irq");

uiTimecont=0;

}

//=============================================================

//语法格式:

voidBackUp();

//实现功能:

后退子函数

//参数:

//返回值:

//=============================================================

voidBackUp()//倒退

{

PlaySnd(S_DCZY,3);//提示

*P_IOB_Data=0x0200;//倒退

*P_INT_Mask|=0x0004;//以下为中断定时操作

__asm("intfiq,irq");

uiTimecont=0;

}

//=============================================================

//语法格式:

voidTurnLeft();

//实现功能:

左转子函数

//参数:

//返回值:

//====================================================

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

当前位置:首页 > 求职职场 > 简历

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

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