基于单片机的测量轴转速扭矩系统的软件实现毕业设计_第1页
基于单片机的测量轴转速扭矩系统的软件实现毕业设计_第2页
基于单片机的测量轴转速扭矩系统的软件实现毕业设计_第3页
基于单片机的测量轴转速扭矩系统的软件实现毕业设计_第4页
基于单片机的测量轴转速扭矩系统的软件实现毕业设计_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

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

文档简介

1、 毕业设计论文测量轴转速扭矩系统的软件实现 xx大学xx学院毕业设计(论文) 题 目 测量轴转速扭矩系统的软件实现 所 属 系 过程装备与控制工程系年级专业 学 号 姓 名 指导教师 日 期 测量轴转速扭矩系统的软件实现摘要:在深入研究轴转矩转速测量仪工作原理基础上,采用面向对象程序设计语言vc+6.0,建立一个对轴转速,扭矩值动态测量采集的系统,继而完成对数据的存贮。关键词: 面向对象的程序设计 开放数据库连接 sql查询 数据库the design of a measurement system for shaft speed and torque abstract: based on d

2、eeply researching into the operation principle of shaft speed and torque measurement instrument, we adopt object oriented program ,vc+6.0,create a dynamical measurement system for shaft speed and torque, completing the record of data. key words:object oriented program(oop) the query of sql databaseo

3、dbc(open database connection)目 录the design of a measurement system for shaft speed and torque1目 录2前 言3第一部分 系统设计概述41.1数据采集系统的组成及其硬件结构41.1.1典型的数据自动采集系统41.1.2转矩转速测量仪硬件结构51.2系统的工作原理61.2.1转矩测量原理图61.2.2转速测量原理61.3 扭矩转速数据采集系统的软件功能及结构7第二部分 软件工程模块的建立82.1用户界面设计82.1.1消息及成员函数之间的响应关系92.1.2设计步骤92.2数据库设计252.2.1数据库整

4、体框架设计252.2.2完整实现代码272.3 rs-232c通信建立392.3.1 windows下串行通信392.3.2 rs232c的类封装46第三部分 毕业设计的收获和反思51参考文献:52前 言自1981年8月12日ibm公司的pc问世以来,pc的处理能力经历了一个惊人的发展过程。现在pc正在大举进入数据采集领域。事实上,作为数据采集的主要部件,pc表现出了巨大的潜力。pc采用数字编码格式,使得大规模瞬态采集和存储数据成为可能。为基于大量数据的工业用分析设计软件如ansys5.7提供了数据源,为工业过程控制领域自动控制的实施提供决策依据。 一些大型控制系统经常采用vb作平台,vc作为

5、面向对象程序,并辅之以汇编语言作为i/o接口处理本次毕业设计实验的仪器为一台普通的转速转矩测量仪,通过转矩传感器实现转矩、转速及轴功率的多参数输出,并显示在led液晶控制面板上。但因为生产该仪器厂家,只提供与计算机通信相连的rs232接口,而未提供相关通信连接的软件。故无法实现数据采集的智能化和计算机化。因此本次毕业设计选题的目的在于,基于该转速转矩测量仪的rs232接口的串口通信机制,利用microsoft 提供的visual c+编程开发工具,完成计算机与该仪器的智能通信,实现该仪器数据的动态采集,记录,存入数据库备查。第一部分 系统设计概述1.1数据采集系统的组成及其硬件结构1.1.1典

6、型的数据自动采集系统随着人类社会的发展,利用计算机设备实现生产过程的自动化成为了提高生产力,减轻劳动强度的有效方法。由于大量设备的使用,必需随时知道实际的情况,这就是监视,通过计算机辅助数据采集过程可以实现对数据的自动处理。图11描述了一个简单的计算机辅助数据采集系统的方框图。计算机界与硬件接口通过合适的通信链路相连,硬件接口依次与相应的传感器相连,而传感器对视眼中环境的变化作出相应。传感器将各种不同的现象转换成电压或者电流信号接口硬件将传感器的输出信号转换成计算机可以识别的形式输入计算机。生产过程传感器接口硬件计算机传感器 图11典型的数据自动采集系统相应的我们对数据采集系统作出一点改动,便

