1. 跪求...基于51单片机自动跟踪阳光太阳能热水器控制系统的设计
对绿色能源的开发和利用是响应我国节能减排,环保政策的举措,太阳能作为可持续,零污染,具有很高的环保价值和经济效益,高效利用太阳能还可以有效替代部分化石能源,从而降低因石化能源燃烧导致的污染,减轻雾霾。然而农村太阳能丰富,却没能得到很好的利用,即便现有的发电产品对太阳能电池板也大多采用固定支架。课题对此提出了能够跟踪太阳方向的云台支架,可实现太阳能电池板自动调节而始终面向光线最强的一面,提高太阳能发电的利用率。课题从云台,电机驱动,控制器,光线传感器,液晶显示等构成,课题成果不仅可以用到太阳能发电,还可以用到其它的向光场所,如天文观测等具有较高的实用价值。
随着时代的进步与科技的飞速发展,使得对能源的需求随之增加,对不可再生能源的过度依赖[1],从而使得不可再生能源的存储量急剧减少,一些不可再生能源(石油)被视为战略资源,据目前统计,煤炭、石油、天然气也会在岁月的实践中而日趋枯竭,消耗殆尽。这些不可再生能源的产生显然跟不上人类对其的需求,为更好的实现可持续发展,本课题提出了一种太阳追踪的可行方案,可以大大提升对太阳能的利用,减少对不可再生资源的过度依赖。
为了解决人们对不可再生资源的过度依赖和对清洁能源的高利用率。提出设计一款零污染高效率的装置——太阳追踪器。通过电机,控制器,采光板光线传感器等元器件之间的相互配合,实现对太阳光照射最强的方位,实现全方位无死角跟踪,恰巧正好急需这样一款具有安全、环保、高效率、以及取之不尽用之不竭的特点,也很方便就可以获取,如风能和潮汐能一样是绝对的无污染清洁能源,这也就很好的阐述了光能的可行性[2]。——对此提出太阳跟踪装置设计与制作。
优点:太阳作为一个取之不尽用之不竭的能源。在《太阳能利用技术》[3]就有相关的提到,所到达地球表面能量等同于每秒向地球源源不断的投放了500万吨煤炭。阳光所到之处,皆为财富,免费使用的同时也不需要考虑任何的运输费用以及零污染等特性。
缺点:即便如此的看似完美无缺,也存在着两个致命性缺点[4]:一是能流密度很小;二是太阳的光照强度也会因为(天气、白夜等)因素的不同而有着很大的差距,很难长时间维持在恒定值,这也在一定程度上大大的影响了使用效率[5]。
国外太阳追踪器:对太阳能的使用在两千零四年到两千零六年太阳能的发电量都是惊人的4961MW[6],在一九九七年,美国的Blackace研制了单轴追踪器,热接收率提高了百分之十五......,后期围绕高效率,轻质量展开。在太阳能游艇、太阳能飞机、太阳能瓦片等方面得到运用,也见证了太阳能利用的高效率性[7]。
国内太阳追踪器:在应用市场上面得到了不断扩张,对于太阳能追踪器的利用那也是一个相当热门的谈话主题,途径多年的经验,将其用在了太阳能热水器、太阳能路灯以及西部计划、利用太阳能发电、太阳能供暖等等[8]。
更多的往往是采用单轴跟踪的方式,相比之下更需要多轴,实现全方位无死角跟踪。
针对不同条件下,提出了自动控制和手动调节的两种工作方式:
其中以“自动模式”概述:在自动追寻的过程中,会自动判断光的强度的大小,若下面光照强度大于上面光照强度,STM32单片机就会直接驱动上端电机向下翻转;以便于在下午太阳西落的时候,获得更多的光照,若上面光照强度大于下面光照强度,STM32单片机就会直接驱动上端步进电机向上运动;若上下两个方位的光照强度均等,上端步进电机不进行动作。在上下光照均匀,左右方向运动的情况,右方位的光照强度大于左方位,STM32单片机就直接驱动下方位第一个步进电机向左方位一定角度转动;若左方位的光照强度大于右方位的光照强度,STM32单片机就直接驱动下方位第一个步进电机向左方位进行运动;当左右方位采光度也保持几乎均应的时候光照,那么下方位的第一个电机也将保持不动。
“手动模式”状态进行使用按键手动来完成设备状态的切换。四个按键对应控制电机完成:上、下、左、右的翻转动作。通过点动的方式来控制驱动步进电机的实际运动。
在给设备系统进行上电后,系统最初为“自动模式”,这样可以更好的在不受人为干预的情况下实现对太阳能的最大接收。
编译语言的选取
方案一:C语言
简洁紧凑、灵活方便;运算符的丰富性;数据结构的丰富性;结构式语言;语法局限性小,程序编写自由度大;通过对物理地址的直接访问,使得完全可以对硬件实现直接控制;程序执行效率高。
C语言面向过程,最主要的在于算法和数据结构。通过一个过程,对输入进行运算处理得到输出。
方案二:C++
C++语言是面向对象的语言,在C的基础上添加了面向对象、模板等现在程序设计语言的特性。拓展了面向对象设计的内容,使之更加符合现代程序设计的需要。
看似C++比C多了很多优点和特性,但C++并不是所有场合都适用,很多嵌入式开发系统,都只提供了C语言的开发环境,而没有提供C++的开发环境。很多C++语言不愿意干的脏活累活,C语言干起来快活得很。而C++因为过于复杂,在这方面就稍逊一筹了。
方案三:java
Java是一种解释性语言,Java人气极高,但其代码由于需要在运行前进行解释因此性能表现更差。C++会被编译为二进制形式,因此其能够立即运行且速度更快。两个程序都足够大、而且C++的代码经过优化,两者的速度差就会变得很显着甚至很惊人,C++会比java快很多。
从系统的复杂性出发来考虑,同时整个过程的计算量比较大,因此我选用了浮点数的计算方式,选用方案一作为整个系统编译方式。
2.2 控制系统总体方案选取
方案一:视日寻迹追踪模式
这样的一种模式,是基于天文学公式来得出太阳在不同时候的理论性的方位角和俯仰角,在后根据太阳每天在当地实际的运行轨迹位置编写控制算法程序,通过使用控制算法的方式来实现对太阳所在位置的计算,最后通过驱动太阳能板的两个步进电机来达到俯仰和方位上的转动。有点是对外界环境的依赖小,同是也存在弊端,那就是不管外界环境是何种天气,它都会以同样的工作方式运动,增加了不必要的能耗和元器件的寿命磨损。
太阳的俯仰角h和方位角A的两个位置参数,可表达如下所示:
δ为赤纬角,Φ是本地纬度,Ω表示太阳时角。
方案二:光电追踪模式
该模式的核心算法是利用光敏传感器对太阳位置进行检测。具体方法:在遮阳板两侧完全对称地安装光敏传感器,当太阳光垂直照射在太阳能光伏电池板上时,安装在两侧上的光敏传感器所产生的电信号相等,将这两路信号经过放大后送入比较器进行比较,此时不驱动步进电机进行转动。当太阳位置移动后,遮阳板对阳光进行遮挡,此时两侧的光敏传感器产生的电信号不相等,从而经过放大比较后产生差信号,电机开始运动,完成太阳跟踪过程。
通过两者的比较,选择方案二,简单易操作性,更适合被普及广泛使用,在同等使用条件下,最简方案,则是最优方案。
2.3主控系统选择
方案一:51单片机作为控制芯片。主要是表现在:主要控制参数是使用设置寄存器变量得以实现,在程序的修改方面,也是相当的方便快捷,成本也是相对低廉,性能与相对简单的太阳能跟踪装置系统匹配;数字化的控制系统,可以达到较高的精度。
方案二:采用FPGA这样的大规模可编程逻辑器件,但本题属于控制类,即现场可编程门阵列[WJ1] ,它是在PAL、EPLD等可编程器件的基础上进-一步发展的产物。
方案三:ARM作为一种高性能嵌入式系统。考虑到方案的可实行性,STM32可以很好的解决数据处理和控制功能,十分适用于太阳能跟踪,虽是ARM价格昂贵,但是在后期的可拓展空间更大。[WJ2]
结合本次设计的任务要求,以及上诉三种方案的相对比较,最后选用方案三更适合本课题的设计标准,具体采用STM32F103C8T6。
2.4电机选择
方案一:选择步进电机,然而步进电机的最大优点就是可以精确地控制电机步数和角度,缺点是价格昂贵。
方案二:选择直流电机。价格便宜是它的一大亮点,通过减速齿可以提高扭力,具有更大的负载,但是对电机的高精度控制直流电机达不到设计要求。
步进电机作为一种将电脉冲转换成相应角位移或线位移的电磁机械装置。通过直接控制输入的脉冲数量,直接控制其启停,启动是速度快,步距角和转速只取决于脉冲频率,受外界影响因素小。因此,对于本设计任务要求,为更精确地完成对角度值的精度把控,更好地利用太阳能,因此我选用方案一作为本次课程设计的驱动电机。
2.5步进电机驱动系统选择
方案一:L298专业电机驱动模块的选择,这类驱动模块的操作方便以及接口简单同时他们既可以驱动步进电机,也可驱动直流电机。
方案二:三极管等分立元件搭H桥。亮点在于实惠型,控制方式简单以及结构简单。优点的同时也伴随着弊端的存在,电流的承载能力比较小,相同的驱动能力受到限制,分立元件则体积较大同时稳定性也得不到保证。
方案三:采用集成芯片,ULN2003。 .
达林顿管ULN2003,该芯片最多可一次驱动八块步进电机,本设计作用于两个步进电机,在实际的使用中,往往起着放点输出的作用用于驱动大负载的步进电机等。
本次设计综合考虑,依据实际设计需求,选择方案三作为步进电机的驱动系统。
2.6实体结构框架选择
方案一:两电机互相处以垂直状态,电机一是左右的转动而电机二是上下的转动,在不引入外界条件辅助设备的情况下会出现运动死角,从成本化出发是不可取的。
方案二:将两个电机由之前的垂直安装,改变为大于90°的安装,在不引入外部设备的情况下,可以很好的避开运动死角,从而可实现全方位无死角跟踪,综合上述情况选择方案二进行本次的实体结构设计。
2.2系统设计
2.2.1 单片机构成如下图:
逻辑不通顺,要指出FPGA不适用于本题的缺点
STM32整体比FPGA便宜很多,这条论证建议修改,或者做一个成本对比表再下结论
控制方式:第一步就是将数据程序输入到输入设备里面,输入设备将程序传输给运算器CPU和存储器,各自程序都对应的传输到控制器里面,由控制器完成完成相互的指令传递,最后都是作用于输出设备,在输出设备上显示出来的结果就是最初程序所要表达的效果。
2.2.2 系统整体控制框图如下:
图2–2–2 系统整体控制框图
控制方式:完成整个驱动控制,第一步就是感光元件及光敏电阻传感器对外界光的采集,完成电压跟随,通过A/D转换,然后通过电压的比较,使用STM32F103C8T6单片机控制电机的驱动,最终完成不同电机在不同的光照强度情况下不同方向的运动,最后实现对光的最大化接收。
2.2.3 电机控制框图如下:
图2–2–3 电机控制框图
控制方式:通过光敏传感器对光的采集,实现了最后对电机运动方式的不同选择和控制。
当感光元器件第一组接受到的光照强度值大于其它三个方位的光照强度时,那么电机完成水平方向的电机正转,并返回最初状态。
当感光元器件第二组接受到的光照强度值大于其它三个方位的光照强度时,那么电机完成水平方向的电机反转,并返回最初状态。
当感光元器件第三组接受到的光照强度值大于其它三个方位的光照强度时,那么电机完成垂直方向的电机正转,并返回最初状态。
当感光元器件第四组接受到的光照强度值大于其它三个方位的光照强度时,那么电机完成垂直方向的电机反正,并返回最初状态。
当所有的感光元器件都处于接受管的均匀照射时,此时的光照强度几乎大小相等,也就电机的状态保持不运动。
2.2.4整体电路原理图如下:
图2-2-4 整体电路原理图
系统软件总体设计流程如图 2-2-4 所示。系统启动后,软件先进行初始化等工作,当程序初始化完成后,通过 感光元器件获得当前的光照强度,然后根据初始化的参数,控制步进电机将太阳能光伏板转动到理论的初始状态,预定方位。将太阳能光伏板转动到理论位置后,程序开始判断步进电机转动模式是手动模式还是自动,初始默认状态是自动跟踪模式。
当手动模式时,人为调整电机控制上下左右 4 个按键的状态,使得电机按照人们预想的方向进行运动,以此来得以控制四个方位的不同垂直转动和水平移动的俯仰角和方位角。当程序判断为自动模式后,开始自动读取检测电路的返回信号,当检测到是各个方位的光照强度值有较大的的差异是,那么单片机就发出控制指令控制步进电机进行转动,升压模块是为了给整个系统稳定供电而存在。
2. 单片机直流电机调速系统设计
论文题目:直流电动机调速器硬件设计
专业:自动化
本科生:刘小煜 (签名)____
指导教师:胡晓东 (签名)____
直流电动机调速器硬件设计
摘 要
直流电动机广泛应用于各种场合,为使机械设备以合理速度进行工作则需要对直流电机进行调速。该实验中搭建了基于C8051F020单片机的转速单闭环调速系统,利用PWM信号改变电动机电枢电压,并由软件完成转速单闭环PI控制,旨在实现直流电动机的平滑调速,并对PI控制原理及其参数的确定进行更深的理解。实验结果显示,控制8位PWM信号输出可平滑改变电动机电枢电压,实现电动机升速、降速及反转等功能。实验中使用霍尔元件进行电动机转速的检测、反馈。期望转速则可通过功能按键给定。当选择比例参数为0.08、积分参数为0.01时,电机转速可以在3秒左右达到稳定。由实验结果知,该单闭环调速系统可对直流电机进行调速,达到预期效果。
关键字:直流电机, C8051F020,PWM,调速,数字式
Subject: Hardware Design of Speed Regulator for DC motor
Major: Automation
Name: Xiao yu Liu (Signature)____
Instructor:Xiao dong Hu (Signature) ____
Hardware Design of Speed Regulator for DC motor
Abstract
The dc motor is a widely used machine in various occasions.The speed regulaiting systerm is used to satisfy the requirement that the speed of dc motor be controlled over a range in some applications. In this experiment,the digital Close-loop control systerm is based on C8051F020 SCM.It used PI regulator and PWM to regulate the speed of dc motor. The method of speed regulating of dc motor is discussed in this paper and, make a deep understanding about PI regulator.According to experiment ,the armature voltage can be controlled linearnized with regulating the 8 bit PWM.So the dc motor can accelerate or decelerate or reverse.In experiment, hall component is used as a detector and feed back the speed .The expecting speed can be given by key-press.With using the PI regulator,the dc motor will have a stable speed in ten seconds when choose P value as 0.8 and I value as 0.01. At last,the experiment shows that the speed regulating systerm can work as expected.
Key words: dc motor,C8051F020,PWM,speed regulating,digital
目录
第一章 绪论 1
1.1直流调速系统发展概况 1
1.2 国内外发展概况 2
1.2.1 国内发展概况 2
1.2.2 国外发展概况 3
1.2.3 总结 4
1.3 本课题研究目的及意义 4
1.4 论文主要研究内容 4
第二章 直流电动机调速器工作原理 6
2.1 直流电机调速方法及原理 6
2.2直流电机PWM(脉宽调制)调速工作原理 7
2.3 转速负反馈单闭环直流调速系统原理 11
2.3.1 单闭环直流调速系统的组成 11
2.3.2速度负反馈单闭环系统的静特性 12
2.3.3转速负反馈单闭环系统的基本特征 13
2.3.4转速负反馈单闭环系统的局限性 14
2.4 采用PI调节器的单闭环无静差调速系统 15
2.5 数字式转速负反馈单闭环系统原理 17
2.5.1原理框图 17
2.5.2 数字式PI调节器设计原理 18
第三章 直流电动机调速器硬件设计 20
3.1 系统硬件设计总体方案及框图 20
3.1.1系统硬件设计总体方案 20
3.1.2 总体框图 20
3.2 系统硬件设计 20
3.2.1 C8051F020单片机 20
3.2.1.1 单片机简介 20
3.2.1.2 使用可编程定时器/计数器阵列获得8位PWM信号 23
3.2.1.3 单片机端口配置 23
3.2.2主电路 25
3.2.3 LED显示电路 26
3.2.4 按键控制电路 27
3.2.5 转速检测、反馈电路 28
3.2.6 12V电源电路 30
3.3硬件设计总结 31
第四章 实验运行结果及讨论 32
4.1 实验条件及运行结果 32
4.1.1 开环系统运行结果 32
4.1.2 单闭环系统运行结果 32
4.2 结果分析及讨论 32
4.3 实验中遇到的问题及讨论 33
结论 34
致谢 35
参考文献 36
论文小结 38
附录1 直流电动机调速器硬件设计电路图 39
附录2 直流电动机控制系统程序清单 42
附录3 硬件实物图 57
第一章 绪论
1.1直流调速系统发展概况
在现代工业中,电动机作为电能转换的传动装置被广泛应用于机械、冶金、石油化学、国防等工业部门中,随着对生产工艺、产品质量的要求不断提高和产量的增长,越来越多的生产机械要求能实现自动调速。
在可调速传动系统中,按照传动电动机的类型来分,可分为两大类:直流调速系统和交流调速系统。交流电动机直流具有结构简单、价格低廉、维修简便、转动惯量小等优点,但主要缺点为调速较为困难。相比之下,直流电动机虽然存在结构复杂、价格较高、维修麻烦等缺点,但由于具有较大的起动转矩和良好的起、制动性能以及易于在宽范围内实现平滑调速,因此直流调速系统至今仍是自动调速系统的主要形式。
直流调速系统的发展得力于微电子技术、电力电子技术、传感器技术、永磁材料技术、自动控制技术和微机应用技术的最新发展成就。正是这些技术的进步使直流调速系统发生翻天覆地的变化。其中电机的控制部分已经由模拟控制逐渐让位于以单片机为主的微处理器控制,形成数字与模拟的混合控制系统和纯数字控制系统,并正向全数字控制方向快速发展。电动机的驱动部分所用的功率器件亦经历了几次更新换代。目前开关速度更快、控制更容易的全控型功率器件MOSFET和IGBT成为主流。功率器件控制条件的变化和微电子技术的使用也使新型的电动机控制方法能够得到实现。脉宽调制控制方法在直流调速中获得了广泛的应用。
1964年A.Schonung和H.stemmler首先提出把PWM技术应用到电机传动中从此为电机传动的推广应用开辟了新的局面。进入70年代以来,体积小、耗电少、成本低、速度快、功能强、可靠性高的大规模集成电路微处理器已经商品化,把电机控制推上了一个崭新的阶段,以微处理器为核心的数字控制(简称微机数字控制)成为现代电气传动系统控制器的主要形式。PWM常取代数模转换器(DAC)用于功率输出控制,其中,直流电机的速度控制是最常见的应用。通常PWM配合桥式驱动电路实现直流电机调速,非常简单,且调速范围大。在直流电动机的控制中,主要使用定频调宽法。
目前,电机调速控制模块主要有以下三种:
(1)、采用电阻网络或数字电位器调整直流电机的分压,从而达到调速的目的;
(2)、采用继电器对直流电机的开或关进行控制,通过开关的切换对电机的速度进行调整;
(3)、采用由IGBT管组成的H型PWM电路。用单片机控制IGBT管使之工作在占空比可调的开关状态,精确调整电动机转速。
1.2 国内外发展概况
1.2.1 国内发展概况
我国从六十年代初试制成功第一只硅晶闸管以来,晶闸管直流调速系统开始得到迅速的发展和广泛的应用。用于中、小功率的 0.4~200KW晶闸管直流调速装置已作为标准化、系列化通用产品批量生产。
目前,全国各大专院校、科研单位和厂家都在进行数字式直流调速系统的开发,提出了许多关于直流调速系统的控制算法:
(1)、直流电动机及直流调速系统的参数辩识的方法。该方法据系统或环节的输入输出特性,应用最小二乘法,即可获得系统环节的内部参数。所获得的参数具有较高的精度,方法简便易行。
(2)、直流电动机调速系统的内模控制方法。该方法依据内模控制原理,针对双闭环直流电动机调速系统设计了一种内模控制器,取代常规的PI调节器,成功解决了转速超调问题,能使系统获得优良的动态和静态性能,而且设计方法简单,控制器容易实现。
(3)、单神经元自适应智能控制的方法。该方法针对直流传动系统的特点,提出了单神经元自适应智能控制策略。这种单神经元自适应智能控制系统不仅具有良好的静、动态性能,而且还具有令人满意的鲁棒性与自适应性。
(4)、模糊控制方法。该方法对模糊控制理论在小惯性系统上对其应用进行了尝试。经1.5kw电机实验证明,模糊控制理论可以用于直流并励电动机的限流起动和恒速运行控制,并能获得理想的控制曲线。
上诉的控制方法仅是直流电机调速系统应用和研究的一个侧面,国内外还有许多学者对此进行了不同程度的研究。
1.2.2 国外发展概况
随着各种微处理器的出现和发展,国外对直流电机的数字控制调速系统的研究也在不断发展和完善,尤其80年代在这方面的研究达到空前的繁荣。大型直流电机的调速系统一般采用晶闸管整流来实现,为了提高调速系统的性能,研究工作者对晶闸管触发脉冲的控制算法作了大量研究,提出了内模控制算法、I-P控制器取代PI调节器的方法、自适应和模糊PID算法等等。
目前,国外主要的电气公司,如瑞典ABB公司,德国西门子公司、AEG公司,日本三菱公司、东芝公司、美国GE公司等,均已开发出数字式直流调装置,有成熟的系列化、标准化、模版化的应用产品供选用。如西门子公司生产的SIMOREG-K 6RA24 系列整流装置为三相交流电源直接供电的全数字控制装置,其结构紧凑,用于直流电机电枢和励磁供电,完成调速任务。设计电流范围为15A至1200A,并可通过并联SITOR可控硅单元进行扩展。根据不同的应用场合,可选择单象限或四象限运行的装置,装置本身带有参数设定单元,不需要其它任何附加设备便可以完成参数设定。所有控制调节监控及附加功能都由微处理器来实现,可选择给定值和反馈值为数字量或模拟量。
1.2.3 总结
随着生产技术的发展,对直流电气传动在起制动、正反转以及调速精度、调速范围、静态特性、动态响应等方面都提出了更高的要求,这就要求大量使用直流调速系统。因此人们对直流调速系统的研究将会更深一步。
1.3 本课题研究目的及意义
直流电动机是最早出现的电动机,也是最早实现调速的电动机。长期以来,直流电动机一直占据着调速控制的统治地位。由于它具有良好的线性调速特性,简单的控制性能,高效率,优异的动态特性,现在仍是大多数调速控制电动机的最优选择。因此研究直流电机的速度控制,有着非常重要的意义。
随着单片机的发展,数字化直流PWM调速系统在工业上得到了广泛的应用,控制方法也日益成熟。它对单片机的要求是:具有足够快的速度;有PWM口,用于自动产生PWM波;有捕捉功能,用于测频;有A/D转换器、用来对电动机的输出转速、输出电压和电流的模拟量进行模/数转换;有各种同步串行接口、足够的内部ROM和RAM,以减小控制系统的无力尺寸;有看门狗、电源管理功能等。因此该实验中选用Cygnal公司的单片机C8051F020。
通过设计基于C8051F020单片机的直流PWM调速系统并调试得出结论,在掌握C8051F020的同时进一步加深对直流电动机调速方法、PI控制器的理解,对运动控制的相关知识进行巩固。
1.4 论文主要研究内容
本课题的研究对象为直流电动机,对其转速进行控制。基本思想是利用C8051F020自带的PWM口,通过调整PWM的占空比,控制电机的电枢电压,进而控制转速。
系统硬件设计为:以C8051F020为核心,由转速环、显示、按键控制等电路组成。
具体内容如下:
(1)、介绍直流电动机工作原理及PWM调速方法。
(2)、完成以C8051F020为控制核心的直流电机数字控制系统硬件设计。
(3)、以该系统的特点为基础进行分析,使用PWM控制电机调速,并由实验得到合适的PI控制及相关参数。
(4)、对该数字式直流电动机调速系统的性能做出总结。
第二章 直流电动机调速器工作原理
2.1 直流电机调速方法及原理
直流电动机的转速和各参量的关系可用下式表示:
由上式可以看出,要想改变直流电机的转速,即调速,可有三种不同的方式:调节电枢供电电压U,改变电枢回路电阻R,调节励磁磁通Φ。
3种调速方式的比较表2-1所示.
表2-1 3种电动机调速方式对比
调速方式和方法 控制装置 调速范围 转速变化率 平滑性 动态性能 恒转矩或恒功 率 效率
改变电枢电阻 串电枢电阻 变阻器或接触器、电阻器 2:1 低速时大 用变阻器较好
用接触器、电阻器较差 无自动调节能力 恒转矩 低
改变电枢电压 电动机-发电机组 发电机组或电机扩大机(磁放大器) 10:1~20:1 小 好 较好 恒转矩 60%~70%
静止变流器 晶闸管变流器 50:1~100:1 小 好 好 恒转矩 80%~90%
直流脉冲调宽 晶体管或晶闸管直流开关电路 50:1~100:1 小 好 好 恒转矩 80%~90%
改变磁通 串联电阻或可变直流电源 直流电源变阻器 3:1
~
5:1 较大 差 差 恒功率 80%~90%
电机扩大机或磁放大器 好 较好
晶闸管变流器 好
由表2-1知,对于要求在一定范围内无级平滑调速的系统来说,以调节电枢供电电压的方式为最佳,而变电枢电压调速方法亦是应用最广的调速方法。
2.2直流电机PWM(脉宽调制)调速工作原理
在直流调速系统中,开关放大器提供驱动电机所需要的电压和电流,通过改变加在电动机上的电压的平均值来控制电机的运转。在开关放大器中,常采用晶体管作为开关器件,晶体管如同开关一样,总是处在接通和断开的状态。在晶体管处在接通时,其上的压降可以略去;当晶体管处在断开时,其上的压降很大,但是电流为零,所以不论晶体管导通还是关断,输出晶体管中的功耗都是很小的。一种比较简单的开关放大器是按照一个固定的频率去接通和断开放大器,并根据需要改变一个周期内“接通”和“断开”的相位宽窄,这样的放大器被称为脉冲调制放大器。
PWM脉冲宽度调制技术就是通过对一系列脉冲的宽度进行调制,来等效地获得获得所需要波形(含形状和幅值)的技术。
根据PWM控制技术的特点,到目前为止主要有八类方法:相电压控制PWM、线电压控制PWM、电流控制PWM、非线性控制PWM,谐振软开关PWM、矢量控制PWM、直接转矩控制PWM、空间电压矢量控制PWM。
利用开关管对直流电动机进行PWM调速控制原理图及输入输出电压波形如图2-1、图2-2所示。当开关管MOSFET的栅极输入高电平时,开关管导通,直流电动机电枢绕组两端由电压。秒后,栅极输入变为低电平,开关管截止,电动机电枢两端电压为0。秒后,栅极输入重新变为高电平,开关管的动作重复前面的过程。这样,对应着输入的电平高低,直流电动机电枢绕组两端的电压波形如图2-2所示。电动机的电枢绕组两端的电压平均值为:
式2-1
式中 ——占空比,
占空比表示了在一个周期里,开关管导通的时间与周期的比值。的变化范围为0≤≤1。由式2-1可知,当电源电压不变的情况下,电枢的端电压的平均值取决于占空比的大小,改变值就可以改变端电压的平均值,从而达到调速的目的,这就是PWM调速原理。
在PWM调速时,占空比是一个重要参数。以下是三种可改变占空比的方法:
(1)、定宽调频法:保持不变,改变,从而改变周期(或频率)。
(2)、调宽调频法:保持不变,改变,从而改变周期(或频率)。
(3)、定频调宽法:保持周期(或频率)不变,同时改变、。
前2种方法由于在调速时改变了控制脉冲的周期(或频率),当控制脉冲的频率与系统的固有频率接近时,将会引起振荡,因此应用较少。目前,在直流电动机的控制中,主要使用第3种方法。
图2-1 PWM调速控制原理
图2-2 输入输出电压波形
产生PWM控制信号的方法有4种,分别为:
(1)、分立电子元件组成的PWM信号发生器
这种方法是用分立的逻辑电子元件组成PWM信号电路。它是最早期的方式,现在已经被淘汰了。
(2)、软件模拟法
利用单片机的一个I/O引脚,通过软件对该引脚不断地输出高低电平来实现PWM信号输出。这种方法要占用CPU大量时间,需要很高的单片机性能,易于实现,目前也逐渐被淘汰。
(3)、专用PWM集成电路
从PWM控制技术出现之日起,就有芯片制造商生产专用的PWM集成电路芯片,现在市场上已有许多种。这些芯片除了由PWM信号发生功能外,还有“死区”调节功能、保护功能等。在单片机控制直流电动机系统中,使用专用PWM集成电路可以减轻单片机负担,工作也更可靠。
(4)、单片机PWM口
新一代的单片机增加了许多功能,其中包括PWM功能。单片机通过初始化设置,使其能自动地发出PWM脉冲波,只能在改变占空比时CPU才进行干预。
其中常用后两中方法获得PWM信号。实验中使用方法(4)获得PWM信号。
2.3 转速负反馈单闭环直流调速系统原理
2.3.1 单闭环直流调速系统的组成
只通过改变触发或驱动电路的控制电压来改变功率变换电路的输出平均电压,达到调节电动机转速的目的,称为开环调速系统。但开环直流调速系统具有局限性:
(1)、通过控制可调直流电源的输入信号,可以连续调节直流电动机的电枢电压,实现直流电动机的平滑无极调速,但是,在启动或大范围阶跃升速时,电枢电流可能远远超过电机额定电流,可能会损坏电动机,也会使直流可调电源因过流而烧毁。因此必须设法限制电枢动态电流的幅值。
(2)、开环系统的额定速降一般都比较大,使得开环系统的调速范围D都很小,对于大部分需要调速的生产机械都无法满足要求。因此必须采用闭环反馈控制的方法减小额定动态速降,以增大调速范围。
(3)、开环系统对于负载扰动是有静差的。必须采用闭环反馈控制消除扰动静差
为克服其缺点,提高系统的控制质量,必须采用带有负反馈的闭环系统,方框图如图2-3所示。在闭环系统中,把系统输出量通过检测装置(传感器)引向系统的输入端,与系统的输入量进行比较,从而得到反馈量与输入量之间的偏差信号。利用此偏差信号通过控制器(调节器)产生控制作用,自动纠正偏差。因此,带输出量负反馈的闭环控制系统能提高系统抗扰性,改善控制精度的性能,广泛用于各类自动调节系统中。
3. C语言课程设计,贪吃蛇应该怎么做
2.1程序功能介绍
贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。
2.2程序整体设计说明
一个游戏要有开始部分,运行部分,结束部分(实际上开始部分与运行部分是一体的)。
2.2.1设计思路
这个程序的关键是表示蛇的图形以及蛇的移动。用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用两节表示。移动时必须从蛇头开始,所以蛇不能向相反方向移动,也就是蛇尾不能改作蛇头。如果不按任何键,蛇自行在当前方向上前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,这时由于没有庆平的原因,原来蛇的位置和新蛇的位置差一个单位,所以看起来社会多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现和消失也是画矩形块和覆盖矩形块
2.2.2数据结构设计及用法说明
开始部分:
游戏是运行在图形模式下的,所以第一步一定是初始化图形模式,接着要有开始的界面,就像书有封面一样,我设置了一个游戏的标题画面,除了游戏标题画面我还设置了一个欢迎画面。标题画面以后,还要为游戏的运行部分作初始化,包括绘制游戏运行时的背景,对游戏某些重 要变量的初始化。
运行部分:
作为游戏的核心部分,这里包括的函数比较多,也就是模块比较多,首先让我模拟一下贪吃蛇的游戏模式:某个世界上突然出现一条蛇,它很短,它的运动神经异常,它没法停止自己的多动症在它的世界里就只有食物,它很饿,也很贪吃;同样在不明原因的情况下,食物从天而降,可惜的是没有落到嘴边;饥饿的主人公,不管它有没有毒,也不问食物的来历,径直向食物爬去;它吃到食物啦,它超出想象的同化能力让食物很快的成为自己身体的一部分,它的身子变长啦。当它吃到第一颗食物时,上帝有给它第二颗,于是它吃了第二颗,于是又变长了,于是又有第三颗??它的身子是一直的加长,它不管自己过长身体的麻烦——转身不便,继续吃下去,现在它是直接把巴张大,好让食物有个绿色通道。但是在某天的下午,它咬到了自己,它才想起自己是一条毒蛇,于是晕死过去(不是毒死);又或者它往食物冲锋的时候,它失去控制,撞到了墙上。
第一轮循环:第一步,出现食物;第二步,蛇不停运动;第三步,检查蛇是撞到自己或墙壁;由第四步起游戏有两条支线(A、B):
A :第四步,蛇没有碰到自己或墙壁,蛇继续前进,绘制蛇的动作;第五步,判断蛇是否吃到食物,如果蛇吃到食物,身子变长,原来的食物消失;第六步,让玩家输入控制指令,让蛇在下一轮循环的第二步改变运动方向;第七步,第二轮循环的第一步,重复第一轮的步骤;
B:第四步,蛇碰到自己或墙壁,终止游戏。
结束部分:
游戏结束时,显示“GAME OVER”,已经是约定俗成的规律了,我的游戏也不例外。除了游戏结束画面外,我还设置了一个游戏退出画面,“善始善终”嘛。
有了上述的大致划分,我把整个程序划分成(13+2)个模块(其实就是函数)
2.2.3程序结构(流程图)
图2.1流程图
依据所需要处理的任务要求,规划输入数据和输出结果,决定存放数据的数据结构。
C语言中数据结构集中体现在数据类型上,因此在进行C语言程序设计时,应统筹规划程序中所使用的变量,数组,指针等,以及它们的类型等。这点是很重要的,如果在此期间选择不合适的变量或者数组,将来修改就十分困难。
现在分析一下贪吃蛇游戏中的元素,继而得出与它们对应的在程序中的描述:
蛇:
基本描述:长度,颜色,位置。
对应数据与数据类型:长度—虽然可以用坐标表示,但是这样的话,运算量将很大,所以换算成较大的单位—节数,以固定长度的每节描述;坐标--整型;颜色--整型; 位置--X,Y坐标。
增加的描述:蛇运动的方向,蛇的生命。
对应数据与数据类型:这些描述是为了与程序的按键的输入部分与判断游戏结束部分相联系而设的。方向只有四个方向:上下左右。可以设置与之对应的四个整型数:3、4、2、1。生命就只有两种情况:死或生,对应0或1。
食物:
基本描述:颜色,位置。
对应数据与数据类型:由于颜色设成固定的,所以不再讨论。位置—X、Y坐标。
增加的描述:食物的存在。
对应数据与数据类型:这是为了避免重复出现食物而设置的,与绘制食物的函数有联系。只有两个值:0或1(没有食物或有食物)
其他的元素:墙,由于它在显示上是作为背景而存在的,所以并没有什么说明实际的墙壁就是四条直线组成的边框,由坐标描述。
还需要的变量:键盘键入的键值(作为全局变量,整型);经常要使用的循环变量;自定义的填充图案;说明文字的字符数组;游戏的记分;游戏的速度(蛇的速度)。
图2.2蛇的不停运动的关键算法的流程图
2.2.4各模块的功能及程序说明
主要模块的实现思路和算法的流程图说明:
关键所在——蛇不停移动的Snakemove():
蛇的不停移动,就是蛇的下一节取代前一节的位置,在计算机中就是蛇下一节的位置坐标变成前一节的位置坐标。在上文中,已定义蛇的位置坐标为数组类型,一组坐标对应一节的位置,假设有i+1节,由0到i节,第i节的坐标取第i-1节的坐标,第i-1节的坐标取第i-2节的坐标??直到第1节取第0节的坐标。而第0节的坐标,即蛇头的坐标要往某个方向变化,变化量为蛇每节的长度。蛇的这种坐标轮换需要循环语句使其继续下去。
2.2.5程序结果
运行程序得到如下初始界面图:
图2.3程序结果图
用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用两节表示:
图2.4程序结果图
蛇没有碰到自己或墙壁,蛇继续前进:
图2.5程序结果图
游戏结束时,显示“GAME OVER”
图2.6程序结果图
2.3程序源代码及注释
#define N 200
#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
int i,key;
int score=0;/*得分*/
int gamespeed=50000;/*游戏速度自己调整*/
struct Food{
int x;/*食物的横坐标*/
int y;/*食物的纵坐标*/
int yes;/*判断是否要出现食物的变量*/
}food;/*食物的结构体*/
struct Snake{
int x[N];
int y[N];
int node;/*蛇的节数*/
int direction;/*蛇移动方向*/
int life;/* 蛇的生命,0活着,1死亡*/
}snake;
void Init(void);/*图形驱动*/
void Close(void);/*图形结束*/
void DrawK(void);/*开始画面*/
void GameOver(void);/*结束游戏*/
void GamePlay(void);/*玩游戏具体过程*/
void PrScore(void);/*输出成绩*/
/*主函数*/
void main(void){
Init();/*图形驱动*/
DrawK();/*开始画面*/
GamePlay();/*玩游戏具体过程*/
Close();/*图形结束*/}
/*图形驱动*/
void Init(void){
int gd=DETECT,gm;
registerbgidriver(EGAVGA_driver);
initgraph(&gd,&gm,"c:\program files\winyes\tc20h\bgi");
cleardevice();}
/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
void DrawK(void){
/*setbkcolor(LIGHTGREEN);*/
setcolor(11);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/
for(i=50;i<=600;i+=10)/*画围墙*/ {
rectangle(i,40,i+10,49); /*上边*/
rectangle(i,451,i+10,460);/*下边*/ }
for(i=40;i<=450;i+=10) {
rectangle(50,i,59,i+10); /*左边*/
rectangle(601,i,610,i+10);/*右边*/ }}
/*玩游戏具体过程*/
void GamePlay(void){
randomize();/*随机数发生器*/
food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/
snake.life=0;/*活着*/
snake.direction=1;/*方向往右*/
snake.x[0]=100;snake.y[0]=100;/*蛇头*/
snake.x[1]=110;snake.y[1]=100;
snake.node=2;/*节数*/
PrScore();/*输出得分*/
while(1)/*可以重复玩游戏,压ESC键结束*/ {
while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/ {
if(food.yes==1)/*需要出现新食物*/ {
food.x=rand()%400+60;
food.y=rand()%350+60;
while(food.x%10!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
food.x++;
while(food.y%10!=0)
food.y++;
food.yes=0;/*画面上有食物了*/ }
if(food.yes==0)/*画面上有食物了就要显示*/ {
setcolor(GREEN);
rectangle(food.x,food.y,food.x+10,food.y-10); }
for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/ {
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1]; }
/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/
switch(snake.direction) {
case 1:snake.x[0]+=10;break;
case 2: snake.x[0]-=10;break;
case 3: snake.y[0]-=10;break;
case 4: snake.y[0]+=10;break; }
for(i=3;i<snake.node;i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/ {
if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]) {
GameOver();/*显示失败*/
snake.life=1;
break; } }
if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||
snake.y[0]>455)/*蛇是否撞到墙壁*/ {
GameOver();/*本次游戏结束*/
snake.life=1; /*蛇死*/ }
if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/
break;
if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/ {
setcolor(0);/*把画面上的食物东西去掉*/
rectangle(food.x,food.y,food.x+10,food.y-10);
snake.x[snake.node]=-20;snake.y[snake.node]=-20;
/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
snake.node++;/*蛇的身体长一节*/
food.yes=1;/*画面上需要出现新的食物*/
score+=10;
PrScore();/*输出新得分*/ }
setcolor(4);/*画出蛇*/
for(i=0;i<snake.node;i++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,
snake.y[i]-10);
delay(gamespeed);
setcolor(0);/*用黑色去除蛇的的最后一节*/
rectangle(snake.x[snake.node-1],snake.y[snake.node-1],
snake.x[snake.node-1]+10,snake.y[snake.node-1]-10); } /*endwhile(!kbhit)*/
if(snake.life==1)/*如果蛇死就跳出循环*/
break;
key=bioskey(0);/*接收按键*/
if(key==ESC)/*按ESC键退出*/
break;
else
if(key==UP&&snake.direction!=4)
/*判断是否往相反的方向移动*/
snake.direction=3;
else
if(key==RIGHT&&snake.direction!=2)
snake.direction=1;
else
if(key==LEFT&&snake.direction!=1)
snake.direction=2;
else
if(key==DOWN&&snake.direction!=3)
snake.direction=4;
}/*endwhile(1)*/}
/*游戏结束*/
void GameOver(void){
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"GAME OVER");
getch();}
/*输出成绩*/
void PrScore(void){
char str[10];
setfillstyle(SOLID_FILL,YELLOW);
bar(50,15,220,35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"score:%d",score);
outtextxy(55,20,str);}
/*图形结束*/
void Close(void){
getch();
closegraph();
}
4. 简易8按键电子琴设计实验
简易电子琴的设计
摘 要 随着基于CPLD的EDA技术的发展和应用领域的扩大与深入,EDA技术在电子信息、通信、自动控制用计算机等领域的重要性日益突出。作为一个学电子信息专业的学生,我们必须不断地了解更多的新产品信息,这就更加要求我们对EDA有个全面的认识。本程序设计的是简易电子琴的设计。采用EDA作为开发工具,VHDL语言为硬件描述语言,MAX + PLUS II作为程序运行平台,所开发的程序通过调试运行、波形仿真验证,初步实现了设计目标。本程序使用的硬件描述语言VHDL,可以大大降低了硬件数字系统设计的入门级别,让人感觉就是C语言的近亲。通过老师的指导和自己的学习完成了预想的功能。
关键词 电子琴;课程设计;EDA;VHDL
1 引言
1.1 课程设计胡配陪的目的
巩固和运用所学课程,理论联系实际,提高分析、解决计算机技术实际问题的独立工作能力,通过对一个简易的八音符电子琴的设计,进一步加深对计算机原理以及数字电路应用技术方面的了解与认识,进一步熟悉数字电路系统设计、制作与调试的方法和步骤。巩固所学课堂知识,理论联系实际,提高分析、解决计算机技术实际问题的独立工作能力。为了进一步了解计算机组成原理与系统结构,深入学习EDA技术,用VHDL语言去控制将会使我们对本专业知识可以更好地掌握。
1.2 课程设计的内容
(1)设计一个简易的八音符电子琴,它可通过按键输入来控制音响。
(2)演奏时可以选择是手动演奏(由键盘输入)还是自动演奏已存入的乐曲。
(3)能够自动演奏多首乐曲,且每首乐曲可重复演奏。
2 开发工具简介
2.1 EDA技术
EDA是电子设计自动化(Electronic Design Automation)缩写,是90年代初从CAD(计算机辅助设计)、CAM(计算机辅助制造)、CAT(计算机辅助测试)和CAE(计算机辅助工程)的概念发展而来的。EDA技术是以计算机为工具,根据硬件描述语言HDL( Hardware Description language)完成的设计文件,自动地完成逻辑编译、化简、分割、综合及优化、布局布线、仿真以及对于特定目标芯片的适配编译和编程裤蠢下载等工作。典型的EDA工具中必须包含两个特殊的软件包,即综合器和适配器。综合器的功能就是将设计者在EDA平台上完成的针对某个系统项目的HDL、原理图或状态图形描述,针对给定的硬件系统组件,进行编译、优化、转换和综合,最终获得我们欲实现功能的描述文件。综合器在工作前,必须给定所要实现的硬件结构参数,它的功能就是将软件描述与给定的硬件结构用一定的方式联系起来。也就是说,综合器是软件描述与硬件实现的一座桥梁。综合过程就是将电路的高级语言描述转换低级的、可与目标器件FPGA/CPLD相映射的网表文件。
适配器的功能是将由综合器产生的王表文件配置与指定的目标器件中,产生最终的下载文件,如JED文件。适配所选定的目标器件(FPGA/CPLD芯片)必须属于在综合器中已指定的目标器件系列。
硬件描述语言HDL是相对于一般的计算机软件语言,如:C、PASCAL而言的。HDL语言使用与设计硬件电子系统的计算机语言,它能描述电子系统的逻辑功能、电路结构和连接方式。设计者可利用HDL程序来描述所希望的电路系统,规定器件结构特征和电路的行为方式;然后利用综合器和适配器将此程序编程能控制FPGA和CPLD内部结构,并实现相应逻辑功能的的门级或更底层的结构网表文件或下载文件。目前,就FPGA/CPLD开发来说,比较常用和流行的HDL主要有ABEL-HDL、AHDL和VHDL。
2.2硬件描述语言—VHDL
VHDL的英文全名是Very-High-Speed Integrated Circuit Hardware Description Language,诞生于1982年。1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言 。自IEEE公布了VHDL的标准版本,IEEE-1076(简称87版)之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工卖弊具可以和VHDL接口。此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本,(简称93版)。现在,VHDL和Verilog作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。有专家认为,在新的世纪中,VHDL于Verilog语言将承担起大部分的数字系统设计任务。
VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可是部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。应用VHDL进行工程设计的优点是多方面的。
(1) 与其他的硬件描述语言相比,VHDL具有更强的行为描述能力,从而决定了他成为系统设计领域最佳的硬件描述语言。强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统的重要保证。
(2) VHDL丰富的仿真语句和库函数,使得在任何大系统的设计早期就能查验设计系统的功能可行性,随时可对设计进行仿真模拟。
(3) VHDL语句的行为描述能力和程序结构决定了他具有支持大规模设计的分解和已有设计的再利用功能。符合市场需求的大规模系统高效,高速的完成必须有多人甚至多个代发组共同并行工作才能实现。(4)对于用VHDL完成的一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动的把VHDL描述设计转变成门级网表。
(4) VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管理最终设计实现的目标器件是什么,而进行独立的设计。
2.3 VHDL的设计流程:
(1) 设计输入根据电路设计所提出的要求,将程序输入到VHDL编辑器中去编辑。
(2) 功能级模拟用VHDL,模拟器对编辑后的程序进行模拟,如果达不到设计要求,则可以重新修改程序,直到通过功能模拟。
(3) 逻辑综合与优化 将通过功能模拟的程序放到VHDL编译器中,进行逻辑综合与优化。
(4) 门级模拟对电路用VHDL。仿真器仿真。可对门级电路的延时、定时状态、驱动能力等进行仿真。如不符合要求,可重复步骤(3),再门级模拟,直到符合要求止。
(5) 版图生成 用相应的软件处理后,就可以拿去制版。
设计过程
3.1设计规划
根据系统设计要求,系统设计采用自顶向下的设计方法,系统的整体组装设计原理图如图3-1所示,它由乐曲自动演奏模块、音调发生模块和数控分频模块三部分组成。
图3-1 系统的整体组装设计原理图
3.2 各模块的原理及其程序
(1)乐曲自动演奏模块
乐曲自动演奏模块(AUTO.VHD)的作用是产生8位发声控制输入信号/当进行自动演奏时,由存储在此模块中的8位二进制数作为发声控制输入,从而自动演奏乐曲。
VHDL源程序(AUTO.VHD)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY AUTO IS
PORT ( CLK : IN STD_LOGIC;
AUTO : IN STD_LOGIC;
CLK2 : BUFFER STD_LOGIC;
INDEX2 : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
INDEX0 : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END AUTO;
ARCHITECTURE BEHAVIORAL OF AUTO IS
SIGNAL COUNT0: INTEGER RANGE 0 TO 31;
BEGIN
PULSE0 :PROCESS(CLK,AUTO)
VARIABLE COUNT :INTEGER RANGE 0 TO 8;
BEGIN
IF AUTO ='1' THEN
COUNT := 0;CLK2<='0';
ELSIF(CLK'EVENT AND CLK ='1')THEN
COUNT :=COUNT +1;
IF COUNT =4 THEN
CLK2 <='1';
ELSIF COUNT =8 THEN
CLK2<='0'; COUNT:=0;
END IF ;
END IF ;
END PROCESS;
MUSIC:PROCESS(CLK2)
BEGIN
IF (CLK2'EVENT AND CLK2='1')THEN
IF (COUNT0=31)THEN
COUNT0<=0;
ELSE
COUNT0<=COUNT0+1;
END IF ;
END IF ;
END PROCESS;
COM1:PROCESS(COUNT0,AUTO,INDEX2)
BEGIN
IF AUTO ='0' THEN
CASE COUNT0 IS
WHEN 0=>INDEX0<="00000100"; --3
WHEN 1=>INDEX0<="00000100"; --3
WHEN 2=>INDEX0<="00000100"; --3
WHEN 3=>INDEX0<="00000100"; --3
WHEN 4=>INDEX0<="00010000"; --5
WHEN 5=>INDEX0<="00010000"; --5
WHEN 6=>INDEX0<="00010000"; --5
WHEN 7=>INDEX0<="00100000"; --6
WHEN 8=>INDEX0<="10000000"; --8
WHEN 9=>INDEX0<="10000000"; --8
WHEN 10=>INDEX0<="10000000"; --8
WHEN 11=>INDEX0<="00000100"; --3
WHEN 12=>INDEX0<="00000010"; --2
WHEN 13=>INDEX0<="00000010"; --2
WHEN 14=>INDEX0<="00000001"; --1
WHEN 15=>INDEX0<="00000001"; --1
WHEN 16=>INDEX0<="00010000"; --5
WHEN 17=>INDEX0<="00010000"; --5
WHEN 18=>INDEX0<="00001000"; --4
WHEN 19=>INDEX0<="00001000"; --4
WHEN 20=>INDEX0<="00001000"; --4
WHEN 21=>INDEX0<="00000100"; --3
WHEN 22=>INDEX0<="00000010"; --2
WHEN 23=>INDEX0<="00000010"; --2
WHEN 24=>INDEX0<="00010000"; --5
WHEN 25=>INDEX0<="00010000"; --5
WHEN 26=>INDEX0<="00001000"; --4
WHEN 27=>INDEX0<="00001000"; --4
WHEN 28=>INDEX0<="00000100"; --3
WHEN 29=>INDEX0<="00000100"; --3
WHEN 30=>INDEX0<="00000010"; --2
WHEN 31=>INDEX0<="00000010"; --2
WHEN OTHERS =>NULL;
END CASE;
ELSE INDEX0<=INDEX2;
END IF;
END PROCESS;
END BEHAVIORAL;
(2) 音调发生模块
音调发生模块的作用是产生音阶的分频预置值。当8位发声控制输入信号中的某一位为高电平时,则对应某一音节的数值将输出,该数值即为该音阶的分频预置值,分频预置值控制数控分频模块进行分频,由此可得到每个音阶对应的频率。
VHDL源程序(TONE.VHD)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY TONE IS
PORT (INDEX: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
CODE: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
HIGH: OUT STD_LOGIC;
TONE0: OUT INTEGER RANGE 0 TO 2047);
END TONE;
ARCHITECTURE ART OF TONE IS
BEGIN
SEARCH : PROCESS(INDEX)
BEGIN
CASE INDEX IS
WHEN "00000001"=>TONE0 <=773;CODE<="1001111";HIGH<='1';
WHEN "00000010"=>TONE0 <=912;CODE<="0010010";HIGH<='1';
WHEN "00000100"=>TONE0 <=1036;CODE<="0000110";HIGH<='1';
WHEN "00001000"=>TONE0 <=1116;CODE<="1001100";HIGH<='1';
WHEN "00010000"=>TONE0 <=1197;CODE<="0100100";HIGH<='1';
WHEN "00100000"=>TONE0 <=1290;CODE<="0100000";HIGH<='0';
WHEN "01000000"=>TONE0 <=1372;CODE<="0001111";HIGH<='0';
WHEN "10000000"=>TONE0 <=1410;CODE<="0000000";HIGH<='0';
WHEN OTHERS =>TONE0<=2047;CODE<="0000001";HIGH<='0';
END CASE;
END PROCESS;
END ART;
(3) 数控分频模块
数控分频模块是对时基脉冲进行分频,得到与1、2、3、4、5、6、7七个音符相对应的频率。
VHDL源程序(FENPIN.VHD)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY FENPIN IS
PORT(CLK1: IN STD_LOGIC;
TONE1: IN INTEGER RANGE 0 TO 2047;
SPKS: OUT STD_LOGIC);
END ENTITY FENPIN;
ARCHITECTURE ART OF FENPIN IS
SIGNAL PRECLK:STD_LOGIC;
SIGNAL FULLSPKS:STD_LOGIC;
BEGIN
PROCESS(CLK1)
VARIABLE COUNT:INTEGER RANGE 0 TO 8;
BEGIN
IF (CLK1'EVENT AND CLK1='1')THEN
COUNT:=COUNT +1;
IF COUNT=2 THEN
PRECLK<='1';
ELSIF COUNT =4 THEN
PRECLK<='0';COUNT:=0;
END IF ;
END IF ;
END PROCESS;
PROCESS(PRECLK,TONE1)
VARIABLE COUNT11:INTEGER RANGE 0 TO 2047;
BEGIN
IF (PRECLK'EVENT AND PRECLK='1')THEN
IF COUNT11<TONE1 THEN
COUNT11:=COUNT11+1;FULLSPKS<='1';
ELSE
COUNT11:=0;FULLSPKS<='0';
END IF ;
END IF ;
END PROCESS;
PROCESS(FULLSPKS)
VARIABLE COUNT2 :STD_LOGIC:='0';
BEGIN
IF (FULLSPKS'EVENT AND FULLSPKS='1')THEN
COUNT2:=NOT COUNT2;
IF COUNT2='1'THEN
SPKS<='1';
ELSE
SPKS<='0';
END IF ;
END IF;
END PROCESS;
END ART;
(4) 顶层设计
VHDL源程序(DIANZIQIN.VHD)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY DIANZIQIN IS
PORT(CLK32MHZ: IN STD_LOGIC;
HANDTOAUTO:IN STD_LOGIC;
CODE1: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);--音符显示信号
INDEX1: IN STD_LOGIC_VECTOR(7 DOWNTO 0);--键盘输入信号
HIGH1: OUT STD_LOGIC;--高低音节信号
SPKOUT: OUT STD_LOGIC);--音频信号
END;
ARCHITECTURE ART OF DIANZIQIN IS
COMPONENT AUTO
PORT(CLK: IN STD_LOGIC;
AUTO: IN STD_LOGIC;
INDEX2: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
INDEX0: OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END COMPONENT;
COMPONENT TONE
PORT(INDEX: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
CODE: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
HIGH: OUT STD_LOGIC;
TONE0: OUT INTEGER RANGE 0 TO 2047);
END COMPONENT;
COMPONENT FENPIN
PORT(CLK1: IN STD_LOGIC;
TONE1:IN INTEGER RANGE 0 TO 2047;
SPKS: OUT STD_LOGIC);
END COMPONENT;
SIGNAL TONE2:INTEGER RANGE 0 TO 2047;
SIGNAL INDX:STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
U0:AUTOPORTMAP(CLK=>CLK32MHZ,INDEX2=>INDEX1,INDEX0=>INDX,AUTO=>HANDTOAUTO);
U1:TONEPORTMAP(INDEX=>INDX,TONE0=>TONE2,CODE=>CODE1,HIGH=>HIGH1);
U2:FENPIN PORT MAP(CLK1=>CLK32MHZ,TONE1=>TONE2,SPKS=>SPKOUT);
END ART;
4 波形仿真
(1)乐曲自动演奏模块的仿真(如图4-1所示)
图4-1乐曲自动演奏模块的仿真图
(2)音调发生模块的仿真(如图4-2)
图4-2 音调发生模块的仿真图
(3)数控分频模块的仿真(如图4-3)
图4-3数控分频模块仿真图
(4)简易电子琴整个系统的仿真(如图4-4)
图4-4简易电子琴整个系统的仿真图
5 结束语
经过努力,简易电子琴的设计基本上完成了。在整个设计过程中,包括前期中期和后期,我都有着许多不同的体会:
1) 这个设计的基本是接触一门新的语言并加以应用,对于我来说,没有想到的是入手的速度比我的预料快,在以前编程的基础上,从接触到开始动手编程的时间得到了很大的缩短。知识的接收速度在很大的程度上决定了动手的时间。
2) VHDL的编程与C语言的编程有着本质的不同,然而以往形成的旧编程习惯在VHDL编程中依然起着很大的作用。一通百通,不是没有道理的。对于学习新的知识并予以应用的信心,显得更足了。
3) VHDL的设计关键是电路逻辑设计,而一个程序的关键是总体设计。对于硬件设计接触不多的我们清楚这一点也许不无好处。
4)通过这个程序设计让我学会一种新的语言,对数字系统结构也有了更进一步的了解和认识,对我以后的学习有很大的帮助。希望其他人在看再做类似设计时有所借鉴。
通过几天的课程设计,我对数据库软件EDA技术、VHDL、等系列知识都有了一定的了解。使用EDA技术开发页面的能力也有了很大提高。
在整个设计过程中,有很多人对任务的完成给予了重要的支持和帮助。感谢老师给了我本次设计的机会并提供指导;感谢许多同学在我此课程设计遇到问题时给我的帮助使我能够顺利地进行设计的工作;论坛中有很多认识不认识的朋友也都为我的设计提出了很宝贵的建议,同样在这里感谢他们。
参考文献
《VHDL与数字电路设计》.卢毅,赖杰.科学出版社
《VHDL语言100例详解——北京理工大学ASIC研究所》.北京理工大学ASIC研究所.清华大学出版社
《VHDL程序设计》(第二版). 曾繁泰等.清华大学出版社
《VHDL入门与应用》陈雪松,滕立中.人民邮电出版社
《VHDL简明教程》.王小军.清华大学出版社