版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGEI基于语音交互的LED控制系统设计和实现摘要本毕业设计旨在研究孤立词语音识别系统在单片机等嵌入式平台上的实现,通过自己设置的控制指令来调整LED的亮灭程度。系统采用STM32F103ZET6作为核心处理单元,利用专用语音识别芯片LD3320实现语音转换为控制指令。整个系统的流程,用户说出语音识别关键词列表中任意词语,由语音识别模块识别后将指令通过SPI传输给单片机,单片机处理获得的指令,将指令的内容通过PWM输出反映到LED灯的亮灭程度上,并且可以通过LCD屏显示用户说出的内容,实现人机交互功能。大量实测表明,整个语音识别系统能够实现良好的语音识别功能,系统工作稳定,LED灯能够快速准确的响应用户说出的指令。关键词:语音识别;脉冲宽度调制;SPI通信目录TOC\o"1-3"\h\u20241引言 12612概述 2314602.1语音交互的LED系统概述 290442.2本设计方案思路 2222172.3本设计研究内容 3105773硬件设计 4208523.1总体方案 416723.2语音识别模块 4309163.3MCU控制模块 7245383.4LCD交互模块 7232043.5LED显示模块 8240154软件设计 10119424.1总体方案 10200464.2LD3320模块工作代码 1154394.3PWM输出 14310684.4GUI显示 17251264.5提高LD3320识别准确率 20267695调试与测试 22210935.1模块调试 2280285.2系统测试 23215216结论 2429907参考文献 2624105附录 27 -PAGE1-1引言早在上世纪五十年代,语音识别这项技术就深受人们关注。以Davis带头的几位科学家在贝尔实验室已经发明出可以识别出几个简单英文数字的装置。在此之后,随着快速傅里叶变换等数字信号处理技术和计算机技术快速发展,人们逐渐将工作重心转移到软件编写上,在此期间动态时间规整算法和线性预测分析技术推动了语音识别技术的快速发展。70年代,由于语音前后的相关性,矢量量化和隐马尔可夫模型被用来处理音频信号。80年代,神经网络在语音识别技术上得到了有效的应用。这些算法一定程度上都对语音识别这项技术起到了一定的推动作用,也是现阶段语音识别使用的基础算法REF_Ref6135\r\h[1]。如今,随着深度学习等新兴技术的兴起,语音识别可以通过训练神经网络来实现,语音识别方面专家都在利用更深,更复杂的神经网络框架来提高识别率。2015年之后,端到端神经网络在语音识别技术上得到了使用,并且取得了良好的效果,在一定程度上提升了模型的识别精确程度。相比以前的语音识别技术,当今的语音识别技术发展已经相当成熟,尤其是在中小规模语句方面识别准确率已经接近100%。如此高精度识别的技术已经能适用于日常生活大部分场景。在大规模集成电路快速发展的今天,孤立词语音识别系统已经可以集成到专用集成芯片上,进行大规模生产。一些西方国家已经将语音识别产品适用于市场及其他服务领域。同时我国非常重视语音识别这个领域,并且将语音识别里大词汇量识别列入国家高技术研究发展计划。由中科院所研发的基于非特定人,连续汉语语音识别系统准确率高达90%以上REF_Ref23520\r\h[2]。由此可以对未来进行展望,加载语音识别技术的应用型产品将会越发普及,人们也将会感受到搭载语音识别这项技术的产品给人们日常生活带来的诸多便利。作为一项实用性技术,语音识别系统的实时性能和优化设计,是智能语音控制系统研究中不断改进的目标人们将会致力于不断完善使其满足人们日常生活需求,使其更具便捷性,任意性,交互性等特点,进而推动人类社会智能化和信息化进程。语音识别根据说话人说话方式不同大致可以分为三类:孤立词识别系统,连续语音识别系统,语音理解系统。本文设计将孤立词语音识别系统适用到日常家居生活中常见的LED灯上,通过语音去控制LED。将家居生活中经常通过开关接触控制方式转换为更加智能高效的语音控制方式,大大解放了双手,使操作更加方便,快捷。利用专用嵌入式设备打造良好的,智能的家居环境,嵌入式系统通过采集实时的语音,对语音信号进行识别进而控制LED,在一定的环境噪音影响下,也能维持相对较高的识别准确率。2概述2.1语音交互的LED系统概述本毕业设计中实现的语音交互系统是语音识别技术中比较基本的孤立词语音识别,算法实现也较为简单,适合在嵌入式平台上进行开发,开发规模较小。孤立词语音识别系统主要的工作原理如图2-1所示可以概括为语音信号预处理、端点检测、特征提取、特征匹配。语音识别系统处理完成语音信号,将语音信号识别结果通过SPI传输给单片机,单片机接收控制指令,实现对LED的操控,并将控制结果送到LCD显示。图2-1语音交互系统原理图2.2本设计方案思路方案一:系统总流程可以分为建立用户语音模板和将用户输入语音和模板进行比对两个流程。(1)模板建立通过语音采集模块实现语音信号的采集和前端放大,对语音信号进行模数转换,将语音信号转换为数字信号,将转换后的数字信号传输给单片机。单片机对传入的语音信号进行预处理,包括对语音信号的预加重,加窗和分帧。通过软件端点检测算法检测输入信号中有效语音起始点和结束点。对提取到的每帧有效语音信号提取Mel频率倒谱系数,提取到输入语音信号的特征。通过外界采集语音样本进行模板训练,将模板的Mel频率倒谱系数作为语音的特征模板储存到单片机flash中。(2)语音识别过程通过用户输入语音,利用之前模板训练流程提取到用户语音的Mel频谱倒谱系数,使用动态时间规整(DWT)算法计算输入语音特征与储存模板特征之间的匹配距离,选取距离合适且最优的模板。单片机通过识别结果来确定将要执行的操作,将用户语音指令转换为对应占空比的PWM输出到LED灯上,并且通过LCD和用户进行交互。该方案开发算法难度较大,模板训练之后成功率不高,并且算法基于特定人,无法实现高效准确的语音识别功能。方案二:建立一个C/S构架服务器,连接路由器搭建本地局域网。将手机和嵌入式硬件通过WIFI模块连接到本地局域网中。手机APP端负责接收用户语音,将语音上传到讯飞云端服务器,语音服务器按照自己的算法识别语音中的关键词,将识别到的结果通过JSON格式回传到APP中。服务器作为数据中转站,可以接收手机APP端发送的数据并且下传到嵌入式硬件,嵌入式硬件通过服务器下传的数据,判断数据有效性,最后控制LEDREF_Ref6069\r\h[3]。由于讯飞语音识别技术较为成熟,利用此方案可以实现高准确率的语音识别,并且可以支持多种语言,但是由于对网络技术要求较高,故不予采用。方案三:通过查阅资料得知,方案一中使用的语音识别算法可以由专门的语音识别集成芯片实现,语音识别模块采用语音识别专用芯片LD3320。LD3320模块内部识别算法是基于非特定人的,其识别的原理也是根据用户输入语音与芯片内关键词列表中建立的模板进行比对,返回关键词所对应的排序值。只需要将用户常用的控制命令记录在关键词列表中,芯片会自动根据用户输入的关键词列表建立关键词的特征模板,并且特征模板是基于非特定人的,当LD3320识别到关键词列表中存在的词语,LD3320便可以将识别到的结果通过SPI传输给单片机,单片机通过判断LD3320识别结果来控制LED的亮灭程度,并可以通过LCD显示LD3320传输的命令和用户进行交互。此种方案难度适中,开发成本较低。最终本设计选择方案三为最终思路。2.3本设计研究内容1.配置单片机SPI接口,使其与语音识别模块LD3320建立通信。通过读写命令向LD3320模块写入控制命令。在语音识别模块识别到关键词时,读取语音识别结果。2.单片机通过语音识别模块的识别结果进行相应的PWM输出,实现对LED灯亮灭程度控制。3.LCD触摸屏显示GUI界面,用户可以通过点击触摸屏固定区域开启语音识别功能,显示屏也能将识别到的语音在LCD上进行提示。4.通过添加模糊词或者添加触发方式提高LD3320模块识别精度。3硬件设计3.1总体方案系统硬件由语音识别模块、MCU、触摸屏、电源、LED灯五部分组成。系统选择的主控芯片是STM32F103ZET6,语音识别模块选用LD3320模块,语音识别模块通过SPI与主控芯片进行通信,同时主控芯片通过FSMC与LCD屏通信,输出PWM信号控制LED亮灭程度。硬件设计总体框图如下图3-1所示。图3-1硬件设计总体框图3.2语音识别模块LD3320芯片是由ICroute设计的“语音识别”专用芯片。芯片中包括专门用于语音分析的处理器及其外围电路,数字到模拟转换器,模拟到数字转换器,语音接收模组,音频输出模块。该芯片专注于节能和设计效率,无需添加任何辅助芯片如Flash,RAM等,直接集成到现有产品中,语音识别/声音控制/人机交互通话功能,芯片内部的关键词列表也可以由用户根据自己需要进行更改。非个人语音识别技术ASR(AutomationSpeechRecognition)是针对数十G语音数据在语言学家的语音模型分析下,科学家通过反复训练以建立数学模型和提取原始语音的详细属性提取各个语音之间的特征差异。可以从统计概率优化的意义上获得每个原始语音特征。最后,高级工程师将算法和语音模型转换为硬件芯片,并将其应用于嵌入式系统。每个识别过程都是为了让用户说出音频内容并将其转换为频谱中的音频特征。与关键字列表条目一对一匹配,并且最佳匹配之一是识别节点。无论此列表中条目的内容如何,设置相关寄存器就足够了将条目的内容作为字符传递给识别引擎。该芯片主要特征有:芯片内部集成了ICroute公司研发的语音识别算法,能够准确且快速的完成非特定人语音识别功能,无需用户自己建立语音特征模板。LD3320芯片正常工作不需要外界存储模块和内存单元,芯片集成了高精度的数模转换器,单个芯片就可以实现语音转换为命令功能。关键词列表可以设置多达50个词条,用户可以根据自己需要自行设定,芯片内部会根据已有算法将词条特征模板建立起来,方便用户进行动态调整。芯片里面集成了高达16位精度的数模转换器和模数转换器,麦克风输入经过内部放大模块通过A/D转换器可以实现高精度的转换,内部数字信息也可以通过D/A转换器低失真的输出。芯片支持设置为休眠状态,方便用户进行低功耗系统的设计,同时在休眠状态中也可以方便的激活。芯片同时支持串行通信和并行通信,串行通信节约其他模块引脚的使用,速度较慢。而并行通信虽然引脚使用多,但是传输速度快。芯片支持MP3播放功能,芯片内部集成了MP3播放辅助器件,用户只需要将MP3数据通过主控制器传入芯片内部寄存器,芯片即可在相应的引脚输出音频信号。下图3-2为LD3320内部电路的简单逻辑图。图3-2LD3320内部电路的简单逻辑图时钟(Clock):芯片内部无可用时钟资源,必须通过外部模块提供4-48MHz范围内的时钟信号芯片才能正常工作,芯片内部具有锁相环电路,可以通过外部时钟倍频或者分频来产生特定的频率提供给内部模块。并行接口:该芯片可以使用八根数据线(P0-P7)与外部主CPU并联连接。四个控制信号 (WRB,RDB,CS,A0)和中断返回信号(INTB)。寄存器:芯片内部资源设置和控制命令(例如传输数据和验收数据)通过寄存器执行。例如,在语音识别阶段,当芯片产生识别结果之后,通过读写内部寄存器的值来判断产生结果是哪一条关键词(寄存器返回的是关键词在关键词列表中排序的值,排序的值在设置关键词列表时决定)。串行接口:芯片内部集成了硬件SPI,可以与外部模块通过片选信号(CS),时钟信号(CLK),主机输入从机输出(MISO),主机输出从机输入(MOSI)四根信号线进行串行通信。复位:只有VDD/VDDA/VDDIO稳定后,才能完成芯片复位。无论芯片正在执行哪种计算,都可以通过复位信号返回到初始状态,并可以使复位寄存器重置。如果后续没有对寄存器进行设置,芯片将会进入休眠状态,在休眠状态期间可以通过改变CSB引脚电平使芯片重新工作。LD3320外围电路图如图3-3所示图3-3LD3320外围电路图3.3MCU控制模块STM32F103ZET6:内核是基于ARM架构Cortex-M3的32位微控制器,芯片采用LQFP-144封装,内部集成了512KB的闪存和一个64KB的静态随机存储器。芯片具有强大的时钟系统,内部具有一个8MHz的高速RC振荡器和一个用于看门狗时钟的40KHz低速RC振荡器。同时芯片还支持外部时钟输入,时钟输入范围4-16MHz,内部具有锁相环倍频电路,可以将内部高速时钟或者外部高速时钟进行倍频用于系统时钟,芯片系统时钟最高可以达到72MHz,外部连接32.768K低速晶振,用于芯片内部RTC时钟使用。芯片一共144个引脚,其中可以用于通用输入输出的有112个,除了模拟通道输入输出外,大部分都支持5V输入。芯片内部提供了3个12位的数模转换器,测量通道更是多达21个,同时还提供了2个12位的模数转换器。芯片具有非常丰富的定时器资源和通信接口,3个SPI串行接口,还有诸多串口,IIC接口,USB从设备接口等REF_Ref766\r\h[4]。3.4LCD交互模块TFT-LCD是薄膜晶体管液晶显示器。它的英文全称是:Thin-FilmTransistorLiquidCrystalDisplay。由于普通液晶通过行列控制像素点会导致同一行或者同一列像素点受到影响,TFT-LCD通过在每个像素点添加晶体管开关来解决像素点相互干扰的问题,每个像素点通过晶体管开关都可以独立的被控制,而不会由于同一行或者同一列电压的变化受到影响。也正是由于TFT-LCD这个特性,使得其显示图片的质量得到了极大的改善REF_Ref9649\r\h[5]。下图3-4为TFT-LCD模块原理图。从图中可以看出TFT-LCD传输数据采用16位并行的方式,相比串行传输方式或者8位并行方式,16位并行传输方式虽然占用引脚较多,但是传输速度快,一次可以传输两个字节的数据或者地址。对于需要快速显示的图片来说,并行传输方式就显得尤为重要。图3-4LCD模块原理图FSMC,FlexibleStaticMemoryController,可变静态存储控制器。通过对寄存器的配置,使其可以与不同的外部存储器进行通信,即可以匹配外部存储器的速度。具有大容量且引脚数超过100的STM32F103芯片均具有FSMC接口。外部SRAM的控制一般有:地址线(如A0〜A18),数据线(如D0〜D15),写信号(WE),读信号(OE),片选信号(CS)REF_Ref13744\r\h[6]。而TFTLCD包括:RS(读写控制引脚),D0-D15数据/地址传输引脚,WR(写),RD(读),CS(片选),RST(复位)和BL等,其中真正在操作LCD的时候需要用到的就只有:RS,D0-D15,RD和CS。除了TFTLCD具有RS信号但没有地址信号之外,其工作时序与SRAM的控制时序完全相同。而RS信号用于控制LCD是在写命令还是在写数据,从本质上可以理解为地址,我们可以将RS信号连接到FSMC地址线上,这样数据引脚,地址引脚,写信号(WE),读信号(OE),芯片选择信号(CS)可以与LCD对应的引脚相连,LCD还具有RST,BL,连接单片机的普通IO口即可。FSMC通过4个块(存储体)管理总共1GB的空间,BANK1属于NOR/PSRAM,BANK2,BANK3属于NAND,BANK4属于PC卡。如图3-5所示,STM32的FSMC模块1(Bank1)分为四个区域,每个区域管理64M字节的空间,每个区域都有自己的寄存器来配置连接的存储器。Bank1的256M字节空间由28条地址线(HADDR[27:0])寻址。HADDR是内部AHB地址总线,其中HADDR[25:0]来自外部存储器地址FSMC_A[25:0],而HADDR[26:27]对4个区进行寻址。TFTLCD使用16位数据宽度,因此不使用HADDR[0],只有HADDR[25:1]有效,并且对应关系变为:HADDR[25:1]->FSMC_A[24:0],这等效于向右移一位。图3-5FSMC分区3.5LED显示模块为了方便使用STM32内置外设,芯片提供了端口复用的功能,即可以将芯片内置外设的功能重映射到端口引脚上,使得用户通过控制输入输出引脚就可以使用芯片内部外设资源。为了实现对LED灯亮度的控制,需要将定时器的PWM功能重新映射到普通的IO引脚REF_Ref8845\r\h[7]。LED连接到单片机的PB5接口,该引脚默认没有定时器通道输出,查阅芯片手册如图3-6需要将TIM3_CH1定时器通道重映射到该引脚上,并且将定时器功能设置为输出PWM模式,将PWM占空比反映到LED的亮灭程度上。图3-6TIM3复用功能重映像如图3-7所示,为了提高电路的稳定性,避免引起误动作,上拉电阻R18的存在可确保其空闲时引脚处于高电平而不会发生误操作,还可以提高输出引脚的带载能力。如果没有上拉电阻的存在,受其他外围电路影响,在输出高电平时单片机引脚带载能力不足,无法达到VCC状态,这会影响整个系统的正常运行,上拉电阻的存在可使引脚的驱动能力增强,本设计中LED通过外部上拉电阻连接到单片机引脚PB5。图3-7LED硬件连接图4软件设计4.1总体方案本毕业设计软件可以分为以下四个部分:LD3320识别语音获取识别码,LD3320与STM32F103ZET6通过SPI通信将识别码发送给主控制器,LCD显示及触摸屏使用,主控制器输出PWM到LED灯控制亮度。其中LD3320获取识别码包括添加“垃圾关键词语”,口令触发等来提高识别准确率。软件总体流程图如下图4-1所示。进入主程序中首先会对LCD,LCD触摸屏模块,LD3320模块,定时器分频值进行初始化,配置LD3320中断优先级分组,显示LCD主界面,等待用户按下触摸屏上提示的按键。当用户按下触摸屏指定区域之后,进入语音识别界面,LD3320模块启动ASR识别流程,ASR初始化,单片机将关键词列表添加到LD3320模块中,同时打开LD3320的中断开关。当外界有语音输入且在关键词列表中,LD3320会产生外部中断,中断执行函数会把nAsrStatus标志记为LD_ASR_FOUNDOK。主函数中主控制器会向LD3320发送读寄存器命令,读取与输入语音最相近的识别结果。LD3320会将识别到的语音信息转换为识别码发送给单片机。单片机通过对LD3320发送的识别码进行解析,控制LED模块PWM的占空比,达到调整LED灯亮度的目的。同时LCD也会提醒用户语音识别的结果,达到交互的目的。如果外界有语音输入但是没有在关键词列表中,中断执行函数中nAsrStatus标志记为LD_ASR_FOUNDZERO,主函数不会向LD3320发送读寄存器命令。图4-1软件总体流程图4.2LD3320模块工作代码 由于LD3320硬件集成了SPI接口,stm32只要配置相关硬件参数即可与LD3320通信。SPI写时序由下图4-2所示图4-2SPI方式写时序由图4-2可以看出,当单片机要给LD3320模块写数据时,首先要先在SDI引脚发送一个写指令(04H),再将要写入寄存器的地址发送给LD3320模块,最后将8位数据通过SDI发送给模块。在整个发送期间,片选信号(SCS)要始终保持低电平。SPI读时序由下图4-3所示图4-3SPI方式读时序由图4-3可以看出,想要从LD3320模块中读数据时,首先SDI引脚要给模块发送一个读指令(05H),同时也要将想要读寄存器的地址发送给模块,LD3320模块接收到读指令和寄存器地址之后通过SDO引脚将数据发送给单片机。这一过程与写指令一样,片选引脚(SCS)要始终为低电平。对于任意一个SPI通信电路,数据的传输要遵守时序,数据的接受与捕获需要在时钟的边沿触发,而这个边沿是由时钟的极性(CPOL)和时钟相位(CPHA)共同决定的。CPOL的极性由时钟也就是SDCK空闲状态电平高低决定,当时钟空闲为高电平时,CPOL=1,当时钟空闲为低电平时,CPOL=0。CPHA的高低是由数据是在串行同步时钟第一个时钟跳变沿还是第二个时钟跳变沿被采集决定的。对与CPOL为高电平时,第一个时钟跳变沿是下降沿,第二个时钟跳变沿是上升沿。对于CPOL为低电平时,第一个时钟跳变沿是上升沿,第二个时钟跳变沿是下降沿。如果数据是在第一个跳变沿被采集,CPHA=0,数据在第二个时钟跳变沿被采集,CPHA=1。从LD3320模块读写时序可以看出,时钟空闲时为高电平,在第一个时钟跳变沿传输数据,即CPOL=1,CPHA=0,传输模式为模式二(0x10)。且SPI一次传输8位数据,按位传输数据,按照高位在前的方式,按照以上分析配置STM32F103ZET6的SPI工作,以下为配置的相关代码。//全双工SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;SPI_InitStructure.SPI_Mode=SPI_Mode_Master; //主模式SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;//8位SPI_InitStructure.SPI_CPOL=SPI_CPOL_High;//空闲状态时,SCK保持低电平SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;//数据采样从第一个时钟边沿开始SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;//软件产生NSSSPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_64;//波特率控制SYSCLK/128SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;//数据高位在前SPI_InitStructure.SPI_CRCPolynomial=7;//CRC多项式寄存器初始值为7SPI_Init(LD3320SPI,&SPI_InitStructure);当主机SPI配置完成之后就可以对LD3320模块编写驱动程序,在使用LD3320模块之前,首先要对其执行复位操作,也就是对芯片的(RSTB)引脚发送低电平,然后片选信号(CS)执行一次从高电平被拉低又被拉高的操作,激活模块内的DSP。当芯片不正常工作时,复位也可以用于将芯片恢复到起始状态。复位完成之后就可以利用LD3320模块进行语音识别功能,语音识别操作流程为:语音识别初始化,模块写入识别关键词列表,准备好相关的中断处理函数,语音模块开始识别。当麦克风检测到声音,无论是否识别出在关键词列表中的词语,都会产生一个中断信号,中断程序中再去分析是否识别到正确的词语。在中断服务程序中,首先要清除中断标志位,防止重复进入中断服务函数。之后通过读取寄存器BA内的值,可以知道模块有几个候选答案。如果BA内的值在1-4之间,代表有正确的识别结果,否则则没有真确识别结果。在有几个候选答案的情况下,读取C5寄存器内的值可以知道哪个答案是最接近用户输入的内容。模块也可以使用循环查询方式来判断模块是否有正确的识别结果,通过SPI读寄存器命令,读取寄存器B2H内的值,如果值为21H就代表模块识别到了关键词列表中的词语。之后就和中断方式类似,读取BA和C5寄存器的值来判断是否有正确的识别结果产生,本设计中采用中断处理方式。if((ucRegVal&0x10)&&LD_ReadReg(0xb2)==0x21&&LD_ReadReg(0xbf)==0x35){ nAsrResCount=LD_ReadReg(0xba); if(nAsrResCount>0&&nAsrResCount<=4) { nAsrStatus=LD_ASR_FOUNDOK; } else { nAsrStatus=LD_ASR_FOUNDZERO; } }当语音识别模块识别到在关键词列表中的词语,中断服务程序将会把全局变量nAsrStatus标志改变为LD_ASR_FOUNDOK,如果没有识别到关键词列表中的词语,则标记为LD_ASR_FOUNDZERO。主程序也会通过switch-case语句来执行不同nAsrStatus标志下的代码。当nAsrStatus标志被置为LD_ASR_FOUNDOK,对应case下可以通过读取0xc5,0xc7,0xc9,0xcb四个寄存器的值来获得相似度1-4的关键词,本设计中只读取相似度最高寄存器,即0xc5寄存器内的值当做识别结果,根据不同识别结果执行对应命令下的代码。4.3PWM输出 若要实现LED的全亮或者全灭,只要控制其端口高低电平就可以对其进行控制,但是要实现对亮灭程度进行控制,就要利用PWM(Pulsewidthmodulation)技术。PWM波形如图4-4所示。PWM技术是脉冲宽度调制的缩写,它通过对一连串的脉冲宽度进行调制来等效出所需要的波形。通过调节一个周期内占空比的大小来控制信号能量的变化。由于人眼暂留效应和LED余辉的存在,只要PWM频率够高,人眼看上去就是固定亮度的LED灯,而不会察觉到低电平也就是LED灯灭的时候。图4-4PWM波形 对于高电平发光的LED,一个周期内高电平持续越长,LED亮度越亮,低电平持续时间越长,LED亮度越暗。反映到占空比上等同于占空比越大,LED亮度越亮,占空比越小,LED亮度越暗。 Stm32的定时器除了TIM6和TIM7之外,其他定时器都有输出PWM功能。一般通用定时器可以同时产生4路PWM输出,高级定时器可以同时产生7路定时器输出,每个通用定时器都具有输入捕获、输出比较、PWM输出、单脉冲模式输出等功能。定时器输出PWM原理如下图4-5所示。图4-5定时器PWM输出原理 Stm32内部的通用定时器是一个通过可编程预分频器驱动的16位自动重装载计数器构成,可以用来对输入信号脉冲长度测量或者输出波形。每个定时器相互独立互不干扰,可以一起同步使用。通过调整定时器的预分频值可以使输出波形周期在微秒到毫秒之间调整。 通用定时器计数模式分为三种:向上计数模式、向下计数模式和中央对齐模式。以向上计数模式为例,由于通用定时器挂载在时钟APB1上,若使用默认的时钟初始化时钟的频率为72MHz。定时器内部有三个重要的寄存器,分别是计数寄存器(TIMx_CNT),16位预分频寄存器(TIMx_PSC)和自动装载寄存器(TIMx_ARR),定时器实际的时钟频率可以由以下公式表达,由公式可以看出通过配置预分频寄存器可以达到将原始时钟分频的效果。 通过配置自动装载寄存器的内容,在预分频之后的时钟作用下,每隔一个时钟周期,计数寄存器的值自动加一,当计数值达到自动重装载寄存器内的值之后,产生更新事件,并清零从头开始计数。PWM输出利用了自动重装载寄存器,计数寄存器,TIMx_CRRx寄存器。当计数寄存器的值达到CRR寄存器的值,会改变通道对应的CPIO电平,当计数寄存器达到ARR寄存器的值,通道对应的CPIO电平继续改变。如上图4-5所示,CRR寄存器相当于一个比较值,当计数寄存器的值小于这个比较值时,IO逻辑为低电平,当计数寄存器值大于CRR小于自动重装载寄存器内的值时,IO逻辑输出高电平。信号的周期是由ARR寄存器决定,而在一个周期内高电平持续时间也就是占空比是由CRR寄存器和ARR寄存器比值所决定的。设置ARR寄存器改变时钟分频大小达到改变输出频率的效果,改变CRR寄存器可以改变在一个周期内高电平输出时间,也就是改变了占空比。 在GPIO端口配置上,由于LED端口无定时器输出,但是可以利用定时器重映射将定时器的功能复用到LED端口上,实现PWM控制LED端口。以下代码为端口重映射和PWM配置的部分代码。voidTIM3_PWM_Init(uint16arr,uint16psc){//Timer3部分重映射TIM3_CH2->PB5GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);//定时器事件更新后将arr值传入自动重装载寄存器TIM_TimeBaseStructure.TIM_Period=arr;//设置时钟预分频值TIM_TimeBaseStructure.TIM_Prescaler=psc;//设置时钟分割TIM_TimeBaseStructure.TIM_ClockDivision=0;//TIM向上计数模式 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//选择定时器模式:TIM脉冲宽度调制模式2TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;//比较输出使能TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//输出极性:TIM输出比较极性高TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;TIM_OC2Init(TIM3,&TIM_OCInitStructure);/使能TIM3在CCR2上的预装载寄存器TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能TIM3TIM_Cmd(TIM3,ENABLE);} 在主函数通过调用TIM3_PWM_Init()函数可以实现指定ARR寄存器的值和分频值,PWM输出的比较值利用函数TIM_SetCompare2(TIM3,light)实现,通过配置TIM3和light的值就可以实现控制定时器输出PWM占空比的大小。在软件实现上,分频值设置为0,自动重装载寄存器内设置为899,相当于72MHz时钟周期不经过分频,计数900次计数器清零重新开始计数,PWM输出频率为80KHz。在设置PWM比较值时,LED全亮的情况下,CRR寄存器设置为899,对应占空比为100%。LED全灭情况下,CRR寄存器设置为0,对应占空比为0%。此外还设置了占空比为30%和60%的情况,为了扩大调整范围,在原先占空比的情况下,用户可以语音控制“亮一点”或者“暗一点”实现占空比微调,达到细调的效果,每次细调都是在原有的基础上将CRR寄存器内的数值加100或者减100,当CRR寄存器内的数值超过0-899的范围,将设置为全灭或者全亮。4.4GUI显示 本毕业设计采用TFTLCD模块分辨率为320*480,驱动芯片为NT35310,电阻触摸屏,TFT_LCD模块颜色深度为16位,所谓色彩深度就是模块每个独立的像素点需要多少位RGB数据来表示,格式为RGB565,由16位并口驱动。LCD模块的写过程如图4-6所示。图4-6LCD并口写时序图 在并口写数据时,先要根据要写入的数据类型设置RS为高或低电平,高电平写入数据,低电平写入命令,然后拉低片选信号,选中驱动芯片NT35310。写数据时,将RD置为低,在WR的上升沿将数据写入驱动芯片中。图4-7LCD并口读时序图 在并口读数据时,拉低片选信号,选中驱动芯片NT35310,将WR置为低,在RD的上升沿读取数据线上的数据。 以下六条指令是操作TFT_LCD模块最为重要的指令:0XD3,0X36,0X2A,0X2B,0X2C,0X2E。 0XD3:获取LCD控制器的ID,用于将同一份代码适配到不同的屏幕上。 0X36:该指令可以控制NT35310储存器读写方向,在连续读写GRAM时,可以控制GRAM指针的自增方式,通过配置MY,MX,MZ三位的值可以配置8种LCD扫描方向。 0X2A:设置列坐标指令,在从左到右从上到下的GRAM指针增长方式下,也就是默认增长方向下,该指令用于设置横坐标。 0X2B:设置页坐标指令,在从左到右从上到下的GRAM指针增长方式下,也就是默认增长方向下,该指令用于设置纵坐标。 0X2C:该指令是写GRAM指令,也就是向LCD写颜色数据指令,支持连续读写。当NT35310接收到此指令,数据的有效位宽就变成16位,除了此指令,其他有效指令的位宽都为8位。在写入颜色数据时,GRAM的地址会根据GRAM增长方式自动递增,只要设置好起始坐标,每当我们写入一个颜色数据,GRAM地址就会自动递增,大大提高写入速度。 0X2E:该指令用于读取NT35310的GRAM数据,输出时一个颜色占8位,输出3次之后获得2个像素点RGB的值。 TFT_LCD的驱动流程如下图4-8所示。首先对LCD模块执行硬复位操作,并且初始化序列,比如GRAM指正的增长方式。在写GRAM的情况下,先设置初始坐标,将颜色数据按照GRAM增长方式写入颜色数据,最后LCD调用update函数更新LCD显示内容。在读取颜色数据的情况下,也是先设置初始坐标,按照GRAM增长方式读取颜色数据到单片机,由单片机进行处理。图4-8TFT_LCD的驱动流程在设计屏幕GUI时,利用LCD_Fill函数来绘制方框,构造一个GUI_Area结构体,将每个方框的属性用结构体来表示。结构体内包括方框的位置,大小,填充颜色,背景颜色。如果要在背景上显示方框只需要将显示颜色设置为填充颜色,并且将大小位置传入绘制方框函数。如果要删除方框也只需要将填充颜色设置位区域背景色,并且将大小位置传入即可。将每个方框的颜色和位置封装成一个GUI_Area数组,每次只需调用数组里面的成员即可,达到GUI显示的功能。LCD液晶屏首先显示的是语音识别主界面(见附录),只有用户按下触摸屏上SpeechRecognize方框,程序才会进入语音识别功能界面(见附录),语音识别功能语音识别功能界面会将模块可以识别的口令显示在屏幕上。用户如果输入口令中的内容,方框内会有闪烁效果,提醒用户软件识别的结果。有利于调试时监测模块输出结果正确与否,也可以达到与用户交互的效果。将每个方框属性封装成一个GUI_Area结构体有利于触摸屏触点的识别,触摸屏识别时只要判断触点是否在所指定的方框内即可判断用户是否按下屏幕指定位置,更利于代码维护。GUI_Area结构体:typedefstruct{ u16Left; //区域离屏幕左边界的距离像素数 u16Top; //区域离屏幕上边界的距离像素数 u16 Width; //区域宽度 u16 Height; //区域高度 u16BackColor; //区域背景色 u16ForeColor; //区域前景色}GUI_Area;GUI删除区域voidGUI_HideArea(GUI_Area*Area){ LCD_Fill(Area->Left,Area->Top,Area->Width,Area->Height,Screen.BackColor);}GUI显示区域voidGUI_ClrArea(GUI_Area*Area){ LCD_Fill(Area->Left,Area->Top,Area->Width,Area->Height,Area->BackColor);}4.5提高LD3320识别准确率LD3320模块使用的语音识别技术是基于“关键词列表”的ASR技术,语音识别芯片可以通过识别预定时间语音数据或者通过端点检测算法(VAD)来检测用户输入语音。为了提高LD3320识别的准确率,软件上可以选择使用“触发模式”或者设置“垃圾关键词语”来吸收错误识别。“触发模式”在识别正确率要求很高的场合尤为重要,设置触发方式可以分为硬件触发和语音触发。当用户按下某个按键之后,模块给出用户应答信号,用户就会集中注意力,贴近麦克风说出命令,模块也就减少了由于外界干扰噪声影响识别准确率,此外这种模式还是最节省电的一种方式,只有用户按键按下之后模块才会开始工作,没有按键按下,模块可以处于休眠状态。但是通过按键触发的方式和普通LED通过按键控制开关别无两样,通常在触发模式中使用“口令触发”模式。用户在说出控制LED命令之前,必须先说出触发口令,触发口令可以设置复杂,避免未使用时由于环境语音噪声造成模块误判。当用户说出触发口令之后,模块给出应答信号,在应答信号回应之后,若模块没有接收到在关键词列表中的词汇,模块会重新进入循环识别模式,等待用户下一次说出口令。若在识别到口令之后就接受到了在关键词列表中的词汇,模块便会将识别到的结果发送给单片机,单片机进行后续的处理。增添“垃圾关键词语”在一定程度上也可以达到增加识别成功率的效果。由于LD3320模块不能智能识别某个特定人的声音,而是一种基于非特定人语音识别技术的模块。当环境中有任意声音进入模块,语音识别模块都会将输入声音和关键词列表进行匹配打分,这种工作模式必然带来一些环境噪声被误操作,造成误识别。所以在设置关键词列表之后,要设置一些环境中容易出现的声音,比如“啊啊啊”“呜呜”等等,并且选择一些字数和关键词列表中关键词相匹配的,用来吸收可能会发生的错误识别。在增添“垃圾关键词语”的同时,也可以增加与关键词相接近的词汇。例如“打开电灯”可以增加相近词汇“开灯”,“打开灯”来提高识别成功率。除以上两种方法以外,也可以配置LD3320内部寄存器来改变原先默认的一些参数,比如说修改VAD寄存器,当用户停止语音输入之后,默认检测600ms背景噪音判断为语音结束,可以将默认检测600ms改成适合使用场景的时间。还可以修改麦克风增益,将关键词修改成不易混淆,便于发音的词汇。在本毕业设计中使用了口令触发加上增添“垃圾关键词汇”的方法来提高识别的成功率。只有用户说出了一级触发口令,模块识别到并且给出了应答信号,用户才可以控制LED灯的亮灭程度,如果用户说出了一级触发口令但是没有说出控制LED口令,模块不进行任何操作,返回循环模式等待用户下一次说出一级触发口令,软件流程图如图4-9所示。图4-9口令识别流程图voidUser_Modification(u8dat){ if(dat==0) { flag=1; } elseif(flag) { flag=0;//LED控制代码}else { //printf("请说出一级口令\r\n");//测试使用}}当语音识别芯片获取到语音并且根据关键词列表获得识别结果之后,软件中会去判断输入语音是否是一级触发口令,如果是flag标志被置1,如果不是将不会执行任何操作。当用户输入触发口令被识别之后,如果用户输入了LED控制口令,flag会重新置0,并且根据用户输入口令单片机控制LED实现亮度的变化。5调试与测试5.1模块调试模块整体实物图可见附录。需要调试的模块最主要的就是LD3320模块,未完成LCD屏代码实现之前利用单片机串口与电脑进行通信,单片机只要初始化串口中断,再利用print函数就可以通过单片机向串口发送信息,电脑通过串口调试助手打印单片机发送的信息。在调试LD3320模块时,通过用户输入语音,先利用串口将LD3320识别到的语音信息通过串口发送到电脑端,判断识别的结果正确与否,当识别成功率够高了之后,再去利用LD3320模块控制PWM输出,PWM输出间接通过LED亮暗程度反映出来。完成LCD显示代码的编写之后,直接利用单片机和LCD即可完成调试工作,LD3320模块识别的结果可以通过LCD反映出来,不再需要串口的协助,下表5-1为各个占空比LED所对应亮度情况。占空比大小实物亮度图0%30%60%100%表5-1不同占空比LED亮度情况5.2系统测试软件未经过添加口令触发,未增添“垃圾关键词汇”,测得数据如下表5-1所示:口令识别情况打开电灯关闭电灯亮一点暗一点亮度调到三十亮度调到六十识别次数101010101010正确次数665565准确率60%60%50%50%60%50%表5-1软件未优化识别结果软件添加口令触发,增添“垃圾关键词汇”,测得数据如下表5-2所示:口令识别情况打开电灯关闭电灯亮一点暗一点亮度调到三十亮度调到六十识别次数101010101010正确次数877787准确率80%70%70%70%80%70%表5-2软件优化识别结果不同用户在软件添加口令触发,增添“垃圾关键词汇”情况下,测得数据如下表5-3所示:口令用户打开电灯关闭电灯亮一点暗一点亮度调到三十亮度调到六十用户A70%70%80%80%70%60%用户B80%80%70%70%80%70%用户C80%70%70%70%80%70%表5-3不同用户识别结果通过测试中可以看出,软件上增加了触发命令并且增添了“垃圾关键词语”模块识别正确率有所上升,并且识别设置相对复杂的关键词语相比于简单的关键词语不容易引起误操作。由于LD3320模块语音识别算法是基于非特定人的识别技术,不同用户在说出关键词列表中的关键词时,识别准确率相差无几。6结论本毕业设计完成了任务书上预计的目标,选择LD3320模块语音采集及识别系统,实现语音的识别和采集,将使用者的语音转换为相应的控制指令,实现了语音控制LED的功能。通过自己设计的6个指令“打开电灯”、“关闭电灯”、“亮一点”、“暗一点”、“将亮度调到六十”、“将亮度调到三十”实现调控LED灯的开、关以及亮度调整,通过控制触摸屏显示达到提示用户的目的。由于本设计运用的语音识别芯片是基于非特定人的,无需进行模板训练,对于任意用户只要说出内置关键词列表中的词汇,模块都会给出反馈,此外,当用户说出语音指令之后,LCD屏幕也能给出反馈,提示用户所说的内容,提高了用户的使用体验。由于硬
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【苏教版】-小学一年级数学下册-练习四
- 石嘴山市护士招聘面试题及答案
- 绍兴市辅警招聘面试题及答案
- 踝关节关节病护理查房
- 踝部损伤护理查房实践指南
- 26年乙肝病毒载量评估要点
- 合伙建房还款协议书
- 房产赡养协议书
- 写离婚协议协议书
- 彩票众筹协议书
- 北京玉渊潭中学新初一均衡分班语文试卷
- 第十一章:公共管理规范
- 第五章有机过渡金属化合物和过渡金属簇合物教材课件
- 统计大数据文化-南京财经大学中国大学mooc课后章节答案期末考试题库2023年
- 统编版五年级道德与法治下册全册完整版课件
- 全过程工程咨询服务技术方案
- -卫生资格-副高-疾病控制-副高-章节练习-慢性非传染性疾病控制-试题(单选题)(共1125题)
- 作业指导书SOP编制规范
- GB/T 7762-2014硫化橡胶或热塑性橡胶耐臭氧龟裂静态拉伸试验
- GB/T 2521.1-2016全工艺冷轧电工钢第1部分:晶粒无取向钢带(片)
- 支架拆除安全技术交底
评论
0/150
提交评论