7、可以作出工业上应用广泛的分布式监控系统(distributed control system)如图12所示。生产过程传感器接口硬件计算机执行机构 图12计算机控制系统方框图1.1.2转矩转速测量仪硬件结构本次毕业设计所采用的转矩转速测量仪是由湖南湘仪动力有限公司生产的基于jn388数字式转矩转速传感器和at89c52单片机教学科研用转矩转速测量仪,图13给出了与单片机接口构成的智能转矩转速测量仪的硬件电路结构框图。图中,jn338型转矩传感器输出的转矩及转速信号经光耦隔离后送入单片机的t0、t1计数器,然后由t0和t1完成测频计数功能,秒脉冲闸门由t2提供。这其中光耦的作用,一是电平转换,把转

8、矩转速信号电平转换成ttl电平,二是提高单片机的抗干扰能力并保护单片机。图13 智能转矩转速测量仪硬件电路结构框图由单片机完成相应的转矩、转速值的运算后,即可将转矩、转速及轴功率等参数保存并显示输出。本系统以at89c52单片机为核心由imp8132构成电源监控及看门狗电路以提高系统工作的可靠性,系统中扩展了一片i2c总线串行铁电存储器fm24256,它的主要作用是存储参数设定值及采集的转矩转速值。内含gb2312中文汉字库的图形点阵液晶显示模块ocmjx8c可用于构成中文人机显示界面,icl232的作用是将单片机的ttl电平转换为rs-232电平,以便于和上位计算机进行通信。1.2系统的工作

9、原理1.2.1转矩测量原理图 14应变传感器测量原理图 jn338数字式转矩转速传感器采用两组特殊环形旋转变压器来实现能源的输入及转矩信号的输出,从而解决了旋转动力传递系统中能源及信号可靠地在旋转部分与静止部分之间的传递问题。该传感器还可同时实现旋转轴转速的测量,从而可方便地计算出轴输出功率,因此利用该传感器可实现转矩、转速及轴功率的多参数输出。在一段特制的弹性轴上粘贴专用的测扭应变片并组成电桥,以形成基础扭矩传感器,然后在轴上再固定能源环形旋转变压器的次级线圈、轴上印刷电路板和信号环旋转变压器的初级线圈。电路板上包含整流稳压电源、仪表放大电路及v/f变换电路。在传感器的外壳上固定着激磁电路、

10、能源环形旋转变压器的初级线圈、信号环形变压器的次级线圈及信号处理电路。1.2.2转速测量原理转矩传感器在旋转轴上安装着60条齿缝的测速轮,在传感器外壳上安装的一只由发光二极管及光敏三极管组成的槽型光电开关架,测速轮的每一个齿将发光二极管的光线遮挡住时,光敏三极管就输出一个高电平,当光线通过齿缝射到光敏管的窗口时,光敏管就输出一个低电平,旋转轴每转一圈就可得到60个脉冲,因此,每秒钟检测到的脉冲数恰好等于每分钟的转速值。 1.3 扭矩转速数据采集系统的软件功能及结构用 户人/机交互界面 数据采集的命令消息 记录数据的命令消息rs-232c数据库管理系统 数据的实时记录数据库扭矩转速测量仪开始连接

11、数据库读串口数据 设置定时器是否创建新表 n获得串口数据 y新表名称显示数据设置采样个数记录采样数据停止读串口数据连接数据库写入数据库图15 程序结构及流程示意图该软件工程完成的功能主要有:对转矩转速测量仪经由rs232c串口送出的转矩转速数据进行动态采集,使用者可以自行规定采样个数,一旦完成了对数据的采集,使用者可以创建一个新表,并连接到数据库,完成对数据的存贮。第二部分 软件工程模块的建立2.1用户界面设计该界面所要完成得功能有:当用户点击连接数据库按钮时,会弹出数据源选择对话框,配置完成候,弹出“connect is ok”随后,用户可以创建新表。当用户点击读串口数据按钮时,如果计算机与

