基于CVI可视界面的直流电机测控系统的设计_毕业论文.doc_第1页
基于CVI可视界面的直流电机测控系统的设计_毕业论文.doc_第2页
基于CVI可视界面的直流电机测控系统的设计_毕业论文.doc_第3页
基于CVI可视界面的直流电机测控系统的设计_毕业论文.doc_第4页
基于CVI可视界面的直流电机测控系统的设计_毕业论文.doc_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

毕毕 业业 设设 计(论计(论 文)文) 题题 目:目: 基于 cvi 可视界面的直流电机 测控系统的设计 学生姓名 杨晓敏 指导教师 赵国树 二级学院 机电工程学院 专 业 电气工程及其自动化 班 级 06 电气工程及其自动化 学 号 0605120108 提交日期 2010 年 5 月 12 日 答辩日期 2010 年 5 月 15 日 金陵科技学院学士学位论文 目录 i 目 录 摘要摘要iiiiii abstractabstractiviv 第一章第一章 设计的总体思想设计的总体思想5 5 第二章第二章 直流电动机直流电动机2 2 2.1 直流电机的概述 2 第三章第三章 labwindows/cvilabwindows/cvi 的简介的简介 5 5 3.1 虚拟仪器的简介5 3.2 虚拟仪器的结构5 3.3 labwindows/cvi 编程语言7 第四章第四章 硬件设计硬件设计8 8 4.1 硬件的简介 8 4.2 设计原理图各部分的说明 .11 4.2.1 直流电动机正转、反转以及停转11 4.2.2 直流电动机转速检测方法.11 4.2.3 直流电动机的控制方法13 4.3 rs-232 通信电路 .14 4.3.1 串行通信与并行通信14 4.3.2 异步串行通信的数据传送格式.15 4.3.3 rs-232 接口电路图及其功能说明 .16 第五章第五章 直流电动机的调速与检测的软件的设计直流电动机的调速与检测的软件的设计1919 5.1 直流电动机的 pwm 程序设计 .19 5.2 直流电动机的检测子程序 .21 5.3 串口通信的程序 .22 第六章第六章 上位机的软件设计上位机的软件设计2525 金陵科技学院学士学位论文 目录 ii 6.1 cvi 界面的设计 .25 6.2 串口参数选择 .25 6.4 电机的控制.29 6.5 调试好的 cvi 界面 31 结论结论3232 参考文献参考文献3333 致谢致谢3535 附录附录3636 附录一 直流电动机控制的总体原理图36 附录二 直流电动机控制的程序36 附录二:cvi 上位机的软件设计40 金陵科技学院学士学位论文 摘要 iii 基于 cvi 可视界面的直流电机测控系统的设计 摘要 直流电动机由于具有良好的起动、制动性能,适宜在大范围内平滑调速等特点, 在许多需要调速或快速正反向的电力拖动系统中得到了广泛的应用。本设计应 用单片机(at89s52)来实现直流电机的双向控制、转速的检测和显示、波形的 整形和利用 rs232 与计算机进行通信的过程,其中利用 labwindows/cvi 编写上 位机用户界面软件来实时的获取直流电机的转速。设计中用 protel99se 完成电 路原理图的绘制,实现了系统硬件模块的搭建,利用 proteus 对原理图进行仿 真,最后利用专业编程语言和 keilc 软件对设计的电路进行编程。 关键词:单片机 labwindows/cvi rs232 串口通信 protel99se keilc 金陵科技学院学士学位论文 abstract iv cvi-based visual interface of the dc motor control system abstract dc motor as a good start, braking performance, suitable for a large range of speed and so smooth in many needed fast forward and reverse speed or power drive system has been widely used. the design application mcu (at89s52) to achieve bi- directional dc motor control, speed detection and display, waveform shaping and the use rs232 to communicate with the computer process, including use of labwindows / cvi preparation of pc user interface software for real-time dc motor speed. design using protel99se complete circuit schematic drawing, hardware modules to achieve system structures, using proteus schematic diagram of the simulation, the final use of specialized programming languages and software design of the circuit keilc programming. keywords:scm labwindows/cvi rs232 serial communication protel99se keilc 金陵科技学院学士学位论文 第一章 设计的总体思想 1 第一章 设计的总体思想 本设计要完成的任务是利用单片机来控制直流电动机, 并设计其硬件电路, 包括直流电机双向控制电路,转速检测电路,波形整形电路、转速显示电路、 rs232 通信电路。其中单片机负责底层的对电机的 pwm 控制,分为正转和反转, 转速分为低速、中速、高速。单片机还负责获取光电传感器检测到的转盘转速 (即电机的转速),并用整形电路对波形整形。同时还利用单片机的串口与计算 机通信,在 labwindows/cvi 中编写上位机用户界面软件,向单片机发送改变转 速的命令,按照正转和反转及转速(低、中、高),来实时控制电机,并采集其 电机转速数据。采用巴特沃斯滤波器进行滤波,实时显示电机转速波形,并将 采集到的数据保存在.txt 文件中。设计结构图如图 1 所示: 图1 设计的结构图 pwm 输出 89s52 单片机 功率驱动器 整形电路 显示波形 直流电机 转速的控制 光电传感器 cvi 上位机 rs232 方向的控制 金陵科技学院学士学位论文 第二章 直流电动机 2 第二章 直流电动机 2.1 直流电机的概述 在现实生活中,直流电动机较为常见,因为大部分的电动玩具中使用的都 是直流电动机,这一类直流电动机体积小、功率低、转速高,在一些比较小的 场合十分适用,但它的特性与大型直流电动机十分相似。从控制的角度来看, 直流调速还是交流拖动系统的基础。早期直流电动机的控制均以模拟电路为基 础。由运算放大器、非线性集成电路以及少量的数字电路组成,控制系统的硬 件部分非常复杂, 功能单一,而且系统非常不灵活、调试困难,阻碍了直流电动机控制技术 的发展和应用范围的推广。随着单片机技术的日新月异。使许多控制功能及算 法可以采用软件技术来完成,不但为直流电动机的控制提供了更大的灵活性, 而且使系统能达到了更高的性能,从而大大节约了人力资源,降低了系统成本, 有效地提高了工作效率。 1、直流电动机的工作原理 直流电动机由转子部分和定子部分组成。 转子部分由电枢和换向器组成。电枢由漆包线缠绕在特殊形状的铁氧体上 构成,换向器是电枢绕组的线圈引出端,通常情况下,直流电动机 有3个绕组, 那么换向器就有3个,由于换向器的存在,使得电枢绕组内的电流在不同的磁极 下电流的方向不同,从而保证直流电动机的转子能够向一个方向旋转。 定子部分由励磁和电刷(碳刷)组成。在直流电机中励磁部分大都是由永 久磁铁构成,电刷一般由铜片构成,与换向器进行滑动接触,用于将外部加载 的直流电压传送到电枢绕组中。 (1)、直流电动机的电磁转矩 直流电动机的工作原理图如图2所示: 图2 直流电动机的原理图 金陵科技学院学士学位论文 第二章 直流电动机 3 f为导体受到的电磁力,该值大小为:f=bli,式中,b为导体所在处的磁通 密度;l为导体在磁场中的长度;i为导体中流过的电流。由于电磁力的存在,使 得沿着电枢的外圆切线方向产生电磁转矩。直流电动机产生的电磁转矩作为驱 动转矩使直流电动机旋转。 当直流电动机带着负载匀速旋转时,其输出转矩必定与负载转矩相等,但 直流电动机的输出转矩不是电磁转矩。因为直流电动机本身的机械摩擦(例如 轴承的摩擦、电刷和换向器的摩擦等)和电枢铁芯中的涡流、磁滞损耗都要引 起阻转矩,此转矩用t0表示。这样,直流电动机的输出转矩t2便等于电磁转矩t 减去直流电动机本身的阻转矩t0。所以,当直流电动机克服负载阻转矩tl匀速 旋转时,则有: t2=t-t0=tl 表明,当直流电动机稳态运行时,其输出转矩的大小由负载阻转矩决定。 实际上,直流电动机经常运行在转速变化的情况下,例如启动、停转或反 转等,以此必须考虑转速转速改变时的转矩平衡关系。 当直流电动机的转速改变时,由于电动机及负载具有转动惯量,将产生惯 性转矩tj,即: tj=jd/dt 式中,j为负载和电动机转动部分的转动惯量,即折算到电动机轴上的转动 惯量; 为电动机的角速度;d/dt为电动机的角加速度。这时电动机轴上的 转矩平衡方程式为: t2-tl=tj=jd/dt(1) 或: t2=tl+tj=tl+jd/dt(2) 式2表明当输出转矩t2大于负载转矩tl时,d/dt0,说明电动机在加速; 当输出转矩t2小于负载转矩tl时,d/dt #include #include “lcd1602.h“ #include “timer0.h“ #include “int0.h“ #include “uart.h“ #include “pwm.h“ #define uint unsigned int #define uchar unsigned char #define nop _nop_() uint pulsecounter=0; uchar timer0count=0; uchar timer2count=0; 金陵科技学院学士学位论文 附录 37 uchar speed=0; uchar wan,qian,bai,shi,ge; uchar pwm1_on=0,pwm2_on=0; uchar period=20; uchar forward_rotation_flag=0;/正向转动标志位 uchar reverse_rotation_flag=0;/反向转动标志位 void converter(void) /12345 wan = speed/10000; qian= speed/1000%10; bai = speed/100%10; shi = speed%100/10; ge = speed%10; /转换为显示字符 line00 = s; line01 = p; line02 = e; line03 = e; line04 = d; line05 = =; line06 = wan+0; line07 = qian+0; line08 = bai+0; line09 = shi+0; line010= ge+0; line011= r; line012= /; line013= s; void main(void) init_timer0(); /timer0 用来定时采样电机的速度 initial_uart(); /timer1 用做串口通信 波特率设置 9600,11.0592mhz init_timer2(); /timer2 产生 pwm init_int0(); /int0 用来计数电机转速测量脉冲数,下降沿触发 void init_timer0(void) tmod |= 0x01;/定时器设置 1ms in 12m crystal th0=0x4c; tl0=0x00;/定时 50ms ea=0; et0=1; tr0=0; 金陵科技学院学士学位论文 附录 38 void initial_uart(void) scon = 0x50; / scon: 模式 1, 8-bit uart, 使能接收 tmod |= 0x20; / tmod: timer 1, mode 2, 8-bit reload th1 = 0xfd; / th1: reload value for 9600 baud 11.0592mhz tr1 = 1; /tr1: timer 1 run ea = 1; /打开总中断 es = 1; /打开串口中断 bit pwm1 = p10; sbit pwm2 = p11 void init_int0(void) px0 = 1; /int0 中断高优先级 it0 = 1; /下降沿触发 ex0 = 0; /循环程序中再打开 ea = 0; void init_timer2(void) rcap2h = 0xfc;/12m 1ms 16bit 自动重载 rcap2l = 0x66; et2=1; ea=1; tr2=1; initlcd(); ex0=1; tr0=1; ea=1; pwm1=0; pwm2=0; while(1) showstring(0,line0); ; void int0_isr(void) interrupt 0 pulsecounter+; /因为电机转速慢,这里不考虑 pulsecounter 溢出问题 void timer0_isr(void) interrupt 1 金陵科技学院学士学位论文 附录 39 th0 = 0x4c; tl0 = 0x00; /50ms 定时,11.0592mhz timer0count+; if(timer0count = 5)/250ms speed = pulsecounter; /pulsecounter/4*4 timer0count=0; pulsecounter=0; void timer2_isr(void) interrupt 5 using 1 tf2=0; /t2 中断标志位清 0 if(forward_rotation_flag = 1) /正向转动 pwm2=0; timer2count+; /计数 if( timer2count = pwm1_on) pwm1 = 0; / if( timer2count = period) if(pwm1_on != 0) pwm1 = 1; /如果占空比 d=0 保持原来状态 timer2count=0; else if(reverse_rotation_flag = 1) /反向转动 pwm1=0; timer2count+; /计数 if ( timer2count = pwm2_on) pwm2 = 0; / if( timer2count = period) if(pwm2_on != 0) pwm2 = 1; /如果占空比 d=0 保持原来状态 timer2count=0; /发送没有必要用中断,因为程序的开销是一样的 /在接收时多选用中断方式,这样可以节约 cpu 的时间,提高效率 /发送过程:在发送时必须保证 ti=1:即发送缓冲器为空,否则将导致数据发不出去, /如果想强制发送可以用:ti=1.具体发送数据:利用 printf(“abcd”);函数直接发送即可。 void uart_isr (void) interrupt 4 using 3/串行中断服务程序 unsigned char uarttemp; /定义临时变量 if(ri) /一帧接收结束,硬件将 ri 置 1 金陵科技学院学士学位论文 附录 40 ri=0; /软件将标志位清零 uarttemp=sbuf; /读入缓冲区的值 switch(uarttemp) case 0xaa: ti=1; /收到要发送速度的指令,ti=1,准备发送速度. case 0xbb: /正转命令 forward_rotation_flag=1; reverse_rotation_flag=0; break; case 0xcc: /反转命令 forward_rotation_flag=0; reverse_rotation_flag=1; break; case 0xbd: pwm1_on=2, pwm2_on=0;break; /正向低速命令 case 0xbe: pwm1_on=5, pwm2_on=0;break; /正向中速命令 case 0xbf: pwm1_on=10,pwm2_on=0;break; /正向高速命令 case 0xcd: pwm1_on=0, pwm2_on=2; break; /反向低速命令 case 0xce: pwm1_on=0, pwm2_on=5; break; /反向中速命令 case 0xcf: pwm1_on=0, pwm2_on=15;break; /反向高速命令 case 0xee: /停止命令 forward_rotation_flag=0; reverse_rotation_flag=0; pwm1_on=0; pwm2_on=0; break; default: ; if(ti) /如果是发送标志位,清零 ti=0; if (uarttemp = 0xaa) /接收到指令 0xaa,则发送速度 sbuf=speed; /启动发送 uarttemp = 0; 附录二:cvi 上位机的软件设计 #include #include 金陵科技学院学士学位论文 附录 41 #include /* needed if linking in external compiler; harmless otherwise */ #include #include #include “sample5.h“ #define uchar unsigned char #define uint unsigned int static int panelhandle; uchar ledstatus=0; uchar array010000; uchar array110000; unsigned long timercounter=0; int status; unsigned char writebuf; uchar directionflag; /电机旋转方向标志位,1 正向,0 反向 uchar motorstartflag; /电机启动标志位,1 启动,0 停止 uchar motorslowflag,motormiddflag,motorhighflag; int comselect,baudselect,joselect,lengthselect,stopselect; /串口参数的选择 void selectuartpara(void); /uart 参数选择函数申明 int main (int argc, char *argv) if (initcvirte (0, argv, 0) = 0) /* needed if linking in external compiler; harmless otherwise */ return -1; /* out of memory */ if (panelhandle = loadpanel (0, “sample5.uir“, panel) 0) return -1; setctrlattribute (panelhandle, panel_timer, attr_enabled, 0); /一开始关闭定 时器 displaypanel (panelhandle); runuserinterface (); return 0; int send (unsigned char command) flushinq(comselect);/清空输入缓冲区 flushoutq(comselect); /清空输出缓冲区 status=comwrtbyte(comselect,command); /发送 if(status != 1) messagepopup(“error“,“send data failed!“); return 0; /1s 定时采样程序 int cvicallback timer(int panel, int control, int event,void *callbackdata, int eventdata1, int eventdata2) 金陵科技学院学士学位论文 附录 42 uchar readbuf; switch (event) case event_timer_tick: ledstatus =ledstatus; /led 指示灯切换状态,工作时表现为每 1s 闪 1 次 setctrlval (panelhandle, panel_led, ledstatus); /状态发给 led /读 1 通道 send(0xaa); /先发送识别符号,下面要采样 adc0832 的 0 通道,发完后,单 片机串口接收到 aa,就发送 0 通道的数据到串口缓冲区,等待被读取 readbuf=comrdbyte(comselect); /从串口读 1 个字节,即为 0 通道的数据 if(readbuf 0) /读成功,返回应为 ad 采样值,但是如果没有读成功,返回的 是负值,详见 comrdbyte 的说明 messagepopup(“error“,“read data failed!“); break; setctrlval(panel,panel_channel1,readbuf); /将接收数据写入 0 通道 的数据框 array1timercounter= readbuf; /采样值存数组 array0 /绘图,详见 ploty 函数 ploty(panelhandle,panel_graph,array1,timercounter+1,val_unsigned_char,v al_fat_line,val_empty_square,val_solid,1,val_green); /绘制通道 0 的数据 图形 timercounter+; /读的次数加 1 return 0; int cvicallback forwardrotation(int panel, int control, int event, void *callbackdata, int eventdata1, int eventdata2) switch (event) case event_commit: directionflag=1; send(0xbb); return 0; int cvicallback reverserotation(int panel, int control, int event, void *callbackdata, int eventdata1, int eventdata2) switch (event) 金陵科技学院学士学位论文 附录 43 case event_commit: directionflag=0; send(0xcc); return 0; int cvicallback motorstart(int panel, int control, int event, void *callbackdata, int eventdata1, int eventdata2) switch (event) case event_commit: if(directionflag=1) send(0xbd); /启动时,正向默认为正向低速模式 else send(0xcd);/启动时,反向默认为反向低速模式 return 0; int cvicallback motorstop(int panel, int control, int event, void *callbackdata, int eventdata1, int eventdata2) switch (event) case event_commit: send(0xee); return 0; int cvicallback motorslow(int panel, int control, int event, void *callbackdata, int eventdata1, int eventdata2) switch (event) case event_commit: motorslowflag=1; motormiddflag=0; motorhighflag=0; if(directionflag=1) send(0xbd); /正向低速模式 else send(0xcd); /反向低速模式 return 0; 金陵科技学院学士学位论文 附录 44 int cvicallback motormiddle(int panel, int control, int event, void *callbackdata, int eventdata1, int eventdata2) switch (event) case event_commit: motorslowflag=0; motormiddflag=1; motorhighflag=0; if(directionflag=1) send(0xbe); /正向中速模式 else send(0xce); /反向中速模式 return 0; int cvicallback motorhigh(int panel, int control, int event, void *callbackdata, int eventdata1, int eventdata2) switch (event) case event_commit: motorslowflag=0; motormiddflag=0; motorhighflag=1; if(directionflag=1) send(0xbf); /正向高速模式 else send(0xcf); /反向高速模式 return 0; /开始键回调函数 int cvicallback start(int panel, int control, int event, void *callbackdata, int eventdata1, int eventdata2) switch (event) case event_commit: selectuartpara();/设置串口,见 void selectuartpara(void)子程序 金陵科技学院学士学位论文 附录 45 status=opencomconfig(comselect,“,baudselect,joselect,lengthselect,stopselect,512,512); /根据设置值打开串口 if(status != 0) messagepopup(“error“,“config failed!“);/打开失败 return 0; setcomtime (2, 2.0); /设置通信超时时间 串口 2 通信时间限制 2.0s setxmode (2, 0); /串口 2 禁止软件握手 0 setctsmode(comselect,lwrs_hwhandshake_off); /禁止硬件握手 for(timercounter=0; timercounter10000; timercounter+)/每次开始时,所 有数据清零 array0timercounter=0; array1timercounter=0; timercounter=0;/计数器清零 deletegraphplot(panelhandle,panel_graph,-1,val_immediate_draw); /清除所有图形 setctrlattribute (panelhandle, panel_timer, attr_enabled, 1); /启动 定时器 setctrlval (panelhandle, panel_led, 1); /led 亮 return 0; int cvicallback stoptimer(int panel, int control, int event, void *callbackdata, int eventdata1, int eventdata2) switch (event) case event_commit: setctrlattribute (panelhandle, panel_timer, attr_enabled, 0); /关闭 定时器 setctrlval (panelhandle, panel_led, 0); /led 灭 return 0; int cvicallback quit (int panel, int control, int event, void *callbackdata, int eventdata1, int eventdata2) switch (event) case event_commit: 金陵科技学院学士学位论文 附录 46 quituserinterface (0); b

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论