“睿泰”杯南京邮电大学第十六届大学生科技节
传感器设计大赛
作品研究报告
作品名称:基于凌阳SPCE061A的语音识别门禁院(系)全称:
申报者姓名
(集体名称):
类别:
█传感器应用类
□传感器设计类
一、设计背景
在科学日新月异的今天,电子设备的便捷化,人性化,智能化已成为不可逆转的潮流,而语音控制智能,更是其中研究发展的热点。凌阳SPCE061以其便捷的操作,可靠的性能,成为了各位电子爱好者的首选。而本设计即是基于凌阳SPCE061A的语音识别门禁系统,操作简单,语音识别,无线识别,可靠性高。
凌阳SPCE061A是一款16位的SoC芯片,它自身带有硬件乘法器,能够实现乘法、内积等复杂运算,不仅运算能力强,而且处理速度快,单周期最高可达到49MHz;它内嵌32K字的Flash程序存储器和2K字节的SRAM,具有ADC和DAC功能,其MIC_ADC通道带有AGC环节,能够很轻松的将语音信号采集到芯片内部,两路10位的电流输出型DAC,只要外接一个功放就可以完成声音的播放。SPCE061A的这些硬件资源可以支持单芯片语音处理功能。凌阳单片机的语音识别模块自带语音的API 函数,其中包括A2000 格式和S480 格式自动播放及手动播放的播放函数,S240、MS01 格式自动播放的播放函数、DVR 格式的语音录放函数和语音识别函数,让凌阳单片机不但可以作为普通的单片机开发系统,而且还可以作为一个语音系统进行语音播放、语音录放和语音识别,大大降低了凌阳单片机的开发难度,并增强了凌阳单片机的使用领域和功能。
本设计为语音识别的门禁系统,语音识别的同时附加无线收发模块NRF905,基于收发地址的不同,可以进一步增强本设计的安全性。
报警模块由MSP430单片机,HC-SR501人体感应模块,蜂鸣器组成,以下为本设计原理图:
二、主要模块
1、凌阳SPCE061是继μ’nSP?系列产品SPCE500A等之后凌阳科技推出的又一款16 位结构的微控制器。与SPCE500A不同的是,在存储器资源方面考虑到用户的较少资源的需求以及便于程序调试等功能,SPCE061A里只内嵌32K字的闪存(FLASH )。较高的处理速度使μ’nSP?能够非常容易地、快速地处理复杂的数字信号。因此,与SPCE500A相比,以μ’nSP?为核心的SPCE061A 微控制器是适用于数字语音识别应用领域产品的一种最经济的选择。
其性能如下:
A、16 位μ’nSP?微处理器;
B、工作电压(CPU) VDD 为2.4~3.6V (I/O) VDDH 为2.4~5.5V
C、CPU 时钟:0.32MHz~49.152MHz ;
D、内置2K 字SRAM;
E、内置32K FLASH;
F、可编程音频处理;
G、晶体振荡器;
H、系统处于备用状态下(时钟处于停止状态),耗电仅为2μA@3.6V ;
I、2 个16 位可编程定时器/计数器(可自动预置初始计数值);
J、2 个10 位DAC(数-模转换)输出通道;
K、32 位通用可编程输入/输出端口;
L、14 个中断源可来自定时器A / B ,时基,2 个外部时钟源输入,键唤醒;
M、具备触键唤醒的功能;
N、使用凌阳音频编码SACM_S240 方式(2.4K 位/秒),能容纳210 秒的语音数据;
O、锁相环PLL 振荡器提供系统时钟信号;
P、32768Hz 实时时钟;
Q、7 通道10 位电压模-数转换器(ADC)和单通道声音模-数转换器;R、声音模-数转换器输入通道内置麦克风放大器和自动增益控制(AGC)功能;
S、具备串行设备接口;
T、具有低电压复位(L VR)功能和低电压监测(L VD)功能;
U、内置在线仿真电路ICE(In- Circuit Emulator )接口;
V、具有保密能力;
W、具有WatchDog 功能。
SPCE061A的结构如下图所示:
2、MSP430单片机是美国德州仪器(TI)1996 年开始推向市场的一种16 位超低功耗的混合信号处理器(Mixed Signal Pocessor)。称之为混合信号处理器,主要是由于其针对实际应用需求,把许多模拟电路、数字电路和微处理器集成在一个芯片上,以提供“单片”解决方案。其性能如下:
A、工作电压范围:1.8~3.6V
B、超低功耗:活动模式:330uA,@1MHz,2.2V;待机模式:1.1uA;关闭模式(RAM 保持):0.2uA;
C、从等待方式唤醒时间:6us
D、16 位RISC 结构,125ns 指令周期
E、内置三通道DMA。
F、12 位A /D 带采样保持内部参考源。
G、双12 位D /A 同步转换。
H、16 位定时器Timer_A 。
I、16 位定时器Timer B。
J、片内比较器A
K、串行通信USART0(UART、SPI、I2C)接口
L、串行通信USARTI(UART、SPl)接口
M、具有可编程电平检测的供电电压管理器,监视器。
N、欠电压检测器
O、串行在线编程,无需外部编程电压,可编程的保密熔丝代码保其引脚分布图如下:
3、NRF905无线收发模块是单片射频收发芯片,工作于433MHz的ISM频段,芯片内置频率合成器、功率放大器、晶体振荡器和调制器等功能模块,输出功率和通信频道可通过程序进行配置。芯片能耗非常低,以10dBm 的功率发射时,工作电流仅有30mA,接收时工作电流只有12.5mA,多种低功率工作模式,待机模式下电流仅为12.5μA,节能设计更方便。其ShockBurst技术可在通讯时自动生成前导码和CRC校验位。
其性能如下:
A、422.4~473.5MHz工作频段
B、512个通讯频道,满足多点通讯、分组、跳频等应用需求,通道切换时间≤6us
C、发射功率可设置为:10dBm、6dBm、-2dBm和-10dBm
D、通过SPI接口与MCU连接
E、支持50kbps传输速率
F、ShockBurst传输模式,自动生成前导码和CRC校验码
G、工作电压范围:1.9V~3.6V,待机模式下电流仅为12.5μA
H、工作温度范围:-40℃~+85℃
NRF905实物图:
4、HC-SR501人体感应模块是基于红外线技术的自动控制模块,采用德国进口LH778探头设计,灵敏度高,可靠性强,超低电压工作模式,广泛应用于各类自动感应电气设备,尤其是干电池供电的自动控制产品。
其性能如下:
HC-SR501实物图:
三、各部分硬件电路图、软件设计流程图及部分实现代码
1、语音控制部分
硬件电路图:
软件设计流程图:
部分实现代码:
#include "bsrsd.h"
#define NAME_ID 0x100
#define COMMAND_ONE_ID 0x101
#define COMMAND_TWO_ID 0x102
#define COMMAND_THREE_ID 0x103 #define COMMAND_FOUR_ID 0x104 #define RSP_INTR 0
#define RSP_NAME 0
#define RSP_FIRE 1
#define RSP_GUARD 2
#define RSP_AGAIN 3
#define RSP_NOVOICE 4
#define RSP_NAMEDIFF 5
#define RSP_CMDDIFF 6
#define RSP_STAR 7
#define RSP_MASTER 8
#define RSP_HERE 9
#define RSP_GUNSHOT 0
#define RSP_PA TROL 11
#define RSP_READY 12
#define RSP_COPY 13
#define RSP_NOISY 14
//..................全程变量....................
int gActivated = 0; //该变量用于检测是否有触发命令,当有识别出语句
//为触发名称则该位置1
int gTriggerRespond[] = {RSP_MASTER, RSP_HERE, RSP_MASTER};
int gComm2Respond[] = {RSP_PA TROL, RSP_READY, RSP_COPY}; extern void ClearWatchDog();
int PlayFlag = 0;
void PlayRespond(int Result)
{
BSR_StopRecognizer();
SACM_S480_Initial(1);
SACM_S480_Play(Result, 3, 3);
while((SACM_S480_Status()&0x0001) != 0)
{
SACM_S480_ServiceLoop();
ClearWatchDog();
}
SACM_S480_Stop();
BSR_InitRecognizer(BSR_MIC);
BSR_EnableCPUIndicator();
}
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(RSP_NOVOICE);
return -1;
case -2: //需要重新训练一遍PlayRespond(RSP_AGAIN);
break;
case -3: //环境太吵
PlayRespond(RSP_NOISY);
return -1;
case -4: //数据库满
return -1;
case -5: //检测出声音不同if(WordID == NAME_ID) PlayRespond(RSP_NAMEDIFF);//两次输入名称不同
else PlayRespond(RSP_CMDDIFF);//两次输入命令不同
return -1;
case -6: //序号错误
return -1;
}
}
return 0;
}
int main()
{
int res, timeCnt = 0, random_no = 0;
InitIO();
BSR_DeleteSDGroup(0); // 初始化存储器RAM
// PlayRespond(RSP_INTR); // 播放开始训练的提示音"请输入触发名称"
//..........训练名称..............................
while(TrainWord(NAME_ID,0) != 0) ;
//..........训练第一条命令.......................
while(TrainWord(COMMAND_ONE_ID,1) != 0) ;
\ //..........开始识别命令.........................
BSR_InitRecognizer(BSR_MIC); //辨识器初始化BSR_EnableCPUIndicator(); //启动实时监控
PlayRespond(RSP_STAR); //播放开始辨识的提示音
while(1)
{
random_no ++;
if(random_no >= 3) random_no = 0;
res = BSR_GetResult();
if(res > 0) //识别出命令
{
if(gActivated)
{
timeCnt = 0;
switch(res)
{
case NAME_ID: //触发命令响应
PlayRespond(gTriggerRespond[random_no]);
break;
case COMMAND_ONE_ID: //识别第一个命令
PlayFlag = 1;
LED_RED_ON();
PlayFlag = 0;
gActivated = 0;
break;
}
}
else
{
if(res == NAME_ID)
{
PlayRespond(gTriggerRespond[random_no]);
gActivated = 1;
timeCnt = 0;
}
}
}
else if (gActivated)
{
if (++timeCnt > 450) //超出定时
{
PlayRespond(RSP_NOVOICE); //在设定时间内没有检测出声音
gActivated = 0;
timeCnt = 0;
}
}
}
}
2、无线发送部分硬件电路图:
软件设计流程图:
部分实现代码:
//NRF905装载地址+数据打包+数据发送
void TxPacket(void)
{
uchar i;
CSN_0;
SpiWrite(WTP); // 待发数据装载命令
for (i=0;i<32;i++)
{
SpiWrite(TxRxBuf[i]);
}
CSN_1; // 关闭SPI