12、rs232c串口连接成功则在扭矩转速文本框中动态显示测量仪的扭矩及转速,当用户输入采样个数值以后,系统便开始在当前采样矩形列表框中显示采样所获数据,当记录完成后弹出写入数据库按钮,随后,即可将采样数据记录入库。 图21 程序功能界面图2.1.1消息及成员函数之间的响应关系窗口发出读串口数据信息时,将调用时间设置函数settimer(),时间响应函数ontimer(),串口通信类rs232c成员函数,获得端口数据getcomdata(),连接函数connectok(),记录函数onrecord(),停止读串口数据函数onstop().窗口发出连接数据库信息时,调用断开数据库函数onclose()

13、,写入数据库函数onwrite(),创建新表函数onnewtable().具体响应关系如图22所示。 图22 系统消息与响应函数系图2.1.2设计步骤步骤一 :创建工程。使用vc+的appwizard中的mfc appwizard(exe)选项建立一个名为pi100_rs232_vc60的single documents 工程。步骤二 :添加菜单资源。打开resourceview标签,打开dialog,添加标题为“扭矩转速试验采样记录系统”的对话框,id号为“idd_example_form”。添加该菜单命令的目的是为了弹出系统的功能界面如图23所示。步骤三 :该对话框所用到的控件的详细说明如

14、表21所示:图23 初始界面设计图 控件种类id号标 题静态文字(cstatic text)idc_static扭矩转速采样记录系统静态文字(cstatic text)idc_static当前表名静态文字(cstatic text)idc_static扭矩静态文字(cstatic text)idc_static转速静态文字(cstatic text)idc_static采样个数静态文字(cstatic text)idc_static新表名称静态文字(cstatic text)idc_static当前采样编辑文字 (cedit text)idc_edittorque扭矩编辑文字 (cedit t

15、ext)idc_editrpm转速编辑文字 (cedit text)idc_edit_recnum采样个数编辑文字 (cedit text)idc_edit_name新表名称列表框 (clist box)idc_listm当前采样按钮 (cbutton)idc_buttonconnect连接数据库按钮 (cbutton)idc_buttonread读串口数据按钮 (cbutton)idc_buttonrecord记录数据按钮 (cbutton)idc_buttonclose断开数据库按钮 (cbutton)idc_buttonstop停止读串口数据按钮 (cbutton)idc_buttonc

16、reate创建新表 表2-1 对话框的控件 在设计状态下,保证选中该对话框的前提下,使用系统采单viewclasswizard命令或使用快捷键ctrl+w,按照提示便可以完成生成新类的工作,将新生的类命名为exampleview,基类为cformview。步骤四 :使用classwizard添加菜单响应函数以及为对话框的控件添加事件处理函数。使用classwizard命令,调用“mfc classwizard”对话框。先将 “class name :”组合框选为“cexampleview”;在“object id:”列表框中,选中“idd_example_form”;在message:”列表框

17、中,选中“command”;最后用鼠标左键单击“add fuction”按钮,以便添加该菜单命令消息函数。将“class name :”组合框选为“cexampleview”项,在“object id:”列表框中,分别用鼠标选中表12中所列出的控件id(每次只能选择一个);在“message :”列表框中,选中“bnclicked”消息,然后再用鼠标左键单击“add fuction”按钮。此时屏幕上会弹出 add member fuction对话框,如此重复多次就可以添加所需的消息控制函数。步骤五 : 为对话框类添加成员函数和成员变量,打开class view标签,用鼠标右

18、键单击类cexampleview,使用快捷菜单命令“add member viariable”添加成员变量。使用classwizard菜单中“add member fuction”命令添加如下主要成员函数: getcomportdata( ) / 获得串口数据 getcomportdatafor_jw1a( ) /在列表中显示数据 onconnect( ) /连接数据库 onrecord( ) /记录新数据 onclose( ) /断开数据库 onnewtable ( ) /创建新表 onwrite( ) /写入数据库 onread( ) /读串口数据编辑exampleview.h文件如下:/

