023
单片微机测控系统样本
(样本只提供该系统的基本情况介绍,若需要完整的设计和论文,建议您购买本系统,凡是购买本站系统的,本站均根据您的要求,把系统上的开发信息,题目等修改成符合您的要求)
本系统开发工具:单片机/汇编
本设计包含内容:源代码+毕业论文+开题报告+答辩稿
论文大概:
目 录
前 言 1
1 系统分析 2
2
背景知识 3
2.1单片机 3
2.2 步进电机 4
2.3
电机驱动电路 5
2.4 单片机和上位机通信 8
2.5 原理图及印制板图设计 8
3
总体设计 10
3.1 总体结构 10
3.2 总体框图 10
3.3
单片机对电动机的控制框图 11
3.4 单片机基本输入输出功能 11
3.5
脉冲分配功能 11
3.6 功率放大功能 13
3.7
上、下位通讯功能 13
结 论 17
致
谢 18
参考文献 19
附 录1 20
附
录2 34
1
2 前
言
在电气时代的今天,电动机一直在现代化的生产和生活中起着十分重要的作用。无论是在工农业生产、交通运输、国防、航空航天、医疗卫生、商务与办公设备,还是在日常生活中的家用电器,都大量地使用着各种各样的电动机。根据资料统计,现在有90%以上的动力源来自于电动机,我国生产的电能大约有60%用于电动机。电动机与人们的生活息息相关,密不可分。众所周知,动力和运动是可以相互转换的,从这个意义上来讲,电动机也是最常用的运动源。对运动控制的最有效方式是对运动源的控制,因此,常常通过对电动机的控制来实现运动控制。实际上国外已将电动机的控制改名为运动控制。步进电动机是纯粹的数字控制电动机。它将电脉冲信号转变成角位移,即给一个脉冲信号,步进电动机就转动一个角度,并且具有无电火花现象,无自转现象,误差不累计,控制精度高等优点,目前得到了广泛的应用。本文主要以单片机AT89C51为核心,通过RS-232通信,来实现对永磁式步进电机进行运行控制。
3 1
系统分析
“单片微机测控系统”这一课题的提出,是计算机应用的最好体现。随着各种电力电子器件、功率器件和集成芯片的发展,智能化、微型化将成为今后电子工程领域的发展方向。单片机以其优越的性能在此方向也就独领风骚了。可以这么说:是单片机将电子产品向智能化和微型化方向不断发展,同时,电子产品不断智能化和微型化又对单片机提出了更高的要求。单片微机测控包含的方向很广。根据毕业设计任务书的要求,同时根据目前市场发展的方向以及应用前景,我选择了单片机对步进电动机的控制。为什么要选择单片机对步进电动机的控制呢?其中一个原因就是在实习期间我接触的就是单片机如何对步进电动机的控制。因此,我想把自己实习的内容加上大学中所掌握的理论知识结合起来,为以后工作打下一个比较好的基础。当然还有其它的原因,那就是步进电动机的优势以及单片机的可操作性、以及考虑到现有条件,详细的阐述在总体概述和背景知识两章中都有介绍。
4 2
背景知识
单片机测控技术,作为当今日益蒸蒸日上的一项技术,对开发者来说,比较渊博的知识也就是不可少的。因为它是一门可大可小的技术,对于一个开发者而言,只懂得硬件不了解软件或者说只编写软件而不深入硬件都不可能做好一个项目,因此要做好一个完整的项目,掌握各种与单片机开发相关的知识,尤其是与项目相关的知识就尤为重要了。对于本项目,掌握与后向通道相关的单片机控制技术相关知识就很有必要。步进电机作为执行结构,它的基本原理,结构以及驱动电路都是必须掌握的内容,同时由于本课题使用上、下位通讯,也就要求掌握单片机与PC机通讯的相关方法。一个项目的完成,原理图和印制板图的设计是最基本的。本章也就将以上提到的内容作了一定的介绍。这些知识是在完成项目过程中查阅相关书籍和资料获得的。
4.1 2.1单片机
MCS-51系列单片机是Intel公司在20世纪80年代初研制出来的,很快就在我国得到广泛的推广应用。近二十年来,MCS-51系列单片机无论在教学、工业控制、仪器仪表、信息通信,还是在交通、航运、家用电器领域,都取得了大量的应用成果。目前,Intel公司已经把精力集中在计算机的CPU生产上,而渐渐放弃了微控制器的生产,但是,以MCS-51技术核心为主导的微控制器技术已被ATMEL,PHILIPS等公司所继承,并且在原有基础上又进行了新的开发,从而产生了和MCS-51兼容而功能更加强劲的微控制器系列。ATMEL公司所生产的89系列单片机就是基于Intel公司的MCS-51系列而研制的并且与MCS-51兼容的微控制器系列。ATMEL公司是美国在20世纪80年代中期成立并发展起来的半导体公司。该公司的技术优势在于Flash存储器技术、高质高可靠性生产技术。20世纪90年代初,ATMEL公司成为全球最大的EEPROM供应商。本课题所使用的单片机AT89C51和AT89C2051就是ATMEL公司所研制的两款带内部Flash存储器的高性价比的单片机。目前AT89C51大概8元每片,AT89C2051大概5元每片。值得一提的是ATMEL公司已经停止生产了AT89C51,现在一般都使用它的替代品AT89S51,价格也只有7元每片,同时还增加了可下载功能。这就为我们进行产品调试和软件升级提供了方便。
同时值得一提的是:在进行系统分析时原打算使用Microchip公司研制的PIC系列单片机作为微控制器。但是由于相对而言PIC系列单片机价位较高,并且PIC系列单片机的一套完整的开发系统不易得到,受到这些条件的限制,故还是采用了我们所常用的MCS-51系列单片机。虽然如此,我还是想把两种单片机内部架构作一阐述,因为它是我在进行项目总体分析是所获得的。
对于MCS-51系列单片机,其程序存储器和数据存储器位于不同的逻辑空间里(这种架构的微控制器、微处理器、数字信号处理器或者微型计算机系统,称为哈佛体系结构),虽然如此,它们与CPU之间传递信息必须共用同一条总线,而仍然摆脱不了瓶颈效应的制约,于是影响到CPU运行速度的进一步提高,这在采用单片机C语言编程,在实时要求较高的场所,根本行不通,因此限制了使用范围。但是PIC系列单片机解决了这一问题,它不仅采用了哈佛体系结构,而且还采用了哈佛总线结构。在PIC系列单片机中采用的这种哈佛总线结构,就是在芯片内部将数据总线和指令总线分离,并且采用不同的宽度。这样做的好处是,便于实现指令提取的“流水作业”,也就是在执行一条指令的同时对下一条指令进行取指操作;便于实现全部指令的单字节化、单周期化,从而有利于提高CPU执行指令的速度。在一般MCS-51系列单片机中,指令总线和数据总线是共用的(即时分复用)。因此在速度要求高的场所,采用PIC系列单片机是明智的选择。本课题对单片机并没有其它特殊的要求,在运行速度方面,一般单片机即可达到要求,因此采用了AT89C51和AT89C2051两款单片机。
4.2 2.2
步进电机
作为一种执行机构,步进电动机还工农业生产领域一直占据着重要的地位。在过去,人们一直认为伺服系统一定由于步进系统,但现代的步进系统已完全不是过去的步进系统了。定位驱动装置已经由步进系统-直流伺服-交流伺服再度回到了步进系统了。因此,有专家预测,步进系统将成为21世纪的主要执行系统。因此掌握作为步进系统采用的步进电机相关知识也就必不可少了。
步进电机是纯粹的数字控制电动机。它将电脉冲信号转变成角位移,即给一个脉冲信号,步进电动机就转动一个角度,因此非常适合于单片机控制。近30年来,数字技术、计算机技术和永磁材料的迅速发展,推动了步进电动机的发展,为步进电动机的应用开辟了广阔的前景。
步进电动机有如下特点:
⑴
步进电动机的角位移与输入脉冲严格成正比,因此,当它转一转后,没有累计误差,具有良好的跟随性。
⑵
由步进电动机与驱动电路组成的开环数控系统,既非常简单、廉价,又非常可靠。同时,它也可以与角度反馈环节组成高性能的闭环数控系统。
⑶
步进电动机的动态响应快,易于起停、正反转及变速。
⑷
速度可在相当宽的范围内平滑调节,低速下仍能保证获得大转矩,因此,一般可以不用减速器而直接驱动负载。
⑸ 进电动机只能通过脉冲电源供电才能运行,它不能直接使用交流电源和直流电源。
⑹ 进电动机存在振荡和失步现象,必须对控制系统和机械负载采取相应的措施。
⑺
步进电动机自身的噪声和振动较大,带惯性负载能力较差。
对于本课题,采用的是开环结构。主要实现的是起停、正反转控制。由于运行频率较低,不存在变速,因此振荡和失步现象出现几率较小。
下面来简单阐述一下步进电动机的分类及本课题的选型。
步进电动机可以分为3大类:
⑴ 应式步进电动机
反应式步进电动机的转子是由软磁材料制成的,转子之中没有绕组。它的结构简单,成本低,步距角可以做得很小,但动态性能较差。比如常说的130BF系列和110BF系列等。
⑵ 磁式步进电动机
永磁式步进电动机的转子是用永磁材料制成的,转子本身就是一个磁源。它的输出转矩大,动态性能好。转子的极数和与定子的极数相同,所以步距角一般较大。因此对于永磁式步进电动机后面一般都装有减速箱,以减小步距角,增大转矩。
⑶ 合式步进电动机
混合式步进电动机综合了反应式和永磁式两者的优点,它的输出转矩大,动态性能好,步距角小,但结构复杂,成本较高。
由于反应式步进电动机的性能价格比比较高,因此这种步进电动机的应用十分广泛。但由于机身尺寸比较大,价格多在百元以上,因此对于本课题并不适合。因为对毕业课题,我要考虑价格问题,也就是说,花最少的钱,做最好的系统。基于这种考虑,本课题采用的永磁式步进电动机,价格大概在十元左右。它的控制驱动电路相对而言,也比较简单。
步进电动机作为一种微型控制电动机,目前在全国范围内,能够制造出性价比高的专业厂家并不多。常州,作为步进电动机的发展地点,目前仍然是全国最大的步进电动机生产地。此外,在陕西、浙江也有专业厂家能够生产出比较好的步进电动机。在生产厂家方面,常州的微特电机(原宝马电机)、雷利电机和东南电机,西安的微电机研究所,浙江的卧龙集团都是很有实力的步进电机生产厂家。
4.3 2.3
电机驱动电路
步进电动机作为一种执行机构,有其特殊的优点,也就是说步进电动机的控制比较方便,因为它采用的是脉冲电源。步进电动机一般有单拍和双拍两种工作方式。同时有整步和半步两种说法。例如:对如三相反应式步进电动机有单三拍、双三拍和六拍三种工作方式。假如三相绕组分别是A,B,C,那么对如单三拍,通电顺序为:A-B-C-A;对如双三拍,通电顺序是:AB-BC-CA-AB;而对如六拍方式,通电顺序为:A-AB-B-BC-C-CA-A。下表是三种工作方式的区别:
工作方式 单三拍 双三拍 六
拍
步 进 周
期 T T T
每相通电时间 T 2T 3T
进
齿 周 期 3T 3T 6T
相
电 流 小 较大 最大
高 频
性
能 差 一般 好
转
矩 差 一般 优
电 磁 阻
尼 差 较好 较好
振
荡 多 少 极少
功
耗 小 大 中
表2-1
步进电动机工作方式图
表中所列的项目都是指在工作频率为f时的三种工作方式的比较。对应于频率f,有步进周期为T=1/f。进齿周期是指步进电机转动一个齿距所用的时间。在表中可以清楚看出,从综合指标来看,单三拍工作方式性能较差,而六拍工作最好,双三拍工作方式的性能则是介于上述两者之间。值得指出的是:六拍工作方式时,步进电机旋转时有较好的平滑性。一方面是因为它的电磁阻尼作用,另一方面是因为它步距比单三拍及双三拍都要小,转子中产生的过冲摆动明显减小。同时在六拍工作方式中,由于绕组中的电流较大,故能产生较大的旋转力矩。这一点在上表中的频率特性中也可以看出。本课题采用的是半步工作方式
。
对于每一台步进电动机而言,单独供给脉冲电源是不可能工作的,它必须要相应的驱动功放电路。也就是说步进电动机和驱动电路是缺一不可的,两者是密不可分的。步进电动机的驱动功放电路有很多方式。下面简要阐述以下常用的功率放大电路。
⑴
单电压功率放大电路
单电压功率放大电路是步进电动机中最简单的一种驱动电路。在本质上它是一个简单的反向器。电路的工作电压一般选择在10-100伏左右;也有高达200伏的。这要视应用的场合、步进电动机的功率和实际要求而定。
单电压功率放大电路的最大特点是结构简单,但它的缺点是工作效率低,在高频工作状态时其效率尤其差。所以单电压功率放大电路一般只用于小功率步进电动机的驱动。
⑵
双电压功率放大电路
双电压功率放大电路就是采用两种电源电压的功放电路。由于这两种电源电压分别是高压和低压电源,故也称高低压功率放大电路。双电压功率电路的工作状态基本上可分为高压工作状态、低压工作状态和关断状态三种不同的工作状态。
双电压功放电路明显特点是功耗较低,高频工作时有较大的转动力矩。所以较多用于中等功率和大功率步进电动机中。
⑶
斩波型功率放大电路
双电压功率放大电路的缺点是在高低压连接处电流出现谷点,这样必然引起力矩在谷点时下降。而斩波型功率放大电路可以克服这种缺点,并且提高步进电动机的效率和力矩。斩波型功率放大电路有两种:一种是斩波恒流功放电路;另一种是斩波平滑功放电路。较广泛应用的是斩波恒流功放电路。
斩波恒流功放电路是利用斩波方法使电路恒定在额定值附近,这种电路也称定电流驱动电路,或者波顶补偿电路。从提高工作频率和电源效率的角度上看,这是一种较好的功放电路。它可以用较高的电源电压,同时无需外接电阻来限定额定电流和减少时间常数。但是由于电流波形顶部呈锯齿波波动,所以会产生较大的电磁噪声。
斩波恒流功放电路采用电流反馈来限定步进电动机的绕组电流。而斩波平滑功放电路没有电流采样和反馈,而且结构又像基本功放电路那样简单,故它是和斩波恒流功放电路的原理完全不能的一种电路。采用斩波平滑功放电路,比采用普通单电压功放电路的工作频率可提高百分之十左右;力矩也可以提高百分之十到百分之二十五左右。特别可观的是效率的提高尤其显著,在输出功率相同的情况下,斩波平滑功放电路只需要普通单电压功放电路大约一半的输入功率。
⑷
调频调压功率放大电路
无论是单电压功放电路,双电压功放电路和斩波型功放电路,它们都是考虑注入电机绕组的电流要有较好的上升沿和幅值,以提高电机的高频工作能力。但是这样也引起一个问题,即在高频时有足够的转动力矩,而在低频时则会因注入电流过多而引起振荡。为此产生了调频调压的控制方法,它另电机在低频时工作在低压状态,减少能量的注入,从而抑制振荡;在高频时工作在高压状态,使电机有足够的驱动能力。
调频调压的控制方式很多,简单的方法是分频段调压。一般把步进电动机的工作频率分成几段,每段的工作电压不同。高频时采用一个固定的高压,低频时采用一个固定的低压。一般较为优良的方法是同时使用调频调压的方法。
⑸
细分控制功率放大电路
步进电动机是靠脉冲电压供电的,对应于一个电压脉冲,转子转动一步,也即旋转一个步距角。
在一般情况下,根据电压脉冲的分配方式,步进电动机各相绕组的电流轮流切换,从而使电机的转子步进转动。
如果每次输入脉冲切换时,只改变对应绕组中额定电流的一部分;那么转子相应的每步转动也只会是原有步距角的一部分。额定电流分成多少个级别进行切换,转子就以多少步来转完一个原有的步距角。很明显,通过控制绕组中电流的数值则可以调整步进电动机步距的大小,也就是把步距角细分成若干步来完成,这种步进电动机的控制方式称为细分控制。
步进电机绕组中电流进行细分,在本质上是把对绕组的矩形电流波供电改为阶梯形电流波供电。这样就要求绕组中的电流以若干个等幅等宽的阶梯上升到额定值,或以同样的阶梯从额定值下降到零。
要获得阶梯波,通常采用两种方法:
①
采用多路功率开关电路供电,在绕组上进行电流迭加;这种方法使功率管上的损耗小,但由于路数较多,故用元件多、体积大。
②
先对脉冲信号进行迭加,再经功率管进行线性放大,获得阶梯形电流,这种方法的优点是所用元件少,但功率管功耗大,系统效率低,如果管子工作在非线性区时会引起失真。
以上是在实习过程中所接受到的以及在完成课题过程中查阅相关书籍及一些笔记,考虑到本课题的要求以及廉价的原则,本课题采用的是单电压驱动的改进型。
对于单片机和步进电动机的硬接口,是相当方便的,利用一个直接相连或者通过光耦间接相连即可。而对于软接口,则有两种方法:一是单片机仅作为一个脉冲提供的身份,至于脉冲的分配则由后面的电路或者集成电路来完成;二是单片机完全作为脉冲分配和控制的身份,这样可以直接连接功放电路了。本课题则是采用第一种实现方法。
4.4 2.4
单片机和上位机通信
CPU通过接口对外设进行控制的方式通常有以下三种方式:
⑴ 程序查询方式
⑵
中断处理方式
⑶ DMA(直接存储器存取)传送方式
本课题上位采用Visual
C++予以实现,采用事件驱动的中断处理方式。
考虑到具体条件,本课题采用的是RS-232串口标准进行上、下位的通信。RS-232串口标准在通信速率低于20kbit/s时,RS-232直接连接的最大物理距离是15m。
最大直接传输距离:即在不使用Modem,在码元畸变小于4%的情况下给出的。
对于DB-9,本课题只使用到了其中的三根连接线:2脚数据接收线(RXD),3脚数据发送线(TXD),和5脚信号地线(GND)。
S-232标准是美国EIA(电子工业联合会)与BELL等公司一起开发并于1969年公布的通信协议。它适合数据传送速率在0-20000bit/s范围内的通信。采用的是利用串行口三线无调制的方式。串口传输数据只要有接收数据针脚和发送数据针脚就能实现。对于DB9而言,2,3,5脚通过电平转换就可以直接和单片机的串行口直接进行相连。使用起来相当方便。
串行通信有很多方法,以下将阐述相关方法。
⑴
利用MSComm控件实现:它是目前使用较多,较容易上手的一种方法;
⑵ 利用Windows
API实现:此种方法需要了解Windows底层编程技术;
⑶
利用专用第三方提供的类实现:此种方法则是比较烦琐的方法,它要求对硬件电路了解较多;
⑷
利用专门的通信函数来实现:此方法有最大的不足就是一般是在Dos环境中利用Dos中断实现的,因此没有漂亮的界面支持,同时对通信函数也要求较高;
本课题上位机采用的是在Visual
C++环境利用MSComm控件进行数据通信。
4.5 2.5 原理图及印制板图设计
对于一个系统,一个项目的开发,软件和硬件是密不可分的。因此对于设计印制板就必不可少了。一块完整的板子制作出来有很多方法。在大学教学中,一般采用的都是由原理图到网络表,再到印制板图,自动布线。其实在真正设计过程中,由于考虑诸多因素的影响,通常并不采用自动布线,而还是采用手动布线。自动布线速度快,只要原理图正确,出错几率很小,而手动布线速度较慢,出错几率较大。那为什么现在大多数工程师还是采用手动布线呢?第一、手动布线能够很清晰的了解线路的走向,因为单片机的开发,对于动手能力要求是比较高的,因此这一点有利于以后的板子调试等。第二、对于一些抗干扰比较在意的场所,自动布线是不可能的。在本课题开发过程中,我的目的就是了解单片机开发所必须的每个步骤,因此我选择的是手动布线。当然手动布线不代表不使用自动布线,也就相当于我在编程序时采用的是单片机C语言一样,同时汇编语言同样重要。对于这两者我是这样理解的:对于布线,开始要学会手动布线,学好手动布线,而后可以考虑自动布线;而对于程序编制,我认为能够使用单片机C语言的地方尽量采用,因为它能够节约很多时间,但是编写程序最好还是从利用汇编语言开始。也就是说从汇编语言转为单片机C语言是明智的。
5 3 总体设计
5.1 3.1
总体结构
本课题的上位软件以及AT89C51控制软件两部分已经支持对九个电机进行控制,只要配备九块功放板就可以控制九个步进电动机。本课题只配备了一块功放板,因此只能控制一台步进电动机。
本课题主要包括三个方面:上、下位通信(主要是上位软件)部分;AT89C51控制部分;AT89C2051分配功能以及功放部分。下面就这三个方面分别予以阐述:
上位部分:主要通过Visual
C++集成开发环境,使用MSComm控件来完成;由于数据传输比较简单,因此没有增加校验位,传输比特率为2400,通过串行口一,采用三线无调制方式来连接。上位部分一方面和下位进行通信,另一方面实时对运行距离进行显示,显示采用模拟数码管显示的形式,步进电动机的控制精度为0.01mm,也就是说每走一步显示变化0.01mm。
AT89C51控制部分:这部分主要完成和上位通信以及控制下位的功能。和上位通信采用传输字符的方法。对下位的控制主要是产生一定频率的脉冲,脉冲频率则根据步进电动机运行所需要的频率而定,值得一提的是对于高频步进电动机的启动频率不宜过高,而应该通过升降频的方法来控制,否则易产生振荡甚至不能运行的结果。因为此课题使用的是低频电机,因此也就不存在升降频的问题,电机从开始启动就以正常频率运行。
AT89C2051分配功能以及功放部分:分配功能主要是根据AT89C51送过来的脉冲,从而产生适合步进电动机运行所要求的分配脉冲。功放部分主要对信号进行功率放大,从而能达到使步进电动机正常运行的目的。
5.2 3.2
总体框图
上位微机
RS-232
下位控制用单片机
AT89C51
脉冲分配用单片机
AT89C2051
驱动功率放大电路
永磁步进电动机
28BYJ(带减速比85.25)或35BYJ
图3-1 总体流程图
5.3 3.3
单片机对电动机的控制框图
以下是步进电机驱动器简图:
B
A
C
D
D
图3-2
步进电机驱动器图
以下是单片机与步进电机接口简图:
图3-3
单片机与步进电机接口图
图中:单片机AT89C2051主要是充当步进电动机分配器的角色,同时还控制正、反转等。反向器主要是提高驱动电流的,因为功率管需要比较大的电流来驱动,单纯通过单片机来实现并不现实,一般也不大可能实现。功率管常用IRF450和IRF9540组成复合驱动方式,功率管工作在开关状态。M代表电机。对于感性负载,二极管充当泄放的作用。电源U是电动机的驱动电源,其值视电动机不同而不同。
5.4 3.4
单片机基本输入输出功能
对于89C51而言,单片机的基本输入/输出功能主要通过四个口(P0,P1,P2,P3)完成,而对于89C2051而言,主要通过P1,P3两个口完成的。同时P3口是具有第二功能的。对于单片机的口功能比较简单,唯一有一个重点就是当P1口的引出线用做输入时,应该首先对对应锁存器写“1“。在这一点一般可以通过在初始化是将0xff写入P1口,同时可以将P1口上拉。在本课题中使用了P3口的第二功能,在上、下位机通信时,使用到RXD和TXD来完成。同时,在分配器模块,还使用到了外部中断口。
5.5 3.5
脉冲分配功能
与其它电动机不同,单纯给步进电动机通给交流电源或者直流电源,它是不能工作的。步进电动机的工作电源是脉冲电源,这也就是为什么功率管工作在开关状态的原因。由此可见,单片机对步进电动机的控制也就比较方便了。此节,主要是阐述单片机作为脉冲分配器的使用。要使步进电动机工作,就要给它供给脉冲电源。脉冲分配也就是产生脉冲电源。脉冲分配具有很多实现方式,例如通过硬件可以实现。本课题则是通过单片机来实现的。
例如:对于四个绕组A,B,C,D,在半步工作时,有分配字:
A-AB-B-BC-C-CD-D-DA-A……。如此循环。
假设以上是正转方式,那么反转的分配字则是:
A-DA-D-CD-C-BC-B-AB-A……。如此循环。
假设单片机的P1口用于输出脉冲字,并且有:
P1.7连接A,P1.6连接B,P1.5连接C,P1.4连接D,P1.3,P1.2,P1.1和P1.0未用,则有:
正转:
第一步:P1=0x7f;第二步:P1=0x3f;第三步:P1=0xbf;第四步:P1=0x9f;
第五步:P1=0xdf;第六步:P1=0xcf;第七步:P1=0xef;第八步:P1=0x6f;
然后又到第一步,第二步……如此循环。
反转:
第一步:P1=0x7f;第二步:P1=0x6f;第三步:P1=0xef;第四步:P1=0xcf;
第五步:P1=0xdf;第六步:P1=0x9f;第七步:P1=0xbf;第八步:P1=0x3f;
然后又到第一步,第二步……如此循环。
值得注意的是由于接了反向器,此处是低电平有效。同时,为了使开机时即锁相,在初始化时应该将八步中任一步形式进行初始化。这一点相当重要。尤其在需要在开机时需要提供扭矩的场合。
系统在实际的工作过程中,很可能一工作就是连续几十小时,为了使电机不至于长时间受大电流发热而损坏,因此应该在电动机并不转动时,应该使电动机工作在半流状态。半流并不是说电流是正常工作的一半,工作电流可以是正常工作的一半,同时也可以是其它数值。本电机正常工作电流是0.5A。半流工作电流可以在一个绕组中通过串联一个电流表来测试。本系统半流功能主要通过硬件完成。在软件方面提供支持。半流是低电平有效。一般情况下,电机在不转动达到一秒时间,则可以开启半流功能。假设P1.3是半流允许端,低电平有效。那么在正常工作时(即电机在转动时):八步脉冲字为:
正转:
第一步:P1=0x7f;第二步:P1=0x3f;第三步:P1=0xbf;第四步:P1=0x9f;
第五步:P1=0xdf;第六步:P1=0xcf;第七步:P1=0xef;第八步:P1=0x6f;
然后又到第一步,第二步……如此循环。
反转:
第一步:P1=0x7f;第二步:P1=0x6f;第三步:P1=0xef;第四步:P1=0xcf;
第五步:P1=0xdf;第六步:P1=0x9f;第七步:P1=0xbf;第八步:P1=0x3f;
然后又到第一步,第二步……如此循环。
由于在正常工作时,不允许半流,因此应该将P1.3置位1。
需要半流时,只要:
P1.3=0;
对于步进电动机的工作频率,是通过控制脉冲频率来实现的。也就是说,第一步与第二步的时间间隔将决定步进电动机的工作频率。具体到软件方面,一般可以通过两种方法来实现:其一是:通过软件延时,这种方法有两个缺点,精度以及占用处理器的时间,精度一般可以通过调试来提高,而占用处理器的时间则会对程序有较大影响,尤其在处理器比较繁忙的时候;因此,如果考虑到单片机的定时器,则有第二种办法,这也是目前使用比较多的方法,那就是通过定时器来实现,对定时器既可以采用查询也可以通过定时中断来实现。在本课题中,既使用了延时方法,又采用了定时器查询办法。
5.6 3.6
功率放大功能
由单片机I/O口提供的电流一般只有十几毫安,这对于需要较大工作电流的步进电动机而言,是远远不够的,因此功率放大(通常称为功放),也就必不可少了。功放电路有很多种,在实际应用中,反应式步进电动机一般采用斩波恒流的方式来实现,电流一般较大,通常是以6A、8A和10A居多;由于混合式步进电动机精密度较高,通常使用在一些要求比较高的场合,因此,混合式步进电动机的驱动电路一般都是采用专门的集成电路来完成的,电路中一般集成有细分电路,控制电路,此外还有保护电路等。同时还可以采用厚膜电路来完成。而对于永磁式步进电动机,由于功率较小,一般采用单电压驱动、双电压驱动等方式。电流一般在0.5A左右。这其中,又以单电压的改进型应用最多。本课题采用的就是单电压的改进形式。具体电路在原理图中有体现。
5.7 3.7
上、下位通讯功能
在单片机应用系统中,经常需要通过RS-232串行口与微机进行通信。目前在各种操作系统中,Microsoft的Windows较为常见,而且大多为Windows95/98等32位平台。以往在Windows平台上的串行通信多使用其提供的API函数来实现,这种方法使用起来需要许多底层设置,因而较为繁琐,并且难以理解。Microsoft推出的ActiveX技术提供了另外一种实现串行通信的方法。这种方法不仅相对较为简单,而且非常实用。尤其是Visual
C++这种可视化面向对象的编程环境中,可以真正把串口看作一个对象,编程时只需简单的设置,理解起来也很容易。下面阐述本课题使用的串行通信ActiveX控件的使用方法。该控件的相应文件是MSCOMM32.OCX,以下简称为MSCOMM控件。
(1)
MSCOMM控件:即Microsoft Communication
Control,是Microsoft为简化Windows下串行通信编程而提供的ActiveX控件。它提供了一系列标准通信命令的使用接口,利用它可以建立与串口的连接,并可以通过串口连接到其他通信设备(如调制解调器),发出命令,交换数据以及监视和响应串行连接中发生的事件和错误。MSCOMM控件可用于创建电话拨号程序、串口通信程序和功能完备的终端程序。
MSCOMM控件提供了两种处理通信的方式:①
事件驱动方式。当通信事件发生时,MSCOMM控件会触发OnComm事件,调用者可以捕获该事件,通过检查其CommEvent属性便可确认发生的是哪种事件或错误,从而进行相应的处理。这种方法的优点是响应及时、可靠性高。②
查询方式。在程序的每个关键功能之后,可以通过检查CommEvent属性的值来查询事件和错误。如果应用程序较小,这种方法可能更可取。例如,如果写一个简单的电话拨号程序,则没有必要每接收1个字符都产生事件,因为惟一等待接收的字符是调制解调器的"确定"响应。
在使用MSCOMM控件时,1个MSCOMM控件只能同时对应1个串口。如果应用程序需要访问和控件多个串口,那么必须使用多个MSCOMM控件。
在VC++中,MSCOMM控件只对应着1个C++类--CMSComm。由于MSCOMM控件本身没有提供方法,所以CMSComm类除了Create()成员函数外,其他的函数都是Get/Set函数对,用来获取或设置控件的属性。MSCOMM控件也只有1个OnComm事件,用来向调用者通知有通信事件发生。
MSCOMM控件有许多很重要的属性,限于篇幅只给出几个较为重要和常用的属性,如表所列:
属
性 说
明
CommPort 通信端口号
Settings 以字符串形式表示的波特率、奇偶校验、数据位
PortOpen 通信端口的状态,打开或是关闭
Input 接收数据
Output 发送数据
InputMode 接收数据的类型:0为文本;1为二进制
表3-1
MSCOMM控件的属性表
(2)
编程实现:从表1可以看到,MSCOMM可以两种不同的形式接收数据,即以文本形式和以二进制形式。用MSCOMM控件进行字符数据传输的文献和资料可以找到很多,在Microsoft的MSDN(Microsoft
Developer
Network)中就可以找到这样的例子,即VCTERM。可是几乎所有以单片机为核心的测量系统所得到的原始数据都是二进制形式的,所以,以二进制形式传输数据将是最为直接而又简洁的办法。不仅如此,由于MSCOMM控件在文本形式下,其传输的是宽字符格式的字符,要想得到有用信息,还要额外处理。因此本文主要讨论在二进制形式下的使用方法。在VC++6.0中,用APPWizard可以生成三种应用程序:单文档(SDI)、多文档(MDI)和基于对话框的应用程序。为了说明问题和省去不必要的细节,下面以基于对话框的应用程序为例:
①
创建一个基于对话框的应用程序:打开VC++6.0集成开发环境,选择菜单项File/New,在出现的对话框中选中Projects标签中的MFC
AppWizard(exe),然后在Project
Name框中填入MyCOMM(可根据需要命名),之后点OK按钮。在接着出现的对话框中选中Dialog
Based项,然后点NEXT按钮。以下的各对话框都按照缺省设置,这样即可生成一个基于对话框的应用程序。在资源编程器中会出现其对话框模板。
②
插入MSCOMM控件:选择菜单项Project/Add to project/Components and
Controls…,在弹出的对话框中选择Registered ActiveX Controls文件夹下的Microsoft
Communications
Control,version6.0,然后按下Insert按钮,接着会弹出一个对话框,提示生成的类名及文件名,按OK按钮即可实现控件的插入。这时在对话框的控件工具栏
上会多出一个电话机模样的控件图标,Workspace的Classview中也多了一个类CMSComm。此时即可将MSCOMM控件加入到对话框模板,加入方法与其他控件一样。然后还要在对话框类中相应加入一个成员变量,此处我们将其命名为m_comm。加入方法为:首先,在对话框模板中,用鼠标右键点击该控件,选择ClassWizard,在出现的对话框的Member
Variables标签的Control Ids项下,选中IDC_MSCOMM1。然后,按Add
Variable…按钮,在出现的对话框的Member Variable Name项中输入m_comm。最后,按OK按钮即可。
③
设置属性可以在两个地方对控件的属性进行设置:
a.对话框资源编辑器中。在对话框模板上,用右键单击MSCOMM控件,然后选择Properties…菜单项,最后便可设置各项属性。此处只对以下几处进行改动,其他接受缺省设置:Rthershold:1,InputLen:1,DTREnable:不选,InputMode:1-Binary.
b.对话框类的OnInitDialog()函数中。下面是以上设置的函数实现:
BOOL
CMyCOMMDlg::OnlnitDialog()
{CDialog::OnlnitDialog();
m_comm.SetCommPort(1);//使用串口1
m_comm.SetSettings("9600,N,8,1");//波特率为9600,无奇偶校验,8位数据位,1位停止位m_comm.SetRThreshold(10);
//每接收10个字符就触发1次接收事件
m_comm.SetSThreshold(0);
//不触发发送事件
m_comm.SetInputLen(10);
//每次读操作从缓冲区中取10个字符
m_comm.SetInputMode(1);
//二进制数据传输形式
m_comm.SetPortOpen(TRUE); //打开串口
return
TRUE;
}
④ 发送二进制数据如果需要发送二进制数据,可将数据作如下处理。具体代码如下:
CByteArray
bytOutArr;
bytOutArr.Add(0x0);
//给数组赋值bytOutArr.Add(0x1);
bytOutArr.Add(0x2);
bytOutArr.Add(0x3);
bytOutArr.Add(0x4);
COleVariant
varOut;varOut=COleVariant(bytOutArr); //将数据转换为变体数据类型m_comm.SetOutput
(varOut);
⑤
接收二进制数据当需要接收大量的数据时,最好采用事件驱动方式进行编程。具体步骤如下:
a.响应OnComm事件。在对话框资源编程器中,双击对话框模板上的MSCOMM控件,在弹出的对话框中填入您所希望的事件响应函数名,此处将其命名为OnCommMscomm1()。
b.在事件响应函数中接收和处理数据。接收来的数据为变体数据,所以需要做一些处理,具体代码如下:
void
CMyCOMMDlg::OnCommMscomm1()
{ COleVariant
varRcv;
CByteArray byt;int i;
long num;
switch
(m_comm.GetCommEvent())
{cass 1://数据发送事件
break;
case
2://数据接收事件
varRcv=m_comm.GetInput();
varRcv.ChangeType
(VT_ARRAY |VT_UI1);
BYTE HUGEP *pbstr;
HRESULT
hr;
hr=SafeArrayAccessData (varRcv.parray,(void
HUGEP*FAR*)&pbstr);//获取安全数组指针if (FAILED
(hr)){AfxMessageBox("获取数组指针失败!");break;}num=0;hr=SafeArrayGetUBound
(varRcv.parray,1,&num);//获取数组上界if (FAILED
(hr)){AfxMessageBox("获取数组上界失败!");break;}for(i=0;i<NUM;I++)<
P> byt.Add(pbstr [i]);SafeArrayUnaccessData
(varRcv.parray);//此时数据已保存在二进制数组byt中,可根据需要进行相关处理break;default:break;}}以上代码中的处理部分可以做成一个单独的函数,在此处调用即可。经过以上代码的处理,接收来的数据已存放在二进制数组byt中,可以根据自己的需要对其进行相关处理,如保存和显示等。三:硬件实现:单片机与微机之间的硬件接口可以用1片MAX232或ICL232与几个电容即可实现,在原理图中有详细说明,此处不再多述。
图1: 驱动板原理图:
图2:控制板原理图: