51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 课题设计文章 > 详细内容
多功能语音控制小车—软件设计
发布时间:2009/6/4  阅读次数:1536  字体大小: 【】 【】【

作者:唐芳体 攀枝花学院电气信息工程学院

多功能语音控制小车­­­——软件设计
唐芳体 攀枝花学院电气信息工程学院,攀枝花 617000
目   录
  
文 摘  
       随着电子业的发展,自动化已不再是一个新鲜的话题,无人驾驶的小汽车也必将进入实用阶段,本系统模拟将来的智能小车。根据开始录制的语音命令来控制启动、停止、返回和语音辩识,并且能自动避开障碍物,进行前行和倒退。利用金属传感器和黑白传感器来控制电机的正反转和控制电磁铁的吸合与断电,从而达到让小车能够清理道路上的小铁块。利用光电检测器检测道路上的障碍物,控制电动小汽车行使状态,并自动记录往返距离,显示小车所走过的路程。在整个行程中如果遇到正前方的障碍物将倒退一段距离后拐弯正向前行。SPCE061A单片机是继m’nSP系列产品SPCE500A等之后凌阳科技推出的又一个16位结构的微控制器,它具有体积小、集成度高、可靠性好且易于扩展、具有较强的中断处理能力、功能强、效率高的指令系统、低功耗、低电压等特点。SPCE061A单片机可应用在很多领域里如:家用电器控制器、仪器仪表、工业控制、智能家居控制器、通讯产品、语音识别类产品等领域。
关键词   
SPCE061A单片机;语音辨识;红外传感器;霍尔元件;金属传感器;共阴极数码管LG5641AH
  
       随着计算机新技术不断地涌现和VLSI设计技术的迅猛发展,计算机无论在系统体系结构还是在性能上都发生了巨大的变化。计算机一方面向着高速、智能化的巨型机方向发展,另一方面向着嵌入式微型机的方向发展。其中,微型计算机以其性能和容量不断提高,而价格不断下降的趋势,使其在社会各个领域乃至家庭生活中发挥着越来越大的作用。
       当今微型计算机技术的发展形成两大技术分支:一是以微处理器MPU为核心组成的通用微机系统;另一分支是发展面向对象的用于实时测控领域的微控制器MCU,亦称单片微计算机(单片机)。随着超大规模高速集成电路的发展,现代电子技术的设计与应用进入了单片系统SOC(System On a Chip)阶段,从而使单片机的设计与应用技术发生了深刻的变化。SOC的设计要从整个系统的功能及性能出发,把微处理器(MPU)、芯片结构、数字/模拟等外围器件全部放置在一块芯片上,完成整个系统的功能,真正实现“系统单片机”。故SOC为单片机的应用提供了更广阔的应用前景及更强的生命力。
       台湾凌阳科技股份有限公司近年推出的 单片机就是基于SOC的新型的数/模混合的系统级芯片。在一个芯片内集成了单片机数据采集或控制系统所需的模拟和数字外设及其它功能部件。凌阳公司推出的单片机有8位、16位共50多种不同的IC芯片型号及其产品,以适用不同的应用领域,用户可根据需要选择相应的单片机系统。凌阳单片机顺应了单片机技术的发展趋势,其系统芯片具有集成度高、数/模混合、功能全、低功耗、低电压等特点。另外,凌阳单片机还增加了适合于DSP的某些特殊指令;其中SPCE061A单片机还嵌入了LCD控制/驱动和双音多频发生器功能。

1   SPCE061A单片机的介绍

1.1   SPCE061A概述

       随着单片机功能集成化的发展,其应用领域也逐步的由传统的控制扩展为控制处理、数据处理以及数值信号处理(DSP,digital signal processing)等领域。凌阳16位单片机就是为适应这种发展而设计的。它的CPU内核采用凌阳最新推出的 (microcontroller and signal processor)16位微处理器芯片。SPCE061A中只内嵌32K字的闪存FLASH ROM。较高的处理速度使 能非常容易地、快速地处理复杂的数字信号。因此SPCE061A微控制也特别适合在数字语音识别领域应用。
       SPCE061A在2.6~3.6V工作电压范围内工作频率范围为0.32~49.152MHz,较高的工作速度使其应用领域更加扩宽。SPCE061A中包括2K字的SRAM和32K字的闪存ROM,仅占一页存储空间;32位可编程的多功能I/O端口;两个16位定时器/计数器;32768Hz实时时钟;低电压复位/低电压检测功能,8通道10位模/数转换输入并具有内置自动增益控制功能的麦克风输入方式;双通道10位DAC方式的音频输出功能等。SPCE061A尤其适合于数字声音和音识别领域。

1.2   SPCE061A主要性能

(1)                       16位μ’nSP™微处理器;
(2)                       工作电压(CPU) VDD为2.4~3.6V (I/O) VDDH为2.4~5.5V;
(3)                       CPU时钟:0.32MHz~49.152MHz ;
(4)                       内置2K字SRAM;
(5)                       内置32K FLASH;
(6)                       可编程音频处理;
(7)                       晶体振荡器;
(8)                       系统处于备用状态下(时钟处于停止状态),耗电仅为2μA@3.6V;
(9)                       2个16位可编程定时器/计数器(可自动预置初始计数值);
(10)               2个10位DAC(数-模转换)输出通道;
(11)               32位通用可编程输入/输出端口;
(12)               14个中断源可来自定时器A / B,时基,2个外部时钟源输入,键唤醒;
(13)               具备触键唤醒的功能;
(14)               使用凌阳音频编码SACM_S240方式,能容纳210秒的语音数据;
(15)               锁相环PLL振荡器提供系统时钟信号;
(16)               32768Hz实时时钟;
(17)               7通道10位电压模-数转换器(ADC)和单通道声音模-数转换器;
(18)               声音模/数转换器输入通道内置麦克风放大器和自动增益控制功能
(19)               具备串行设备接口;
(20)               具有低电压复位(LVR)功能和低电压监测(LVD)功能;
(21)               内置在线仿真电路ICE(In- Circuit Emulator)接口;
(22)               具有保密能力;
(23)               具有WatchDog功能;

1.3   SPCE061A芯片引脚功能说明

                                                             表1芯片引脚功表

IOA0~IOA15
I/O口A共16个
IOB0~IOB15  
I/O口B共16个                                                                             
XRESB
复位输入。若这个脚输入低电平时会使控制器被重置复位
ICE_EN
ICE使能端
ICE_SCK
ICE时钟端
ICE_SDA
ICE数据端
DAC1
音频输出通道1
DAC2
音频输出通道2
VREF2
2V参考电压输出端
AGC
语音输入自动增益控制端
VCM
ADC参考电压输出端
VDD(第7脚)
琐相环电源
VDD(第15脚)                      
数字电源

1.4   SPCE061A的输入/输出接口(I/O)

       输入/输出接口(也可简称为I/O口)是单片机与外设交换信息的通道。输入端口负责。
从外界接收检测信号、键盘信号等各种开关量信号。输出端口负责向外界输送由内部电路产生的处理结果、显示信息、控制命令、驱动信号等。μ’nSP™内有并行和串行两种方式的I/O口。并行口线路成本较高,但是传输速率也很高;与并行口相比,串行口的传输速率较低但可以节省大量的线路成本。SPCE061A有两个16位通用的并行I/O口:A口和B口。这两个口的每一位都可通过编程单独定义成输入或输出口。
       A口的IOA0 ~IOA7用作输入口时具有唤醒功能,即具有输入电平变化引起CPU中断功能。在那些用电池供电、追求低能耗的应用场合,可以应用CPU的睡眠模式(通过软件设置)以降低功耗,需要时以按键来唤醒CPU,使其进入工作状态。例如:手持遥控器、电子字典、PDA、计算器、移动电话等。
SPCE061A 的I/O端口结构
       SPCE061A提供了位控制结构的I/O端口,每一位都可以被单独定义用于输入或输出数据。通常,对某一位的设定包括以下3个基本项:数据向量Data、属性向量Attribution和方向控制向量Direction。3个端口内每个对应的位组合在一起,形成一个控制字,用来定义相应I/O口位的输入输出状态和方式。数据向量Data、属性向量Attribution和方向控制向量。
       下表2给出了位数据向量_Data、属性向量_Attrib和方向控制向量_Dir的状态及并行I/O口的相应工作方式。
                                                 表2端口状态表

_Dir
_Attrib
_Data
口位状态
口位方式描述
唤醒功能
0
0
0
输入
带下拉电阻的输入口
0
0
1
输入
带上拉电阻的输入口
0
1
0
输入
悬浮的输入口
0
1
1
输入
悬浮的输入口
1
0
0
输出
经数据反相器输出高电平
1
0
1
输出
经数据反相器输出低电平
1
1
0
输出
经数据缓存器输出低电平
1
1
1
输出
经数据缓存器输出高电平

  
Direction的说明如下:
(1)   方向向量_Dir位:该位用于设定I/O口的对应位是用做输入还是用做输出位,设置如下:0——输入,1——输出。
(2)   属性向量_Attrib位:该位用于定义I/O口的工作方式,在I/O口位作为输入和输出时的作用不同。
当A口位输入状态下,属性向量_Attrib设置如下:
0——带上拉或下拉电阻式输入;
1——悬浮式输入;
当A口位输出状态下,属性向量_Attrib设置如下:
0——经反相器反相输出;
1——经缓冲器同相输出;
(3)   数据向量_Data位:在该位的输入状态下被写入时,与Attrib位组合在一起形成输入方式的控制字,其功能如下:
00——带唤醒功能的下拉电阻式输入;
01——带唤醒功能的上拉电阻式输入;
10——带唤醒功能的悬浮式输入;
11——无唤醒功能的悬浮式输入。
_Data位在该位的输出状态下被写入的是输出数据,数据输出是同相还是经反相输出则取决与_Attrib位的设置。