19、 exampleview.h : interface of the cexampleview class/#if !defined(afx_exampleview_h_43802042_b656_11d4_8741_82cf81df7355_included_)#define afx_exampleview_h_43802042_b656_11d4_8741_82cf81df7355_included_#if _msc_ver > 1000#pragma once#endif / _msc_ver > 1000#include "modalodbc.h"stru

20、ct s_data /为将转速扭矩测量数据放入数据库定义的一种数据结构double m_data;double n_data;class cexampleview : public cformviewprotected: / create from serialization onlycexampleview();declare_dyncreate(cexampleview)public:/afx_data(cexampleview)enum idd = idd_example_form ;ceditm_torque; /定义的扭矩变量ceditm_rpm; /定义的转速变量/afx_data

21、mydbclass db;/ attributespublic:cexampledoc* getdocument();/ operationspublic:class crs232 *rs232; /定义的串口通信类void getcomportdata(); /获得串口数据显示采集所获的数据/ overrides/ classwizard generated virtual function overrides/afx_virtual(cexampleview)public:virtual bool precreatewindow(createstruct& cs);protecte

22、d:virtual void dodataexchange(cdataexchange* pdx); / ddx/ddv supportvirtual void oninitialupdate(); / called first time after construct/afx_virtual/ implementationpublic:char tbname50;int currentnum;int recnum;bool beginrecord;bool connected;s_data * samp_data;bool connectok();virtual cexampleview()

23、;#ifdef _debugvirtual void assertvalid() const;virtual void dump(cdumpcontext& dc) const;#endifprotected:/ generated message map functionsprotected:/afx_msg(cexampleview)afx_msg void onread (); /读串口数据afx_msg void ontimer(uint nidevent); /对定时器的响应afx_msg void onconnect(); /连接数据库afx_msg void onreco

24、rd(); /记录新数据afx_msg void onshowwindow(bool bshow, uint nstatus); /按钮的显示与隐藏afx_msg void onclose(); /断开数据库afx_msg void onreadstop(); /停止读串口数据afx_msg void onnewtable(); /创建新表afx_msg void onwrite(); /写入数据库/afx_msg void onchangeedittorque(); / afx_msg void onchangeeditrpm();/afx_msgdeclare_message_map();

25、#ifndef _debug / debug version in exampleview.cppinline cexampledoc* cexampleview:getdocument() return (cexampledoc*)m_pdocument; #endif/afx_insert_location/ microsoft visual c+ will insert additional declarations immediately before the previous line.#endif / !defined(afx_exampleview_h_43802042_b656

26、_11d4_8741_82cf81df7355_included_)步骤六 :为各个成员函数添加代码。添加完成所有成员函数和成员变量之后,实现这些成员函数,该类的完整实现代码如下:/ exampleview.cpp : implementation of the cexampleview class/#include <stdafx.h>#include <math.h>#include "stdafx.h"#include "example.h"#include "rs232.h"#include "

27、;exampledoc.h"#include "exampleview.h"#ifdef _debug#define new debug_new#undef this_filestatic char this_file = _file_;#endif/ cexampleviewimplement_dyncreate(cexampleview, cformview)begin_message_map(cexampleview, cformview)/afx_msg_map(cexampleview)on_bn_clicked(idc_test, ontest)on_

28、wm_timer()on_bn_clicked(idc_button1, onconnect)on_bn_clicked(idc_button3, onrecord)on_wm_showwindow()on_bn_clicked(idc_button4, onclose)on_bn_clicked(idc_test_stop, onreadstop)on_bn_clicked(idc_button_newtable, onnewtable)on_bn_clicked(idc_button_write, onwrite)/ on_en_change(idc_edittorque, onchang

29、eedittorque)/ on_en_change(idc_editrpm, onchangeeditrpm)/afx_msg_mapend_message_map()/ cexampleview construction/destructioncexampleview:cexampleview(): cformview(cexampleview:idd)/afx_data_init(cexampleview)/ note: the classwizard will add member initialization here/afx_data_init/ todo: add constru