1.5   模/数转换器ADC

       在单片机的应用系统中,常常需要将检测到的连续变化的模拟量,如温度、压力、流量、转速、声音、光亮度等转换成数字信号才能输入到单片机中进行处理。这种将模拟量转换成数字量的过程称为A/D转换。
SPCE061A单片机中的ADC的控制方式
       SPCE061A内置8通道10位模/数转换器ADC,其中7个通道用于将模拟量信号(例如电压信号)转换为数字量信号,可以直接通过引线(IOA0~IOA6)输入。另外一个通道只用于语音输入,即通过内置自动增益控制放大器的麦克风通道(MIC_IN)输入。实际上可以把模/数转换器看作是一个实现模/数编码器。在ADC内,由数/模转换器DAC0和逐次逼近寄存器SAR组成逐次逼近式模/数转换器。向P_ADC_Ctrl(写)(7015H)单元第0位(ADE)写入1用以激活ADC。系统默认设置为ADE=0,即屏蔽ADC。
       ADC采取自动方式工作。硬件ADC的最高速率限定为( /32/16)Hz,如果速率超过此值,当从P_ADC(读)(7014H)单元读出数据时会发生错误。
       在ADC自动方式被启用后,会产生出一个启动信号,即RDY=0。此时,DAC0的电压模拟量输出值与外部的电压模拟量输入值进行比较,以尽快找出外部的电压模拟量的数字量输出值。逐次逼近式控制首先将SAR中数据的最高有效位试设为1,而其它位则全设为0,即1000000000B。这时,DAC0输出电压(1/2满量程)就会与输入电压进行比较。如果> ,则保持原先设置为1的位(最高有效位)仍为1;否则,该位为被清0。接着,逐次逼近式控制又将下一位试设为1,其余低位依旧为0,即1100000000B, 进行比较的结果若 > ,则仍保持原先设置位的值,否则该位清0。这个逐次逼近的过程一直会延续到10位中的所有位都被测试之后,A/D转换的结果保存在SAR内。
       当10位A/D转换完成时,RDY会被置1。此时,用户通过读取P_ADC(7014H)或P_ADC_MUX_Data(702CH)单元可以获得10位A/D转换的数据。而从该单元读取数据后,有会使RDY自动清0来重新开始进行A/D转换。若未读取P_ADC或P_ADC_MUX_Data单元中的数据,RDY仍保持为1,则不会启动下一次的A/D转换。外部信号由LIN_IN[1~7]即IOA[0~6]或通道MIC_IN输入。从LIN_IN[1~7]输入的模拟信号直接被送入缓冲器P_ADC_MUX_Data;从MIC_IN输入的模拟信号则要经过缓冲器和放大器。AGC功能将通过MIC_IN通道输入的模拟信号的放大值控制在一定范围内然后放大信号经采样—保持模块被送至比较器参与A/D转换值的确定,最后送入P_ADC。

1.6   DAC方式的音频输出

       SPCE061A提供的音频输出方式为双通道DAC方式。在此方式下,DAC1、DAC2转换输出的模拟量电流信号分别通过AUD1和AUD2引脚输出,输出的数字量分别写入P_DAC1和P_DAC2。
(1) P_DAC2(读/写)(7016H)
       在DAC方式下,该单元是一个带10位缓冲寄存器DAR2的10位D/A转换单元(DAC2)。
P_DAC2写:通过此单元直接写入10位数据到10位缓存器DAR2,来琐存DAC2的输入数字量值(无符号数)。
P_DAC2读:从DAR2内读出10位数据。
(2) P_DAC1(读/写)(7017H):该单元为一个带10位缓存器(DAR1)的10位D/A转换单元(DAC1)。用于向DAR1写入或从其中读出10位数据。
(3) P_DAC_Ctrl(写)(702AH)
DAC音频输出方式的控制单元,其中第5~8位用于选择DAC1输出方式下的数据琐存方式;第3、4位用来控制A/D转换方式;第1位总为0,用于双DAC音频输出。

1.7   看门狗计数器(WatchDog)

       SPCE061A的WatchDog的清除时间周期为0.75s。因为WatchDog的溢出复位信号WatchDog_Reset是由4Hz时基信号经4分频之后产生的,即每4个4Hz时基信号(1s)将会产生一个WatchDog_Reset信号,而清除WatchDog的WatchDog_Clear信号却可以发生在4Hz信号(0.25s)之间的任意一个时刻点上。假如WatchDog_Clear信号发生在4Hz信号尾端的0.01s即第0.25s时刻,此时虽然WatchDog被清掉,但由于它发生在4Hz信号之后,再经3个4Hz信号即0.75s,如果一直没有WatchDog_Clear信号,便会产生出一个WatchDog_Reset信号。
       当然,如果WatchDog_Clear信号发生在4Hz信号始端的0.01s,则经过0.99s若无WatchDog_Clear信号便会产生WatchDog_Reset信号。因此,清除WatchDog的时间周期为0.75s。
       清除WatchDog只需写入P_WatchDog_Clear单元‘0x0001’即可。此外,若32768Hz振荡器被打开,则在空闲方式期间WatchDog功能是被激活的。

2   指令系统

2.1   指令系统的概述及符号约定

       指令是CPU执行某种操作的命令。微处理器(MPU)或微控制器(MCU)所能识别全部指令的集合称为指令系统或指令集。指令系统是制造厂家在设计CPU时所赋予它的功能,用户必须正确的书写和使用指令。因此学习和掌握指令的功能与应用非常重要,是程序设计的基础。本章将详细的介绍SPCE061A指令系统的寻址方式和各种指令。
μ’nSP™单片机指令按其功能可划分为:
(1) 数据传送指令,包括立即数到寄存器、寄存器到寄存器、寄存器到存储器存储器到寄存器的数据传送操作;
(2) 算术运算,包括加、减、乘运算;
(3) 逻辑运算,包括与、或、异或、测试、移位等操作;
(4) 转移指令,包括条件转移、无条件转移、中断返回、子程序调用等操作;
(5) 控制指令,如开中断、关中断、FIR滤波器的数据的自由移动等操作。
按寻址方式划分,可分为以下几类:
       立即数寻址这种寻址方式是操作数以立即数的形式出现,例如:R1 = 0x1234,是把16进制数0x1234赋给寄存器R1。
       存储器绝对寻址这种寻址方式是通过存储器地址来访问存储器中的数据,例如:R1 = [0x2222],访问0x2222单元的数据。
       寄存器寻址这种寻址方式是操作数在寄存器中,例如:R1 = R2,是把寄存器R2 中的数据赋给寄存器R1。
       寄存器间接寻址这种寻址方式是操作数的地址由寄存器给出,例如:R1 = [BP],是把由BP指向的内存单元的数据送寄存器R1。
       变址寻址这种寻址方式下,操作数的地址由基址和偏移量共同给出,例如:R1 = [BP+0x34]。

2.2   数据传送指令

       数据传送指令是把源操作数传送到指令所指定的目标地址。数据传送操作属复制性质,而不是搬家性质。指令执行后,源操作数不变,目的操作数为源操作数所代替。通用格式是:
<目的操作数>=<源操作数>
源操作数可以是:立即数、寄存器直接寻址、寄存器间接寻址、直接地址寻址、变址寻址等。

2.3   伪指令

       μ’nSP™汇编伪指令与汇编指令不同,它不会被编译,而仅被用来控制汇编器的操作。伪指令的作用有点像语言中的标点符号,它能使语言中的句子所表达意思的结构更加清晰而成为语言中不可缺少的一部分。在汇编语言中正确使用伪指令,不仅能使程序的可读性增强,且使汇编器的编译效率倍增。
伪指令的语法格式及特点
       伪指令可以写在程序文件中的任意位置,但在其前面必须用一个小圆点引导,以便与汇编指令区分开。伪指令行中方括弧里的参量是任选项,即不是必须带有的参量。如果某一个参量使用双重方括弧括起来,则说明这个任选项参量本身就必须带着方括弧。例如[[count]]表示引用该任选参量时必须写出[count]才可。
μ’nSP™的汇编器规定的标准伪指令不必区分字母的大小写,亦即书写伪指令时既可全用大写,也可全用小写,甚至可以大小写混用。但所有定义的标号包括宏名、结构名、结构变量名、段名及程序名则一律区分其字母的大小写。

3   接口设计

3.1   接口电路方框图及说明

电路方框图如下图1所示:
                                                                 图1小车接口框图
       主控元件采用凌阳SPCE061A单片机,属于凌阳u’nSP™系列产品的一个16位结构的微控制器。SPCE061A里只内嵌32K字的闪存(FLASH),但用在此系统上已经绰绰有余。较高的处理速度使u’nSP™能够非常容易地、快速地处理复杂的数字信号。因此以u’nSP™为核心的SPCE061A微控制器也适用在数字语音识别应用领域。SPCE061A在2.6V~3.6V工作电压范围内的工作速度范围为0.32MHz~49.152MHz,较高的工作速度使其应用领域更加拓宽。2K字SRAM和32K字FLASH仅占一页存储空间,32位可编程的多功能I/O端口;两个16位定时器/计数器;32768Hz实时时钟;低电压复位/监测功能;8通道10位模-数转换输入功能并具有内置自动增益控制功能的麦克风输入方式;双通道10位DAC方式的音频输出功能,这就为本系统的特定人辨识和语音播报打下了基础。
       采用凌阳SPCE061A十六位单片机,对小车的整个行驶过程进行实时监控,完成所有功能需要24个I/O口,由于凌阳SPCE061A单片机提供32个I/O口,一片即可实现所有功能,这为设计过程提供了极大方便。其主要设计思想是:在小车上安装一个霍尔元件,利用单片机的IOB3外部中断判别轮胎转数的结果用来计算路程;安装两个检测障碍物的光电检测器和一个碰撞开关,利用IOB5、IOB6用扫描的方式来控制拐弯和返回;安装一个金属传感器用来检测轨道上的小铁块,并用一个电机来控制电磁铁的升降来拾起轨道上的小铁块。再安装了一个黑白传感器用来判断装小铁块的盒子的位置,让其能够正确的落入盒子里面。利用单片机的IOB8-IOB13控制继电器选择小车的正、反向和左、右转;凌阳SPCE061A十六位单片机提供了丰富的时基信源和时基中断,给设计者以大量的选择空间,并给设计者提供精确的时基计数,其加减速通过大功率电阻消耗功率来实现。

3.2   传感器原理及应用

       在当今信息化时代发展过程中,各种信息的感知、采集、转换、传输和处理的功能器件-传感器,已经成为各个应用领域,特别是自动检测、自动控制系统中不可缺少的重要技术工具。
       传感器是信息采集系统的首要部件,是实现现代化测量和自动控制(包括遥感、遥测、遥控)的主要环节,是现代信息产业的源头,又是信息社会赖以存在和发展的物质基础与技术基础。

3.2.1   传感器的定义与组成

       传感器(Transducer或sensor)有时亦被称为换能器、变换器、变送器或探测器。主要特征是能感知和检测某一形态的信息,并将其转换成另一形态信息。因此传感器是指那些对被测对象的某一确定的信息具有感受(或响应)与检出功能,并使之按照一定规律转换成与之对应的有用输出信号的元器件或装置。
   
                图2 传感器组成框图
       传感器一般是利用物理、化学和生物等学科的某些效应或机理按照一定的工艺和结构研制出来的。因此,传感器的主成的细节有较大差异,但是,总的来说,传感器应由敏感元件、转换元件和其他辅助部件主成,如图2所示。敏感元件是指传感器中能直接感受(或响应)与检出被测对象的待测信息(非电量)的部分,转换元件是指传感器中能将敏感元件所感受(或响)出的信息直接转换成电信号的部分。

3.2.2   传感器分类

       传感器的品种很多,原理各异,因此可以把传感器分成4大类:
(1)       按工作机理分类,这种分类方法是以其原理划分,将物理、化学和生物等学科的原理、规律、效应作为分类依据。
(2)       按被测量分类,这种分类方法是按被测量的性质不同而划分。目前把不同的被测量的传感器分为物理传感器、化学量传感器和生物传感器三大类。
(3)       按敏感材料分类,这种分类方法是按制造传感器的材料分类。
(4)       按能量关系分类,根据能量关系分类,可将传感器分为有源传感器和无源传感器两大类。

3.3   光电传感器

       光电检测器是一种将光量的变化转换为电量变化的传感器。它的物理基础就是光电效应。光电效应分为外光电效应和内光电效应。
          
                                                     图3   检测器接线图
       光电检测器的工作原理:当外加电压一定时,当电流的大小和入射光的强度成正比例,这样光电检测器能把强弱变换的光转换成强弱变换的电流。在本系统中,为了确定障碍物,加入障碍物检测的光电传感器,根据小车所处的位置改变行驶状态,所使用的光电传感器为市场上普通的光电传感器,其型号为764型输出形式为晶体管集电极开路输出。接4.7k的上拉电阻,测量范围为1.5 ~18.5cm,实际安装距地面为2cm。在没检测到障碍物时Uo输出为低电平,在检测到障碍物时Uo将与传感器内部电路断开,因而加一个上拉电阻,此时将输出高电平。把光电检测器输出的信号接入SPCE061A单片机的IOB5和IOB6口,用来控制小车的两个电机正反转动,使小车能够避开障碍物。在检测障碍物的过程中采用查询方式(即随着小车的运行轨迹,光电传感器便检测小车前方有无障碍物,直到检测到障碍物时就发出指令,使小车避开障碍物,随后继续检测直到小车停止)。
光电探测器的性能参数:

3.4   霍尔传感器

       霍尔传感器是利用霍尔效应实现磁电转换的一种传感器,它具有灵敏度高、线形度好、稳定性高、体积小和耐高温等特性,它已经广泛应用于非电量测量、自动控制、计算机装置和现代军事技术等各个领域。
霍尔效应是半导体中自由电荷受磁场中洛仑兹力作用而产生的。
       设霍尔元件为N型半导体,当它通以电流I时,半导体中的自由电荷即载流子受到磁场中洛仑兹力 的作用,其大小为
                                                   =-evB                                                             (1)
式中v为电子速度,B为垂直于霍尔元件表面的磁感应强度。使电子向垂直于B和自由电子运动方向偏移,其方向符合右手螺旋定律,即电子有向某一端积聚的显现,使半导体一端面产生负电荷积聚,另一端面则为正电荷积聚。由于电荷积聚,产生静电场,即为霍尔电场。该静电场对电子的作用力 与洛仑兹力方向相反,将阻止电子继续偏转,其大小为
=-e =-e  
                                           (2)
式中 为霍尔电场,e为电子电量。

3.5   红外探测器

       红外辐射就是红外光,其波长从1—1000um。红外辐射的物理本质是热辐射。物体的温度越高,辐射的红外线越多,红外辐射的能量就越强。红外光具有反射、折射、散射、干涉、吸收等特性。
       红外辐射的基本定律:(1) 基尔霍夫定律,它指出,一个物体向周围辐射热能的同时也吸收周围物体的辐射能。如果几个物体处于同一温度场中,各物体的热发射本领正比于它的吸收本领,这就是基尔霍夫定律,可由下式表示: ,式中 是物体在单位面积和单位时间内发射出的辐射能; a是物体的吸收系数; 是常数,其值等于黑体在相同条件下发射出的辐射能。黑体是在任何温度下全部吸收任何波长辐射的物体,黑体的吸收本领与波长和温度无关,即a =1。黑体吸收本领最大,但是加热后,它的发射热辐射也比任何物体都要大。(2) 斯芯藩-波尔兹曼定律,物体温度越高,它辐射出来的能量越大。可用下面的公式表示: ,式中 是某物体在温度T时单位面积和单位时间的红外辐射总能量; 是斯芯藩-波尔兹曼常数( =5.6697 W/ ); 是比辐射率,即物体表面辐射本领与黑体辐射本领之比值,黑体的 =1;T是物体的绝对温度。物体温度越高,其表面所辐射的能量就越大。(3) 维恩位移定律,热辐射发射的电磁波中包含着各种波长。实验证明,物体峰值辐射波长 与物体的自身的绝对温度T成反比。即 = ( ),称为维恩位移定律。它的峰值辐射波长随温度升高向短波方向偏移。当温度不很高时,峰值辐射波长在红外区域。
       红外探测器是红外检测系统中最重要的器件之一,按工作原理可分为“热探测器”和“光子探测器”两类。
(1)   热探测器
     热探测器在吸收红外辐射能后温度升高,引起某种物理性质的变化,这种变换与吸收的红外辐射能成一定的关系。常用的物理现象有温差热电现象、金属或半导体电阻阻值变化现象、热湿电现象、气体压强变化现象、金属热膨胀现象、液体薄膜蒸发现象。因此只要检测出上述变化,即可确定被吸收的收红外辐射能大小,从而得到被测非电量值。
热电探测器主要有热敏电阻型、热电偶型、高莱气动型和热湿电型。
热湿电型探测器:热湿电型探测器是一种具有极化现象的热晶体或称“铁电体”。铁电体的极化强度(单位面积上的电荷)与温度有关。当红外辐射照射到已经极化的铁电体薄片表面上时,引起薄片温度升高,使其极化强度降底,表面电荷减少,这相当于释放一部分电荷,所以叫热湿电型探测器。
(2)   光子探测器
     光子探测器是利用某些半导体材料在入射光的照射下,产生光子效应,使材料电学性质发生变化。通过对电学性质变化的探测,可以了解红外辐射的强弱。利用光子效应所制成的红外探测器,统称光子探测器。其主要特点是灵敏度高,响应速度快,具有较高的响应频率。但它一般需在底温下工作,探测波段较窄。