30、ction code herers232 = new crs232; / rs232通信类的引入this->beginrecord=false;recnum=0;this->connected=false;strcpy(tbname,"null");cexampleview:cexampleview() delete rs232;cwnd:killtimer(1); db.disconn();void cexampleview:dodataexchange(cdataexchange* pdx)cformview:dodataexchange(pdx);/afx

31、_data_map(cexampleview)ddx_control(pdx, idc_edittorque, m_torque);ddx_control(pdx, idc_editrpm, m_rpm);/afx_data_mapbool cexampleview:precreatewindow(createstruct& cs)/ todo: modify the window class or styles here by modifying/ the createstruct csreturn cformview:precreatewindow(cs);void cexampl

32、eview:oninitialupdate()cformview:oninitialupdate();getparentframe()->recalclayout();resizeparenttofit();/ cexampleview diagnostics#ifdef _debugvoid cexampleview:assertvalid() constcformview:assertvalid();void cexampleview:dump(cdumpcontext& dc) constcformview:dump(dc);cexampledoc* cexamplevie

33、w:getdocument() / non-debug version is inlineassert(m_pdocument->iskindof(runtime_class(cexampledoc);return (cexampledoc*)m_pdocument;#endif /_debug/ cexampleview message handlersvoid cexampleview:onread() / todo: add your control notification handler code herecwnd:settimer(1,1000,null);/设置发送响应时间

34、,每一秒发送一次。cbutton *p=(cbutton*)getdlgitem(idc_test);p->showwindow(sw_hide);p=(cbutton*)getdlgitem(idc_test_stop);p->showwindow(sw_show);p=(cbutton*)getdlgitem(idc_button3);p->showwindow(sw_show);void cexampleview:getcomportdata() /获得串口的数据cwnd:killtimer(1); /中断对定时器的响应if(!connectok() /如果连接失败af

35、xmessagebox("应答失败!");return; dword nnumberofbytestoread; /要读取的字节数 dword nbytesread; /已经读取的字节数 char buffer1128, buffer2128; /定义存放串口数据的缓冲区 char mychar; int i, j; bool nowgetn = false; /两个数据之间的转换标识char listchar256; for(i=0; i<128; i+)buffer1i = buffer2i = '0' rs232->setupcomport

36、(); /clear i/o buffer. nnumberofbytestoread = 1; /指定要从串口读取的字节数。 i = j = 0; do rs232->readcomport(nnumberofbytestoread, nbytesread); mychar = rs232->combuffer0; if( nowgetn ) buffer2j = mychar; if( mychar = ',' ) nowgetn = false; buffer2j = '0' j+; else buffer1i = mychar; if( my

37、char = '' ) nowgetn = true; buffer1i = '0' i+; /strcpy(buffer, rs232->combuffer); while( mychar != ',' ); /显示采集所获的数据于编辑对话框中 / if( lstrlen(buffer1) >= 6 && lstrlen(buffer2) >= 6 ) m_torque.setwindowtext( buffer1 ); m_rpm.setwindowtext( buffer2 ); if(beginrecor

38、d) /开始记录数据if(currentnum<recnum) /如果当前记录的数据个数小于要记录的个数 /将数据转换为浮点数据记录于列表框中char a10;samp_datacurrentnum.m_data=0.0001*atof(buffer1);samp_datacurrentnum.n_data=atof(buffer2);clistbox * pp=(clistbox*)getdlgitem(idc_listm);strcpy(listchar,"m:");sprintf(a,"%10.4f",samp_datacurrentnum.

39、m_data);strcat(listchar,a);strcat(listchar," n:");strcat(listchar,buffer2);pp->addstring( listchar);currentnum+;cstatic *ps=(cstatic*)getdlgitem(idc_static_num);itoa(currentnum,a,10);ps->setwindowtext(a);cbutton * p2=(cbutton*)getdlgitem(idc_button_write);if(recnum>0)&&(cu

40、rrentnum=recnum)&&(connected)&&(strcmp(tbname,"null")!=0)p2->showwindow(sw_show);elsep2->showwindow(sw_hide);/此时出现可以记录入数据库的按钮提示用户可以将数据存入数据库了cwnd:settimer(1,1000,null); /恢复对定时器的响应/-/*void cexampleview:getcomportdata_forjw1a()cwnd:killtimer(1); dword nnumberofbytestorea

41、d; dword nbytesread; char buffer1128, buffer2128;char mychar; int i; for(i=0; i<128; i+)buffer1i = buffer2i = '0' rs232->setupcomport();/clear i/o buffer. nnumberofbytestoread = 1; i = 0; do rs232->readcomport(nnumberofbytestoread, nbytesread); mychar = rs232->combuffer0; buffer1

42、i = mychar; i+; while( i < 19 );double m, n, temp;/mtemp = buffer11 - '0'm = temp * pow(10.0, 4.0);temp = buffer12 - '0'm += temp * pow(10.0, 3.0);temp = buffer13 - '0'm += temp * pow(10.0, 2.0);temp = buffer14 - '0'm += temp * 10.0;temp = buffer15 - '0'm +

43、= temp; temp = buffer10;if( temp = '-' )m *= -1; temp = buffer116-'0' m *= pow(10.0, -temp);/ntemp = buffer16 - '0'n = temp * pow(10.0, 4.0);temp = buffer17 - '0'n += temp * pow(10.0, 3.0);temp = buffer18 - '0'n += temp * pow(10.0, 2.0);temp = buffer19 - '

44、0'n += temp * 10.0;temp = buffer110 - '0'n += temp; temp = buffer117-'0' n *= pow(10.0, -temp);sprintf(buffer1, "%.2f", m);sprintf(buffer2, "%.2f", n);m_torque.setwindowtext( buffer1 );m_rpm.setwindowtext( buffer2 ); cwnd:settimer(1,1000,null);/-*/void cexampl

45、eview:ontimer(uint nidevent) /对定时器的响应/ todo: add your message handler code here and/or call default /for pi-100getcomportdata();/for jw-1a/getcomportdata_forjw1a(); cformview:ontimer(nidevent);bool cexampleview:connectok()dword nnumberofbytestowrite;dword nbyteswritten,nnumberofbytestoread,nbytesrea

46、d;nnumberofbytestowrite=4;rs232->setupcomport(); /初始化串口,准备传输数据。strcpy(rs232->combuffer,"rts;"); this->rs232->writecomport(nnumberofbytestowrite,nbyteswritten);nnumberofbytestoread=3;rs232->readcomport(nnumberofbytestoread, nbytesread);rs232->combuffer2='0'if(!strc

47、mp(rs232->combuffer,"ok")return false;return true;void cexampleview:onconnect () / todo: add your control notification handler code hereif(db.step1(false,m_hwnd)=sql_success)afxmessagebox("connect is ok!");cbutton * p=(cbutton *)getdlgitem(idc_button1); p->showwindow(sw_hid

48、e);p=(cbutton *)getdlgitem(idc_button4); p->showwindow(sw_show);connected=true;p=(cbutton*)getdlgitem(idc_button_newtable);p->showwindow(sw_show); void cexampleview:onrecord () / todo: add your control notification handler code herethis->beginrecord=true;cstring str;cedit *p=(cedit *)getdlgitem(idc_edit1_recnum);p->getwindowtext(str);recnum=atoi(str); /将字符型数据转换为整型数据free(samp_data);samp_data=(struct s_data *) malloc (sizeof (s_data)*recnum);currentnum=0;clistbox *p1=(clistbox *)getdlgitem(idc_listm);p1->resetcontent( );cbutton * p2=(cbutton*)getdlgitem(idc_button_write

温馨提示

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

评论

0/150

提交评论