按照光子探测器的工作原理,一般可分为内光探测器和外光探测器两种,前者又分为光电导探测器、光电伏特器和光磁电探测器三种。

3.6   行驶路程计算

       为了能准确的计算出小车行驶的路程,用霍尔传感器来检测小车车轮转过的转数N,然后测量出小车车轮的周长R,而小车所行驶的路程S=N*R。
       霍尔元件就是一种很好的可用于车轮转数计数的元件。在普通转盘计数的仪表中加装霍尔元件和磁铁,即可构成基于磁电转换技术的传感器。霍尔元件固定安装在计数转盘附近,永磁铁安装在计数盘位上,当转盘每转一圈,永磁铁经过霍尔元件一次即在信号端产生一个计量脉冲。由于霍尔电压很微弱(mV级),需用霍尔集成电路进行处理,如图4所示。无论信号转子的哪个叶片通过空气间隙时,霍尔信号发生器都将产生一个电位由高到低的脉冲信号直接送IOB3作外部中断源,信号转子通过霍尔元件将产生一个中断,此中断的个数即为车轮转过的转数。把此转数送到定义好的显示函数中,并与初始化时测量到车轮周长的值相乘,最后把结果送入LG5641AH进行动态显示。
      
                   图4 霍尔元件接线图

3.7   显示路程

       所谓LED显示就是通过发光二极管芯片的适当连接(包括串联和并联)和适当的光学结构,可构成发光显示器的发光段或发光点。由这些发光段或发光点可以组成数码管、符号管、米字管、矩阵管、电平显示器管等等。通常把数码管、符号管、米字管共称笔画显示器,而把笔画显示器和矩阵管统称为字符显示器。
LED显示器结构
       基本的半导体数码管是由七个条状发光二极管芯片排列而成的,可实现0~9的显示。其具体结构有反射罩式、条形七段式、单片集成式多位数字式等。
       (1) 反射罩式数码管一般用白色塑料做成带反射腔的七段式外壳,将单个LED贴在与反射罩的七个反射腔互相对位的印刷电路板上,每个反射腔底部的中心位置就是LED芯片。在装反射罩前,用压焊方法在芯片和印刷电路上相应金属条之间连好φ30μm的硅铝丝或金属引线,在反射罩内滴入环氧树脂,再把带有芯片的印刷电路板与反射罩对位粘合,然后固化。
       反射罩式数码管的封装方式有空封和实封两种。实封方式采用散射剂和染料的环氧树脂,较多地用于一位或双位器件。空封方式是在上方盖上滤波片和匀光膜,为提高器件的可靠性,必须在芯片和底板上涂以透明绝缘胶,这还可以提高光效率。这种方式一般用于四位以上的数字显示(或符号显示)。
     (2) 条形七段式数码管属于混合封装形式。它是把做好管芯的磷化镓或磷化镓圆片,划成内含一只或数只LED发光条,然后把同样的七条粘在日字形“可伐”框上,用压焊工艺连好内引线,再用环氧树脂包封起来。
     (3) 单片集成式多位数字显示器是在发光材料基片上(大圆片),利用集成电路工艺制作出大量七段数字显示图形,通过划片把合格芯片选出,对位贴在印刷电路板上,用压焊工艺引出引线,再在上面盖上“鱼眼透镜”外壳,它们适用于小型数字仪表中。
(4) 符号管、米字管的制作方式与数码管类似。
     (5) 矩阵管(发光二极管点阵)也可采用类似于单片集成式多位数字显示器工艺方法制。
LED显示器分类:
     (1) 按字高分,笔画显示器字高最小有1mm(单片集成式多位数码管字高一般在2~3mm)。其他类型笔画显示器最高可达12.7mm(0.5英寸)甚至达数百mm。
     (2) 按颜色分有红、橙、黄、绿等数种。
     (3) 按结构分有反射罩式、单条七段式及单片集成式。
     (4) 从各发光段电极连接方式分有共阳极和共阴极两种。
       所谓共阳方式是指笔画显示器各段发光管的阳极(即P区)是公共的,而阴极互相隔离。
       所谓共阴方式是笔画显示器各段发光管的阴极(即N区)是公共的,而阳极是互相隔离的。
  图5   LED动态扫描驱动法
动态扫描驱动方法        
       如图5为动态扫描驱动方法接线图。图中的数码管的阴极是否接地,由A1、A2控制开关晶体管T1/T2导通或截止来决定。如果在第(1)个数码管显示“1”,第(2)个数码管显示“2”,必须首先A1为高电平,A2为低电平。这样就选择了第(1)个数码管,而关闭了第(2)个数码管。驱动电路在b、c段送高电平,其余段送低电平。这样第(1)个数码管就显示了“1”,由于T2截止,第(2)个数码管不可能亮。等待一定时间后,使A1为低电平,A2为高电平,选择了第(2)个数码管驱动电路在a、b、d、e、g段送高电平,其余段送低电平。这样第(2)个数码管就显示了“2”,同样,由于T1截止,不可能在第一个数码管上显示。等待一段时间后又从新选择第(1)个数码管并显示“1”。
只要重复频率超过一定的数值(大于24Hz)利用人眼的残留效应,就看到了第(1)个数码管显示的“1”,第(2)个数码管显示的“2”。用这种驱动方法占用的输出驱动线少,仅为7加数码管个数,缺点是亮度较低。
          
                                             图6   LED外围接线图
       本系统采用共阴极数码管LG564H进行动态显示,LG5641AH具有四位数码管,这四个数码管的段选a、b、c、d、e、f、g分别接在一起,每一个都拥有一个共阴的位选端,通过动态显示可轮流显示时间和路程,这有利于节省I/O口。如图6所示的精度为1S,显示路程的精度为0.01m。用IOB8~IOB11口作为位选控制, IOA8~IOA11口传输要显示的数据,数据线和位选线直接接凌阳SPCE061A单片机的I/O口即可,因为I/O口输出电流很小不会对LED造成损坏,它的电压值却足以驱动LED,这不像别的单片机还要外接驱动电路和电阻,采用凌阳SPCE061A单片机大大减化了设计过程和硬件电路。

4   中断系统

4.1   中断的概述

       中断是为处理器对外界异步事件具有处理能力而设置的,中断技术的引入把计算机的发展和应用大大地推进一步。因此中断功能的强弱已成为衡量一台计算机性能的重要指标。
(1) 中断
       中断是指计算机在执行某一程序的过程中,由于计算机系统内、外的某种原因,而必须终止原程序的执行,转去执行相应的处理程序,待处理结束之后再回来继续执行被终止的原程序过程。
中断技术能实现CPU与外部设备的并行工作,提高CPU的利用率以及数据的输入/输出效率;中断技术也能对计算机运行过程中突然发生的故障做到及时发现并进行自动处理如:硬件故障、运算错误及程序故障等;中断技术还能使我们通过键盘向计算机发出请求,随时对运行中的计算机进行干预,而不用先停机,然后再重新开机等等。
(2) 中断源
       中断源是指在计算机系统中向CPU发出中断请求的来源,中断源可以人为设定,也可以
是为响应突发性随机事件而设置。如定时器中断,它的中断源即是定时器。
(3) 中断优先级
       由于在实际的系统中,往往有多个中断源,且中断申请是随机的,有时可能会有多个中断源同时提出中断申请,但CPU一次只能响应一个中断源发出的中断请求,这时CPU应响应那个中断请求?这就需要用软件或硬件按中断源工作性质的轻重缓急,给它们安排一个优先顺序,即所谓的优先级排队。中断优先级越高,则响应优先权就越高。当CPU正执行中断服务程序时,又有中断优先级更高的中断申请产生,如果CPU能够暂停对原来的中断处理程序,转而去处理优先级更高的中断请求,处理完毕后,再回到原低级中断处理程序,这一过程称为中断嵌套。具有这种功能的中断系统称为多级中断系统;没有中断嵌套功能的则称为单级中断系统。
(4) 断响应过程
1)                 在每条指令结束后系统都自动检测中断请求信号,如果有中断请求,相应的中断允许位为真(许中断),相应的总中断允许位为真(允许中断),则响应中断。
2)                 保护现场,CPU一旦响应中断,中断系统会自动的保存当前的PC和SR寄存器(入栈进入中断服务程序地址入口,中断服务程序中可以通过入栈保护原程序中用到的数据, 保护现场前,一般要关中断以防止现场被破坏。
3)                 中断服务,即为相应的中断源服务。
4)                 清相应的中断请求标志位,以免CPU总是执行该中断。
5)                 恢复现场,用堆栈指令将保护在堆栈中的数据弹出来,在恢复现场前要关中断,以防止现场被破坏,在恢复现场后应及时开中断。
6)                 返回,此时CPU将PC指针和SR内容出栈恢复断点,从而使CPU继续执行刚才被中断的程序。
在单片机中,中断技术主要用于实时控制。所谓实时控制,就是要求单片机能及时地响应被控对象提出的分析、计算和控制等请求,使被控对象保持在最佳工作状态,以达到预定的控制效果。由于这些控制参量的请求都是随机发出的,而且要求单片机必须作出快速响应并及时处理,对此,只有靠中断技术才能实现。

4.2   SPCE061A的中断系统

       SPCE061A系列单片机中断系统,是凌阳16位单片机中中断功能较强的一种,它可以提供14个中断源,具有两个中断优先级,可实现两级中断嵌套功能。用户可以用关中断指令(或复位)屏蔽所有的中断请求,也可以用开中断指令使CPU接受中断申请。每一个中断源可以用软件独立控制为开或关中断状态;但中断级别不可用软件设置。
SPCE061A的中断类型给出了三种类型的中断:软件中断、异常中断和事件中断。
(1)   软件中断
       软件中断是由软件指令break产生的中断。软件中断的向量地址为FFF5H。
(2)   异常中断
       异常中断表示为非常重要的事件,一旦发生,CPU必须立即进行处理。目前SPCE061A定义的异常中断只有‘复位’一种。通常,SPCE061A系统复位可以由以下三种情况引起:上电、看门狗计数器溢出以及系统电源低于电压低限。不论什么情况引起复位,都会使复位引脚的电位变低,进而使程序指针PC指向由一个复位向量(FFF7H)所指的系统复位程序入口地址。
(3)   事件中断
       事件中断(可简称“中断”,以下提到的“中断”均为事件中断)一般产生于片内设部件或由外设中断输入引脚引入的某个事件。这种中断的开通/禁止,由相应独立使能和相应的IRQ或FIQ总使能控制。
SPCE061A的事件中断可采用两种方式:快速中断请求即FIQ中断和中断请求即IRQ中断。这两种中断都有相应的总使能。
中断向量和中断源:
       共有9个中断向量即FIQ、IRQ0~IRQ6及UART IRQ。这9个中断向量共可安置14个中断源供用户使用,其中有3个中断源可安置在FIQ或IRQ0~IRQ2中,另有10个中断源则可安置在IRQ3~IRQ6中。
                                                       表3 中断控制表

中断源
中断优先级
中断向量
保留字
Fosc/1024溢出信号
FIQ/IRQ0
FFF8H/FFF6H _
FIQ/_IRQ0
TimerA溢出信号
FIQ /IRQ1
FFF9H/FFF6H
_FIQ/_IRQ1   
TimerB溢出信号
FIQ /IRQ2
FFFAH/FFF6H
_FIQ/_IRQ2
外部时钟源输入信号
IRQ3
FFFBH
_IRQ3
外部时钟源输入 信号EXT1
4096Hz时基信号
IRQ4
FFFCH
_IRQ4
2048Hz时基信号
1024Hz时基信号
4Hz时基信号
IRQ5
FFFDH
_IRQ5
2Hz时基信号
频选信号TMB1
IRQ6
FFFEH
_IRQ6

       SPCE061A单片机的中断系统有14个中断源分为两个定时器溢出中断、两个外部中断、一个串行口中断、一个触键唤醒中断、7个时基信号中断、PWM音频输出中断。
       从表中可以看到每个中断入口地址对应多个中断源,因此在中断服务程序中需通过查询中断请求位来判断是那个中断源请求的中断。如上表3所示。
       SPCE061A单片机有多个中断源,为了使每个中断源都能独立地被开放和屏蔽,以便用户能灵活使用,它在每个中断信号的通道中设置了一个中断屏蔽触发器,只有该触发器无效,它所对应的中断请求信号才能进入CPU,即此类型中断开放。否则即使其对应的中断请求标志位置“1”,CPU也不会响应中断,即此类型的中断被屏蔽。同时CPU内还设置了一个中断允许触发器,它控制CPU能否响应中断。SPCE061A对中断源的开放和屏蔽,以及每个中断源是否被允许中断,都受中断允许寄存器P_INT_Ctrl和P_INT_Clear及P_INT_Ctrl_New控制和一些中断控制指令。
(1)   中断控制单元P_INT_Ctrl(读/写)(7010H)
       当写中断控制单元中的某位为“1”时,即允许该位所代表的中断被开放,并关闭屏蔽中断触发器,此时当有该中断申请时,CPU会响应。否则如果该位被置0则禁止该位所代表的中断。即使有中断申请,CPU也不会响应。
当读取中断控制单元时,其主要作为中断标志,因为其每一位均代表一个中断,当CPU响应某中断时,便将该中断标志置“1”,即将P_INT_Ctrl中的某位置“1”,可以通过读取该寄存器来确定CPU响应的中断。
(2)   清除中断标志控制单元P_INT_Clear(写)(7011H)
       清除中断标志控制单元主要用于清除中断控制标志位,当CPU响应中断后,会将中断标志置因为P_INT_Clear寄存器的每一位均对应一个中断,所以如果想清除某个中断状态标志,只要将该寄存器中对应的中断位置1即可清除该中断状态标志位。该寄存器只有写的属性,读该寄存器是无任何意义的。
(3)   激活和屏蔽中断控制单元P_INT_Ctrl_New(读/写)($702DH)
当写该控制单元时,与P_INT_Ctrl功能相似。读该控制单元时,只作为了解激活那一中断的功能使用。

4.3   中断服务流程

(1) 中断入口
       所谓中断的入口即中断的入口地址,每个中断源都有自己的入口地址,当CPU响应中断后,就是通过中断入口地址进入中断服务程序。
(2) 关中断和开中断
       在一个中断执行过程中又可能有新的中断请求,但对于重要的中断必须执行到底,不允许被其它的中断所嵌套。如FIQ中断,对此,可以采用关闭中断的方法来解决,如在IRQ中断中不允许FIQ中断嵌套,就可以在IRQ中断中关闭中断,当中断服务程序执行结束后,再打开中断,去响应FIQ中断。即在现场保护之前先关闭中断系统,彻底屏蔽其它中断请求,待中断处理完成后再打开中断系统。
(3) 现场保护和现场恢复
       所谓现场是指中断时刻单片机中存储单元中的数据状态。为了使中断服务的执行不破坏这些数据或状态,以免在中断返回后影响主程序的运行,因此要把它们送入堆栈中保存起来,这就是现场保护。现场保护一定要位于中断处理程序的前面。中断服务结束后,在返回主程序前,则需要把保存的现场内容从堆栈中弹出,以恢复那些存储单元的原有内容,这就是现场恢复。现场恢复一定要位于中断处理程序的后面。
(4) 中断源判断
       因为SPCE061A中断源多于中断入口地址,所以当CPU响应中断后,经中断入口地址进入中断服务程序,通过读P_INT_Ctrl可判断产生中断请求的中断源。
(5) 中断处理
       中断处理是中断服务程序的核心内容,是中断的具体目的。
          
               图7   小车中断流程图
(6) 清中断标志位
       因为CPU是根据中断标志位来判断并进行响应中断的,除串口中断外,所有的中断标志位不是靠硬件清除,而是软件清除的,所以在中断服务程序中,必须将中断标志清除,否则CPU总是会响应该中断的。清除标志位只要在中断服务程序中即可,位置不是固定,如也可以在中断处理程序前清除中断标志。
(7) 中断返回
       中断服务程序最后一条指令必须是中断返回指令RETI,当CPU执行这条指令时,从堆栈中弹出断点PC、及SR,恢复断点重新执行被中断的程序。
       本程序的中断流程图是用单片机中的IRQ3、IRQ4、FIQ中断,首先设置中断的初始化,开中断并等待中断响应,然后判断中断的优先权,转去执行优先权高的中断FIQ中断。此中断是让小车在运动过程中停止转去执行拾铁块部分,从而控制小车在运行过程中清理轨道上的铁块。当完成此动作后,又开始判断有无中断或中断的优先权,如果外部有中断,便执行IRQ3中断,此中断是用来计算小车车轮转过圈数,并动态显示小车走过的路程。

4.4   控制小车中断子程序

       SPCE061单片机有两个外部中断,分别为EXT1和EXT2,两个外部输入脚分别为B口的IOB2和IOB3的复用脚。EXT1(IOB2)和EXT2(IOB3)两条外部中断请求输入,用于输入两个外部中断源的中断请求信, 号,并允许外部中断以负跳沿触发方式来输入中断请求信号,而用快速中断来控制小车拾铁块,它能够很快的优先作出响应。
中断程序:
.PUBLIC _FIQ
.DEFINE         P_IOB_DATA                 0x7005; //定义入口地址
.DEFINE         P_IOB_DIR                   0x7007; //定义入口地址
.DEFINE         P_IOB_ATTRI              0x7008; //定义入口地址
.DEFINE         P_INT_CTRL                0x7010; //定义入口地址
.DEFINE         P_INT_CTRL_NEW         0x702D; //定义入口地址
.DEFINE         P_INT_CLEAR              0x7011; //定义入口地址
.DEFINE         P_Watchdog_Clear     0x7012; //定义入口地址
//...............................................
.EXTERNAL _BSR_FIQ_Routine                         //定义全局
.EXTERNAL __gIsStopRecog                             //变量值为0 辨识器忙;为 1 辨识器停止
.EXTERNAL _PlayFlag,_uiSpeed                     //声明在其它文件里定义过的变量            
.PUBLIC _BREAK,_IRQ0, _IRQ1, _IRQ2, _IRQ3, _IRQ4, _IRQ5, _IRQ6, _IRQ7
.ram
.var _IRQFlag=0                                               //变量
//..................................................
.INCLUDE s480.inc;                                         //在汇编文件里包含此文件
.INCLUDE A2000.inc;                                       //包含用A2000函数的头文件
.INCLUDE resource.inc                                   //包含语音资源文件
.INCLUDE hardware.inc                                   //包含SPCE061A硬件声明头文件
.code                                                                   //定义预定义段
.PUBLIC _F_Speed                                             //声明中断入口函数
_F_Speed:
       INT OFF                                                       //关中断
       R1 = [R_InterruptStatus]                    //中断状态
       R1 |= 0x0300                                            //Enable Timer A FIQ
       [R_InterruptStatus] = R1
      [P_INT_CTRL] = R1;
       INT IRQ;                                                     //开IRQ中断
       Retf                                                             //中断返回
.TEXT                                                                   //定义预定义段
_FIQ:                                                                   //快速中断标志
       push R1,R4 to [SP]                                 //寄存器入栈
       R1 = [P_INT_Ctrl]                                   //中断控制
       R1 &= 0x2000                                             //判断是否为定时器A中断
       jz ?notTimerA                                          //当不为TIQ_TMA,则转
       R1 = [__gIsStopRecog]
       jnz ?BSR_NotBusy                                    //当为[__gIsStopRecog]为1则转至放音处理
       call _BSR_FIQ_Routine                     , ,      //为0,调用辨识子程序
       jmp ?BSR_Busy                                        //返回中断
?BSR_NotBusy:                                                //放音处理
       R2 = [_PlayFlag]
       jnz ?Play2000                                        //[_PlayFlag]为1则是播放2000
       call F_FIQ_Service_SACM_S480;         //为0,播放480
       jmp ?BSR_Busy                                        //返回中断
?Play2000:                                                      //2000播放子程序
       call F_FIQ_Service_SACM_A2000;
?BSR_Busy:                                                      //返回中断
       R1 = 0x2000
,        [P_INT_Clear] = R1                             //清出中断
       pop R1,R4 from [SP];                         //出栈恢复
       reti;                                                  
?notTimerA:                                                 //时钟源A标示
       R1 = 0x8800, ;
       [P_INT_Clear] = R1;
       pop R1,R4 from [SP];
       reti;

5   语音识别处理

5.1   音频的概述

       我们所说的音频是指频率在20 Hz~20 kHz的声音信号,分为:波形声音、语音和音乐三种,其中波形声音就是自然界中所有的声音,是声音数字化的基础。语音也可以表示为波形声音,但波形声音表示不出语言、语音学的内涵。语音是对讲话声音的一次抽象。是语言的载体,是人类社会特有的一种信息系统,是社会交际工具的符号。
       音频文件通常分为:声音文件和MIDI文件。声音文件:指的是通过声音录入设备录制的原始声音,直接记录了真实声音的二进制采样数据,通常文件较大;而MIDI文件:它是一种音乐演奏指令序列,相当于乐谱,可以利用声音输出设备或与计算机相连的电子乐器进行演奏,由于不包含声音数据,其文件尺寸较小。因此为了能够将声音录制到SPCE061A单片机中,首先就要进行语音压缩编码,让SPCE061A单片机达到高效率存储和转换资料的结果,即在保证一定声音质量的条件下,以最小的资料率来表达和传送声音信息。

5.2   SPCE061A应用程序接口API的功能介绍及应用

       SPCE061A单片机对语音的控制如录放音、合成及辨识也广泛应用在现实生活中。我们知道对于语音处理大致可以分为A/D、编码处理、存储、解码处理以及D/A等,而凌阳SPCE061A解决的方法,即SACM-LIB,该库将A/D、编码、解码、存储及D/A作成相应的模块,对于每个模块都有其应用程序接口API。
                                                                 图8   语音处理流程图
       语音播放采用凌阳科技公司提供的音频编码算法,现在PC机上录好提示语音文件(WAV文件),并经凌阳公司提供的压缩工具压缩处理成二进制文件加载到用户程序,编译连接后存储到单片机FLASH中,播放时再解压送D/A还原出语音。用于 内核的SPCE系列芯片,凌阳科技公司提供三种不同压缩率的算法,下表是各种压缩算法名称及编码率类型。

压缩算法名称
语音压缩编码率类型
SACM_A2000
16Kbits/s、20 Kbits/s、24 Kbits/s
SACM_S240
4.8 Kbits/s、7.2 Kbits/s
SACM_S480
2.4 Kbits/s

表4   压缩算法表
  
  
  
  
  
       这三种压缩算法的区别在于压缩率不同、音质也不同。SACM_A2000压缩率相对较小,音质较好,相应的资源占用较多。SACM_S240的压缩率最大,音质相对较差。SACM_S480介于这两者之间。表4给出了这三者的不同压缩率。
SACM_A2000简介
       该压缩算法压缩比较小(8:1)所以具有高质量、高码率的特点适用于高保真音乐和语音。
其相关API函数如下所示:
void SACM_A2000_Initial(int Init_Index)                         //初始化
void SACM_A2000_ServiceLoop(void)                                     //获取语音资料,填入译码队列
void SACM_A2000_Play(int Speech_Index, int Channel, int Ramp_Set) //播放
void SACM_A2000_Stop(void)                                                   //停止播放
void SACM_A2000_Pause (void)                                               //暂停播放
void SACM_A2000_Resume(void)                       //暂停后恢复
void SACM_A2000_Volume(Volume_Index)                               //音量控制
unsigned int SACM_A2000_Status(void)                               //获取模块状态
void SACM_A2000_InitDecode(int Channel)     //译码初始化
void SACM_A2000_Decode(void)                                               //译码
void SACM_A2000_FillQueue(unsigned int encoded-data)//填充队列
unsigned int SACM_A2000_TestQueue(void)     //测试队列
Call F_FIQ_Service_ SACM_A2000                                           //中断服务函数
       在本系统中用SACM_A2000模块是为让语音控制小车初始化时训练小车辩识发出命令控制小车的运行轨迹,其控制子程序为:
void PlayRespond2(int Result)                       //调用提示音
{
BSR_StopRecognizer();
          SACM_A2000_Initial(1);                                 //初始化模块
       SACM_A2000_Play(Result, 3, 3);                     //播放
       while((SACM_A2000_Status()&0x0001) != 0) //获取模块状态
       {  
SACM_A2000_ServiceLoop();                   //获取语音资料,添入译码队列
               ClearWatchDog();                                         //看门狗清除
}                                  
              SACM_A2000_Stop();                                 //停止播放
              BSR_InitRecognizer(BSR_MIC);                 //辩识器初始化
       BSR_EnableCPUIndicator();                      //启动实时检控
}            
如下图9所示:
                                                                   图9   语音控制图

5.3   语音辩识

       语音识别分为特定发音人识别(Speaker Dependent)和非特定发音人识别(Speaker Independent)两种方式。
       特定发音人识别是指语音样板由单个人训练,对训练人的语音命令识别准确率较高,而其他人的语音命令识别准确率较低或不识别。非特定发音人识别:是指语音样板由不同年龄、不同性别、不同口音的人进行训练,可以识别一群人的命令。
       语音识别分为语音样板训练和语音识别两个过程。我们将标准模式的存储空间称之为“词库”,而把标准模式称之为“样板”。所谓语音样板训练,就是将待识别的命令进行频谱分析,提取特征参数作为识别的标准模式。语音识别的过程就是提取语音命令的特征参数与词库中的样板比较,取相似度最好的样板命令序号作为识别结果。识别过程首先要滤除输入语音信号的噪音和进行预加重处理,提升高频分量,然后用线性预测系数等方法进行频谱分析,找出语音的特征参数作为未知模式,接着与预先存储的标准模式进行比较,当输入的未知模式与标准模式的特征相一致时,便被机器识别,产生识别结果输出。如果输入的语音与标准模式的特征完全一致固然好,但是语音含有不确定因素,完全一致的条件往往不存在,事实上没有人能以绝对相同的语调把一个词说两遍,因此,预先制定好计算输入语音的特征模式与各特征模式的类似程度,或距离度的算法规则固化在ROM中,把该距离最小,即最类似的模式作为识别相应语音的手段。
语音辨识也将其一些功能作成模块,并通过API调用来实现这些功能,
其相关API函数如下所示:
BSR_DeleteSDGroup(0)                                     //辨识部分初始化
BSR_GetResult()                                               //辨识处理
BSR_EnableCPUIndicator()                             //启动实时监控
TrainWord(intWordID, intRespondID)         //调用训练模块
BSR_InitRecognizer(BSR_MIC)                       //初始化识别器
                                   图10语音识别处理流程图
识别程序如下:
BSR_InitRecognizer(BSR_MIC);   //初始化识别器,包括AGC、ADC、TimerAFIQ中断
while(1)
{
res = BSR_GetResult();     //主识别函数,识别成功则结果为语音命令的顺序号
if(res > 0)                             //结果>0,表明识别成功,相应处理
}

5.4   语音训练模块

       在本程序中我们通过五条语句的训练演示特定人连续音识别,其中第一条语句为触发名称。另外三条为命令为控制小车的运行名称,训练完毕开始辨识当识别出触发名称后,开始发布命令,则会听到自己的设置。
       该程序模块包括三部分:训练样本、识别、语音提示。
       在程序中我们通过四条语句的训练演示特定人连续音识别,其中第一条语句为触发名称。另外三条为命令,训练完毕开始辨识当识别出触发名称后,开始发布命令,则会听到自己设置的应答。
                                                     图 11 语音辨识整体框图<, /DIV>
其语音训练步骤如下:
说“yeah”时训练小车的名字,听到“烦不烦”时训练成功;
       说“前进”时训练“前进”;
       说“倒退”时训练“倒退”;
说“拐就拐”时训练“左拐”;
       说“烦不烦”时训练“右拐”;
       听到两声“Yeah”后进入辨识状态,想重新训练,只要按键三,并复位即可,也可重新下载。经实验,语音训练时说话要清楚,每个语音训练两次,必须完全一样,否则不可辨识。选择比较安静的地方进行语音的训练较为合适。语音训练完成后就可以开始对单片机发出命令,当单片机识别出指令后,就开始运行程序,并控制小车开始运行。当此命令结束后,小车就停止等待下一条命令的输入。
具体流程图如图12
                                               图12 训练流程图
语音训练子函数如下所示:
int TrainWord(int WordID, int RespondID)       //命令训练
{     int res;
              PlayRespond(RespondID);                               //放音程序
       while(1)
       {   res = BSR_Train(WordID,BSR_TRAIN_TWICE);//调用训练模块
               if(res == 0) break;
switch(res)
               {
               case -1:                                                              //没有检测出声音            
                       PlayRespond, (5);
                       return –1;
               case -2:                                                              //需要重新训练一遍
                       PlayRespond(4);
                       Break;
               case -3:                                                              //环境太吵
                       PlayRespond(5);
                       return –1;              
               case -4:                                                              //数据库满
                      return –1;
               case -5:                                                              //检测出声音不同
       if(WordID == NAME_ID)    
PlayRespond(5);                                                   //两次输入名称不同
                       return –1;
               case -6:                                                                //序号错误
                       return –1;
               }
       }
       return 0;
}

6   小车行驶主程序设计

6.1   电机控制设计

       行使状态控制电路,整个小车的行驶状态由两个电机来控制,一个电机控制小车左边前后两个轮子,另一个电机控制右边前后两个轮子,当前进时,左右两轮都正转,后退时,左右两轮都反转,转弯时一个正转,一个反转,就可实现左右转弯。。在图13中,MOT1和MOT2输入高低电平即可在J1处得到正反向电压,从而可控制电机的正反转;后面的电路是由两个CMOS管和两个二极管构成的通断电路,MOSTP输入PWM就可在J2处接上电机,用于速度的控制。由于小车上没有接通断电路所以不能进行速度控制,但方法可行。另一电机控制电路与此相同,不在重述。
                                                                           图13电机控制电路图
具体控制状态表如下:
                                                       表5 控制状态表

行驶状态
IOB8
IOB9
IOB10
IOB11
IOB12
IOB13
前进
0
0
0
1
0
1
后退
0
0
1
0
1
0
左转
0
0
1
0
0
1
右转
0
0
0
1
1
0
停止
0
0
0
0
0
0

  
       其中IOB8~IOB13为输出端口,用来驱动外围电路,使其控制两个电机前进、后退、左传、右转,而要让直流电机控制小车的加速与减速就要用PWM调速控制来控制电机的运转。因为电动机转速的控制方法可分为励磁控制法和电枢电压控制法两类。这里采用PWM控制,它是利用器件的开关作用将直流电源电压转换为一定频率的方波电压加在直流电动机的电枢上,通过对方波脉冲宽度的控制来改变电枢的平均电压,从而实现电动机的转速。由于PWM调速系统中功放元件工作在开关状态,且开关频率高,它需要的大功率可控器件少,系统的工作效率高,电路实现简单,凌阳单片机能直接进行PWM输出,所以用PWM调速来控制小车的加减速是可行的。
       PWM变速控制分析如下:下图为电机正常工作是的电气波形图,曲线为电机的电感充放电电压或电流波形,电动机平均端电压为:U=Vcc t/ T=αVcc,当频率足够高时,电流连续,转速 ,所以通过对脉宽的调节可以调整电机的转速。电机的转速与电机两端的电压成比例,而电机两端的电压与控制波形的占空比成正比,因此电机的速度与占空比成比例,占空比越大,电机转得越快,当占空比α=1时,电机转速最大。在一个周期 内的导通时间为t,周期为T, α=t/T称为占空比,Vcc为电源电压。我们使用的是凌阳公司的SPCE061单片机,它是16位单片机,频率最高达到49MHz,可提供2路PWM 直接输出,频率可调,占空比16级可调,控制电机的调速范围大,使用方便。SPCE061单片机有32个I/O口, 内部设有2个独立的计数器,完全可以模拟任意频率、占空比随意调节的PWM信号输出,用以控制电机调速。在实际制作过程中,我们认为控制信号的频率不需要太高,一般在400Hz以下为宜,占空比16级调节也完全可以满足调速要求,并且在小车行进的过程中,占空比不应该太高,在直线前进和转弯的时候应该区别对待。若车速太快,则在 转弯的时候,方向不易控制;而车速太慢,则很浪费时间。一般设置在8/16以内就可以了
               图14 语音控制流程图
       该流程首先初始化系统,然后对单片机进行语音训练,让它能识别语音命令,为了识别语音的起始点,则循环执行起始点的判别程序。起始点识别出来后,就对语音进行采样,然后通过语音模块进行处理,设定阈值,然后对光电检测器返回的电压值进行采样,再与设定的阈值进行比较。如果超过了阈值,就对电机进行控制;如果没有超过阈值,则不动作,反复进行检测,使小车能顺利行驶。

6.2   拾铁块设计

       用金属传感器来判断小车行驶轨道上有无小铁块,用IOB5口来控制小车上安装电动机,并在电动机上固定一齿轮,当IOB5口输出为低电平时电动机便带动电磁铁的上升,从而把小铁块拾起来,而当IOB5口输出为高电平时电动机便带动电磁铁的下降,从新开始拾小铁块。用一个黑白传感器检测小车上自带的一个盒子,其四周为白色,底部为黑色的方型盒子,当黑白传感器检测到盒子的底部时,黑白传感器便输出一个高电平用来控制IOB4口,并从IOB4口来控制电磁铁的导通与断开,从而来控制电磁铁拾起或放下小铁块。当完成整过过程时,再判断小车前有无小铁块,若有继续前面的动作,直到IOB5口输出低电平。这时小车左右轮前的光电检测器开始检测前方有无障碍物,若有障碍物便在光电检测器的两个输出口IOB6和IOB7输出低电平,用来控制小车的转弯。
       此电机控制原理:用IOB4~IOB5口输出不同的值来控制继电器的吸合,从而达到控制电机正反转。当IOB4口接的金属传感器检测到小铁块时,输出为高电平‘1‘,此时继电器通电使RE1闭合,这时电机正转;而IOB5口接的黑白传感器此时没有检测到盒子的位置,输出为‘0’,RE2仍然是断开的电机反转接线不作用。电机正转就会把电磁铁提升起来,这时候黑白传感器开始工作,当检测到盒子的准确位置时,电磁铁断电磁性消失,小铁块就会落入盒子中。在这同时IOB5口输出高电平‘1’,而IOB4口输出底电平‘0’,电机开始反转让电磁铁回到起时位置,又开始新的工作。
  其电动机控制原理图如下所示:
                  
                                           图15 电机状态控制图
       在这里为了能让小车正确把小铁块放入盒子里面,就是能够让黑白传感器随着电磁铁一起控制,把黑白传感器与电磁铁一起固定,并放在同一平面上,在电磁铁吸合并产生磁性的时候,黑白传感器便开始判断盒子所处的位置,并不断的调节电磁铁的位置,让电磁铁能够到达盒子的位置,此时IOB4便输出高电平,电磁铁断开磁性消失,小铁块便落入盒子中。
       在整个运动过程中,能够让小车是先判断有无障碍物还是金属小铁块,就要在中断判断谁是优先权,这样就不会在同时判断到物体的时候发生紊乱,因此我在编写程序的时候就首先给黑白传感器的中断响应优先权,其次才是光电检测器的中断响应。
工作流程图如图16所示:
                        
                                                     图16拾铁块流程图

6.3   小车前进子函数

       当给小车发送一个命令,小车识别出此命令为前进命令,调用前进模块,在前进的同时光电检测器检测前方有无障碍物,若有IOB6,IOB7口输出高电平。这时开始调用转弯模块,让小车避开障碍物,程序运行完成后,光电检测器检测继续检测前方有无障碍物,若没有了,就继续执行前面的前进模块,直到所设置的运行时间结束,小车便停止此命令等待下个命令的到来。如果在前进的过程中,金属传感器有检测到小铁块,就把小铁块拾起来,然后再判断障碍物。
       前进模块的函数如下,其中模块中的参数n为设置小车前进的时间,这是在运行调试的时候可以随时改变的参数,可以根据要求来控制小车的运行路程。
void F_GoAheadCtr(int n)                     //前进
{  
       int i,j ;                                         //定义变量    
       for(j=0;j<n;j++)
       {
       ClearWatchDog();                           //清看门狗
       i=i&0x00c0;                                     //判断有无障碍物
       i=i|0x2800;                                     //控制电机正转
       *P_IOB_Data=I;                               //IOB口数据端输出控制电机前进
       F_Delay(90);                                 //延时2.5S
       i=i&0x00c0;                                   //判断有无障碍物
       i=i|0x0000;                                   //若无则电机停止运行
       *P_IOB_Data=I;
       F_Delay(60);
       }
}
     从上面前进模块可以看出,只要改变小车的行驶状态,就可以用语音控制让小车前进、后退、左传、右转等随着不同语音命令而有不同的运行轨迹。这就要求在程序设计上对小车行驶的状态有一个初始化过程。在判断运行轨迹的时候主要就是检测IOB4~ IOB7端口输出的是高电平还是底电平,这样从这几个端口读出的数据传给P_IOB_Data口来控制电机的转向,就可以控制小车在整个行驶过程的运行状态。

6.4   延时子函数

       在小车运行过程中,延时模块是不可少的一部分,它是让小车能够连续运行的一个中断函数,在设置延时模块中断时候,传入的参数为1时它的延时2.5ms,这样设置是为了能在调试的时候能根据不同的要求,不同的设计设置不同的延时,让小车的运行能随不同的环境有不一样的行驶路程。如下面的子程序:
.PUBLIC   _F_Delay                           //传入参数为1延时2.5ms                          
_F_Delay: .proc                             //延时程序开始
       push r1,r5 to   [sp];           //压栈保护
       bp=sp+3    
L_Loop1:                                           //标号1
       R2=r1;                                       //传入的参数
       r3=1
       r4=0x7012                                 //清看门狗
       [r4]=r3
L_Loop2:                                           //标号2
       R2-=1;                                       //R2减1
       JNZ L_Loop2;                           //R2不为0则转到标号2处
       R1-=1;                                       //寄存器减1
       JNZ L_Loop1;                           //R1不为0则转到标号1处
       pop r1,r5 from   [sp];         //出栈
retf                                           //返回                    

7   调试及运行

       SPCEO61A的开发是通过在线调试器PROBE实现的。
PROBE既是一个编程器(既程序),又是一个实时在线调试器。用它可以替代在单片机应用项目的开发过程中长用的两件工具——硬件在线实时仿真和程序烧写器。它利用了SPCE061A片内置的在线仿真电路ICE(In—Circuit Emulator)和凌阳公司的在线串行编程技术。PROBE工作于凌阳IDE集成开发环境软件包下,其5芯仿真头直接连接到目标电路板上SPCE061A相应管脚,直接在目标电路板上的CPU——SPCE061A调试,运行用户编制的程序。
       首先在计算机上安装好IDE集成开发环境,然后编写程序实现上述功能,在编写程序的整个过程中遇到许多问题,当一时解决不了的,就去询问专业人士。在调试的过程中,首先能够让程序语法上没有错误,然后再来实现其他功能,直到能够达到设计的要求。
测试过程如下:
(1) 将控制小车主程序输入单片机中,在各种环境下检测小车的纠偏能力,包括前进、后退、左传、右转及避障的灵活性等。
(2) 将金属传感器和黑白传感器程序输入单片机中,然后让小车在轨道上行驶,检测小铁块并能够把小铁块准确的放入盒子中,反复若干次,直到能准确的把小铁块拾起。
(3) 检测显示电路看是否能准确的显示所行的路程和是否准确的把显示的内容读出来。
(4) 整体调试程序,包括软、硬件的联合调试,让小车运行于最佳状态。
至此,整体调试完毕。本系统经测试运行效果良好,达到了预期的目的,语音控制和音频播放带给人耳目一新的感觉。为了更好的实现语音辨识,本系统机械性能要求较高,噪声不能太大,行使速度不宜太快。

8   结束语

       系统用凌阳SPCE061A十六位单片机实现。内部集成了2K字的RAM、32K字的Flash加上用凌阳SPCE061A十六位单片机实现不需要外扩程序存储器和RAM,也不用外接语音芯片,即可实现语音辨识和一系列职能动作,。由于采用了高性能的MCU,省掉了大量的外围器件,如外扩RAM、ROM存储器等,使硬件结构大大简化,提高了系统的可靠性。他的软件编程采用C和汇编混合编程来实现,集两种语言之优点于一体,它们的完美结合极大限度地简化了编程过程,丰富了编程思想,给开发者带来了莫大的方便。采用别的单片机实现所有功能一般要两个单片机,硬件电路也更加复杂。若要实现语音播报功能和语音辨识,不是多用几个别的类型的单片机就可实现的,而凌阳单片机提供了很好的语音播放和录制机制以及简单的API接口编程。使用SPCE061A开发产品不仅给开发者耳目一新的感觉更给用户以振奋的性能。
       这次课题设计还是基本上达到了设计的要求,但是也存在着未能解决的问题,有于在执行语音程序时对资源的消耗比较大,在语音报数的时候会停止电机的运行。
在这次多功能语音控制小车的设计中,我们学到了单片机程序的设计和调试,单片机各引脚的设置及与外围电路的连接,更重要是学会了程序出问题时调试的方法,并养成了Debug的习惯,学到了程序出问题后这样去解决的基本方法。

参考文献

1 康华光·电子技术基础模拟部分(第四版)·北京:高等教育出版社,1999
2 李浚源,秦忆,周永鹏·电力拖动基础·武汉:华中科技大学出版社,1999
3 谢自美·电子线路设计、实验、测试(第二版)·武汉:武汉华中理工出版社,2000
4 安毓英,曾小东·光学传感器与测量·北京:电子工业出版社,2001
5 薛钧义,张彦斌,虞鹤松,等·凌阳十六位单片机原理及应用·北京:北京航空航天大学出版社,2003
6 罗亚非·凌阳十六位单片机应用基础·北京:北京航空航天大学出版社,2003
7 徐科军·传感器与检测技术·北京:电子工业出版社,2004
8 高泽溪·无线电技术导论(修订版)·北京:北京航空航天大学出版社,2004
9 谢自美·电子线路设计、实验、测试(第二版)· 武汉华中理工出版社,2000
10 设计竞赛组委会·第五届全国大学生电子设计竞赛获奖作品选编·北京:北京理工大学出版社,2003
11 周仲·常用电子元器件测量·上海:上海科技文献出版社,1986
Car of The Multi- Function Pronunciation Controls——
Design of The Software
Tang Fangti Information and Electrical engineering school,Panzhihua University
Panzhihua   617000
Abstract Along with electric the development, the automation no longer is a new topicand the pilotless compact car also will certainly to enter the practical stage. This system simulates future intelligent car. According to starts the pronunciation which transcribes to order to control starting, stopping, returning with the pronunciation debates the knowledge, and can automatically avoid the obstacle, carries on leads the way and backs up. Controlling the electrical machinery using the metal sensor and the black and white sensor to reverse and the electro-magnet to attract gathers with the power failure, so the car be able to clean up on the path the small iron slab. Using the photoelectricity detector examinates path on obstacle, and controls the running condition of electrically operated compact car. the electrically operated compact car will record round-trip distance, and demonstrated the car passes through distance automaticly. If it meets the ahead obstacle ,it will back up section of distances the corner to the vanguard in entire traveling schedule. After the SPCE061A Single-chip microcomputer is 16 structures micro controllers which LINGYANG science and technology promotes ,after m’nSP series product SPCE500A and so on. It’s volume is small, and the integration rate is high.It’s reliability is good ,and the expantion is very easy too.Besides the SPCE061A Single-chip microcomputer has the strong interrupt processing ability, it’s function is strong, and the efficiency characteristic is high .The power losing and the voltageis also low. The SPCE061A Single-chip microcomputer may apply in very many domains .For example: The domestic electric appliances controller, the instrument measuring appliance, the industry controlling, the intelligence at home the controller, the communication product, and speech recognition class product and so on.
Key words   SPCE061A Single-Chip Microcomputer; The pronunciation recognizes;
Infrared sensor; Hall part; Metal sensor; The common cathode numerical
code manages LG5641AH.

致谢

       作者在研究学习和课题设计期间,经冯明琴教授的悉心指导和耐心启发,学习到了设计课题的基本方法,具备了将一定的理论知识用于实践的能力,提高了自学水平,基本上达到的学以致用。冯老师严谨的治学态度,渊博的知识,和谐的为人及忘我的工作精神让我钦佩不已,这不但使的我的毕业设计能够顺利的完成,还在为人做事方面给我做了一个好的榜样。
       在这里我要感谢凌阳大学计划刘新颜和朱兴华两位工程师来我院开展讲座培训,是他们让我们接触了凌阳单片机,并对它产生了浓厚的兴趣。
       此外,我还要感谢实验室的王老师、陈老师在我设计期间提供了完备的设计的器件及相关的资料。
感谢唐军、王刚、代云立、刘华友、付林、陈永强、王学军、等同学的协助。
  
敬告:本站论文载自网络,本站不予评论和纠错!所以内容读者自行论证!更多设计论文陆续添加中...
                       >>发表评论
  
我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号