1、实验工程技术报告-直流电机测控系统设计实验内容 增量式编码器和74LS163计数器电机角位移、速度的测量; D/A转换器、LM324的使用; 单片机串口通讯、定时器、带校验字节的数据传输; VC中使用仪表类进行角度和位移的显示以及定时器的使用; VC中滑块控件的使用; VC中MSCOMM串口通讯控件的使用; VC中数据的保存;实验结果实现PC机对霍尔无刷直流电机角位移及速度的实时显示,利用测控系统操作界面对电机速度的连续调节,实现电机的启动、制动和速度及转向的控制。实验所需元器件直流电动机(1个,05V输入及转向控制)、AM-WZ3A电机驱动器(1个)、编码器(1个,A-B-C三路输出)、计数
2、电路74HC74-D触发器1个、HD74HC00P与非门两个、74LS193计数芯片一个)、单片机(80C51一片)、DAC0832数模转换器1个、LM324放大器1个、串口套件1套。1、实验工程的整体结构光电码盘实验工程的整体结构如下图: 利用对光电编码器每周输出的校准脉冲计数,完成电机转速的测量(转/分); 单片机采集计数器的4位数字信号,和旋转方向2位信号,通过串行总线RS232传送至计算机; 计算机通过串口接收单片机发送的电机速度信息,进行动态显示、处理及保存; 计算机通过串口发送控制电机旋转的电压信号(0255)和转向控制量(0或255); 单片机通过串口接收上位机发送的转速和转向控
3、制数据,通过DA转换器将其转换为05V的数据,并送至无刷直流电机驱动器,控制电机的转速和转向;2、光电编码器光电编码器通过光电转换将电机轴上的机械几何位移量转换成脉冲数字量,其工作原理如图2所示,在圆盘上有规那么地刻有透光和不透光的线条,在圆盘两侧,安放发光元件和光敏元件。当圆盘旋转时,光敏元件接收的光通量随透光线条同步变化,光敏元件输出波形经过整形后变为脉冲,码盘上有定相标志,每转圈输出一个校准脉冲。此外,为判断旋转方向,码盘还可提供相位相差90。的两路脉冲信号。I-轴;2光源;3-A、B、C相狭缝;4-旋转板(光栅码盘J;5-A、B、C受光元件;图2光电编码盘原理图3光电编码器的正反转信号
4、顺时针旋转时,通道A输出波形超前通道B波形90;逆时针旋转时,通道A输出波形迟通道B波形90;光电编码器每旋转圈,输出一个基准脉冲Z,基准脉冲的波形中心对准通道A输出的波形中心,用于基准点定位,如图3。光电编码盘的检测精度是一个重要的性能指标,它说明了光电编码每旋转一周可以输出多少个脉冲,显然,输出脉冲数越多,说明码盘的精度越高,本系统采用的光电编码盘输出1024个脉冲。考虑到霍尔无刷电机的转速较高,因此我们使用A、B两路输出信号的相位关系来判断旋转方向,利用通道Z的脉冲计数来对电机的转速进行测量。3、光电编码盘的计数与鉴向实验中采用的码盘是增量式码盘,增量式编码盘需要累加计数来完成角度检测,
5、通常采用的计数电路大同小异,都是对编码器产生的脉冲进行计数来得到角度值,考虑到转盘转动是双向的,既可顺时针旋转,也可逆时针旋转,需要对编码器的输出信号鉴相后才能计数。典型的编码器计数与鉴向电路如图4所示,鉴相电路用1个D触发器和2个与非门组成,计数电路用N片74LS193组成,N由所需的计数范围确定,本实验中,使用1片74LS193完成16个脉冲的正反计数。将编码器输出A相接D触发器D端,B相接触发器CP端。D触发器的输出Q和Q与两与非门,控制计数器74LS193加减方向。Z相为计数脉冲,分别与两与非门相连,计数器熨位初值为OOo0,即ABCD接地处理。图4编码器典型的计数与鉴向电路当光电编码
6、器顺时针旋转时,通道A输出波形超前通道B输出波形90,D触发器输出Q为高电平,Q一为低电平,上面与非门翻开,计数脉冲(Z相)送至双向计数器74LS193的减脉冲输入端CPD,进行减法计数;此时,下面与非门关闭,其输出为高电平给CPU。当光电编码器逆时针旋转时,通道A输出波形比通道B输出波形延迟90,D触发器输出Q为低电平,上面与非门关闭,下面与非门翻开,计数脉冲通过Z相脉冲送至双向计数器74LS193的加脉冲输入端CPU,进行加法计数。考虑到霍尔电机最大转速为2000rm(约为33rs,3.3r100ms),故我们使用一个74LS193共四位完成转速信息的测量,同时,使用D触发器的输出Q和Q一
7、共两位信息判断电机转向,单片机接收6位电机的速度信息,即:D5-D4-D3-D2-D1-D0当D5D6=10时,正转,反之,反转。实验中,我们将该6位数据信息与单片机的Pl管脚相连,如图5所示。4、系统硬件连接计数器输出42位Ik1x 1A 1A Ix PPPP12 3 4IrTTRST/Vpd 匚 接串 口 TXDP3. O/RXD c接串口 RXDP3. 1/TXD 匚P3.2INT0 U P3.3INT1 cP3. 4T0 cP3.5I1 cDAO-WRl P3. 6/WR 匚 P3.7/RD cXTL2 c XTALl cVss cVcc 丁 IOkVcc转向控制DAO 转速控制O 9
8、 8 7 654321098 76 5432 143333333333222222222Ig8Is0812345678910U121314151617181920图5直流无刷电机控制系统单片机硬件连接图5、8位D/A数模转换器DACo832DA转换器的作用是将单片机的送出的数字量转换为对应的模拟量输出,在本实验中,我们使用8位DAa)832来获得用于控制电机旋转速度的输入控制电压(05V),其连接电路如图6所示。IXiND 否CSVCC ILEXFERRfbWRlIoutiVVR21OUT2AGD7 DACo832 ?DIo图6D0832管脚分布及连接电路图其中二西为片选信号,低电平有效,实验
9、中接地处理;函写信号1,低电平有效,实验中DAC的WRl接单片机的P3?管脚;ILE是允许锁存信号,高电平有效,接VCC;WRI.CSjILE三者逻辑与后的负跳边沿,将数据线上的信息锁入输入锁存器;即利用WRl的上下电平的变化完成数据写入和锁存,如图7所示。VlHWRVil读数字量锁入锁存器图7.DA0832写数据时序图寿正传送控制信号,低电平有效,接地;碱写信号2,输入低电平有效,其有效时,传送控制信号又必将锁存在输入锁存器的8位数据送DAC存放器,接地处理;VREF:基准电压输入端,可在0V10V范围内调节,实验中只需要单极性电压输出,故此脚接地;DI0DI7:数字量输入端,实验中DA数字
10、量输入端接单片机PO口;Rfb:DAeO832芯片内部反应电阻引脚,实验中悬空。IOUTkIOUT2:电流输出引脚。电流IoUT1、IOUT2的和为常数,IOUT1、IOUT2随存放器的内容线性变化,实验中IOUT2悬空,IOUTl接LM324放大器同相端进行同向放大,连接电路如图8所示,其放大倍数为:实验中我们选择与、R2、所、&和C的值分别为Ik、Ik、Ik、Ik和50uF。R/RZ图8DA转换器电流电压转换电路考虑到LM324放大器放大倍数及饱和电压的限制,实验中选择适宜的电阻的值,且LM324的供电电压VCC接9V电压。6、单片机主要程序单片机主要完成电机转速信息的采集、串口发送以及串
11、口接收上位机数据、控制DA转换,下面我们来分块介绍。6.1带引导码和校验字节的数据传输由于单片机要接收上位机发送的8位的电机控制电压数字信号和控制电机正反转的控制信号,因此单片机在接收数据时,对数据的顺序有严格的要求,否那么就会造成转速和转向控制数据混乱,电机失控。另一方面,本实验中下位机仅发送6位有效数据(占一个字节)给上位机,故不涉及数据的顺序发送和上位机的顺序接收问题,但如果下位机需要发送多个字节的数据给上位机,也需要涉及到数据的正确接收问题,因此,实验中,我们引入了带引导码和校验字节的单向数据传输模式,即通讯过程中,省略主机和从机的屡次握手协议,进而提高通讯的速度和效率,其实现思路如图
12、9所示。事件触发图9带引导码和校验字节的数据传输设置数据接收标志bRecving=O,表示等待接收数据块的引导码,当接收到引导码后,置bRecving=l,准备接收有效数据和校验字节,当接收完毕后重新置bRecving=O,准备接收下一个数据块的引导码。接收到的字节利用校验字节进行校验(一般为校验字节等于有效数据的和并256求余)。单片机主要程序如下:#include#defineuintunsignedint#defineucharunsignedcharUChartt,RIndx=OEagErr=O/*数据正确接收标志*;ucharDIPos2=0,0y13位有效,11+2位鉴相UChar
13、DAln2=0,0;/单片机接收到的发送给DA转换器的数据SbitdaOWR=P36;转速控制电压DA0;SbildalWR=P3zv7;电机转向DAI,5V俯瞰逆转,OV正转voidmain()(TMoD=OX21;设置定时器1为工作方式2,波特率设置;定时器0工作于工作方式1;THl=Oxfd;TLl=Oxfd;THO=(65536/0000)/256;IOms,由n次数来决定实际的周期TL0=(65536-l(XXX)%256;EA=I;ES=I;开串口中断ETO=1;定时器0中断响应标志位TRO=I;TRl=I;REN=I;SMO=O;SMl=I;daOWR=l;为DA转换器读数据准备
14、高电平dalWR=l;while(l)(if(tt2)ES=O;tt=O;DIPOS0=P1;取角位移低8位;DIPoS1=P2;取角位移高8位SBUF=DlPoS0;发送数据低8位While(JTI);TI=O;SBUF=DIPoS;高5位数据while(!TI);TI=O;if(RIndx=O)(If(FlagErr=O)(P0=DAIn0DA0转换da()WR=O;daOWR=l;启动转换PO=DAInI;/DAl转换daIWR=O;dalWR=l;ES=I;if(tt2)while(l)main()voidtime()interrupt1定时器0,定时发送数据TH0=(65536-1)
15、256;TL0=(65536-1(XXX)%256;tt+;voidReadSer()interrupt4接收RI=O;DAInRIndx=SBUF:/No.l控制电机转速数据;No.2为控制电机转向数据RIndx+;RIndx=RIndx%2;设置FIagErr来判断是否接收正确If(RIndx=O)(if(DAIn1!=0xff)&(DAIn1!=0x)(RlndX=假设接收的第二个字节不是OXOo或OXff,那么置接收错误标志为1,AagErr=1;7、直流无刷电机及驱动器图10直流无刷电机图11直流无刷电机AM-WZ3A驱动器直流无刷电机如图10所示,电线连接方式如表1所示。直流无刷电
16、机AM-WZ3A驱动器如图11所示,电线连线图如图12所示,端子定义如表2所示。表I直流无刷电机引线说明表引出线引出线颜色引出线型号功能说明1红色UL1007/26AWGVCC霍尔电压输入2黑色GND霍尔接地3黄色HALLA4蓝色HALLB5白色HALLC6橘色UL1007/26AWGPHASEU7绿色PHASEV8棕色PHASEW表2直流无刷电机AMWZ3A驱动器端子定义端子标记作用JlABC电机连接线U-V-WoH+H-板载电机HALL器件供电的电源,其输出电流小于200mA,电压输出+6V此端不能作其他用途。SaSbSc接电机霍尔线UVW,颜色与电机线顺序对应。霍尔线和电机线要分开布线。
17、线长不允许超过5米。J3B电机刹车信号。内部上拉,正常使用接低电平,当悬空或接于高电平(58V)时电机紧急刹车。GND地,可以供刹车和方向信号连接F电机正反转信号,平时为低,当接于高电平(58V)时电机反转,不接那么正转。GND板载6V电源地R调速输入端,控制信号,O6V代表O最高速+板我6V电源。J3上输入信号供电端,电流GOnIAJ4G电源地VH电源,12VDC电MAcHiia Bild VitiiBtfATLK0rc 0 10(Ctr*ltK4itDgDZebs trar为了解决串口控件在使用ColeSafeArray对象接受数据时引起的内存溢出的问题,需进行如下其一设置:1 .设置“R
18、elease”发布模式。菜单项-Build-COnfigUratiOnS-(Remove)Win32DebUg模式。ProjectXProjectsettingcc+ProgramDatabase2 .程序运行于DebUg模式,设置iSProject-setting-general中USeMFCinasharedll改为staticdlL推荐使用第二种方法。8.1 用户界面电机测控系统用户界面如图14所示。系统用户界面主要由按钮(滑块)操作和显示两局部组成。其中按钮局部主要有系统的启动按钮、停止按钮、数据保存按钮、帮助按钮和退出按钮,以及电压调节滑块、电压编辑框(IDC.EditVolt)、采
19、样频率设置(IDC.EditFreq)和串口选择组合框(IDC.CommList)。显示局部主要包括主显示面板(曲线显示当前的转速和电压),电机转速表盘。下面分别介绍设计过程。8.2 添加控件在菜单条空白处点击右键选择显示控件(Controls),如图13(d)所示。添加5个BUtton控件至对话框,并分别指定其ID为启动按钮(IDC_BtnStart)、停止按钮(IDC_BmStop)、数据保存按钮(IDC_BtnSave),帮助按钮(IDC_BtnHelp)和退出按钮(IDCLBmEXit),并设置为位图(Style-Bitmap)格式。添加EditBox控件,ID为IDC_EditFre
20、q,用以设置采样频率;添力口EditBox控件,指定其ID为IDjEditVolt,用以编辑控制电压;添加SIider控件,指定其ID为IDjSliderVoh,并设置TiCkMarks,用以连续调节控制电压;添加COmboBOX控件,ID为IDC.CommList,设置为DroPLiSt模式,用以选择串口;添加其他必要的StaticTeXt静态文本框控件,用以显示静态文本,如测控系统标题文本框IDC_S_TitIe,用以显示“直流电机测控系统”、其他IDC_STATIC显示“采样频率”、“Hz”、“电压调节”、“Volt”、“串口选择”等。8.3 根本控件初始化对话框初始化在CHalMotr
21、Dlg类中添加Windows的消息处理函数(AddWindowsMessageHandler)WM_CTLCOLOR如下:HBRUSHCHalMotrDlg-OnCt1Color(CDC*DC,CWnd=*pWnd,UINTnC(IColor)HBRUSHhbr=CDialog:OnCtlColor(pDC.pWnd.nCtlColor);if(pWnd-XjeiDlgCtrlID()=lDC_S_Title)(PDC-SelBkMode(TRANSPARENT);pDC-Se11xtColotXRGB(21,252,1OS);设置标题颜色CFontm-fb11(;m_font.CreateP
22、ointFont(250,黑体设置标题字号和字体pDC-SeleciObject(&m_font);CBrush*pBrush=CBrush:FromHandle(HBRUSH)GetStockObject(GRAY_BRUSH);return*pBrush;利用上述If条件可封其他控件的设备上下文属性进行设置,在此不再赘述。PDC-ASeiBkMode(TRANSPARENT);CFontm_fbnt;m.font.CreatePoinFon(IIO,体”);对话框中其他文本局部的字体和字号pDC-SeieciObjeci(&m_fbnt);CBrushpBrush=CBrush:FromH
23、andle(HBRUSH)GeiStockObjecl(GRAY_BRUSH);return*pBrushW设置对话背景色returnhbr;)按钮初始化我们对按钮进行必要的贴图,使其使用起来方便。为此,我们准备如图15所示的5幅位图(bmp格式),将其选入到按钮外表上。实现过程如下。图15按钮位图 在资源视图中(ResourceView)中,插入(Insert)位图(Bitmap),并分别导入上述5个位图,设置其ID分别为IDB_BitmapStart、IDB-BitmapStopIDB_BitmapSave、!DB_BitmapHelp和IDB-BitmapExito 在CHalMotrD
24、lg类中添加CBitmap成员变量如下:CBitmapm_bitmapStart;CBitmapm-bitmapStop;CBitmapm-bitmapSave;CBitmapm-bitmapHelp:CBitmapm_bitmapExit:在CHalMotrDlg类的对话框初始化函数(OnlnitDialog)函数中,将位图变量加载图片,即m-bitmapStarLLoadBitmap(IDBJBiunapStarOW设置按钮图片m-bitmapStop.LoadBitmap(IDBJBitmapStop);m_bitmapSave.LoadBitmap(lDB_BitmapSave):m_
25、bilInapHelp.LoadBitmapfIDB-BitmapHelp);m-bittnapExit.IxadBitmap(ID-BiimapExit); 将按钮关联成员变量,即在GaSSWiZardVMemberVariables关联成员变量:IDC_ BtnStart 关联 CButtonm-BtnStart;IDC_ BtnSiop 关联 CBultonm-BtnSop;IDC.B(Save 关联 CButtonm-BtnSave;IDC_BtnHeIp关联CButtonIDC-BinExit关联CBUgn 在CHalMOtrDlg类的对话框初始化函数(OnInitDialog)函数
26、中,加载图片给按钮,即:m_BtnStart.Se出itmap(HBlTMAP)m_bi【mapStarLm_hObject):in_BtnStop.SetBitmap(HBITMAP)m_bitmapStop.m_hObject);m_BtnSave.SetBitmap(HBnMAP)m_bitmapSave.m_hObject):m_BtnHelp.SetBitmap 串口选择组合框初始化将串口选择组合框IDC_CommList关联成员变量CComboBoxm_CommList;并在CHalMotrDIg类的对话框初始化函数(OnInitDialog)函数中,添加初始化语句:m_CommL
27、ist.AddString(COM1);m-CommList.AddString(,COM2);m-CommListAddString(COM3);m_CommList.AddString(COM4):m-CommListAddString(nC0M5);m-CommList.AddString(COM6);m_CommLisi.SeiCurSel(0);设置初始选中为第一项,即CoMI 电压调节滑块初始化将电压调节滑块IDCLSliderVolt关联成员变量CSliderCtrlm_SliderVolt;并在CHaIMotrDlg类的对话框初始化函数(OnInitDialog)函数中,添加初
28、始化语句:m.SliderWlt.SeRange(-500,500);“聚小与最大位置m-SliderVolJ.SePos(0);设置初始位置m_SliderVok.SeEcFreq(50);设置刻度显示个数8.4 显示仪表在本实验中我们使用两种显示方式对测量数据进行显示,一是曲线显示当前转速和控制电压的大小,使用CDyPIot类实例化对象,利用其函数DyPIotAddYX来完成;二是使用表盘显示当前的电机的转速,使用CMeter类实例化对象,利用其函数UPdateNeedIe来完成。显示仪表的设置及操作按如下步骤进行。 在HaIMotr工程的文件视图中,分别添加CDyPlot类和CMeter
29、类的源文件和头文件,即DyPlot.cpp、Meter.cpp和DyPIot.h、MemDC.h、Meter.h; 在对话框面板中添加两静态文本框,分别定义其ID为IDC_Graph和IDC_Meter,并关联成员变量CStaticm_Graph和CStaticm_Meter.(注意到CDyPlot类和CMeter类都派生自CStatic类)A在HalMOtrDlg.h中添加头文件,“includeMeter.h#inchideDyPloLh,并将成员变量改为CMeterm_Meter;CDyPIotm-Graph; 在CHalMotrDIg类的对话框初始化函数(OnlnitDialOg)函数
30、中,添加初始化语句,对显示仪表的属性进行设置:m-Meter.SetRange(-20,20);/费范围CStringstr;sr.FormatC%s,r)W设置单位m-Meer.SetUnits(str);m_Meier.m_dCurrenValue=。;/指针当前位置8.5 串口通讯操作界面中显示的速度信息来自于串口读出的数据,滑块对应的电机控制电压需要通过串口发送给单片机,这就涉及到了计算机与单片机的串口通讯问题。计算机的串口通讯可以通过两种方式来实现,一种是使用微软提供的MSCOMM控件来完成,-种是利用多线程技术,本实验中我们使用MSCoMM控件来完成对数据的读取和发送,串口的操作流
31、程主要分为四局部,即配置串口、翻开串口、读写串口和关闭串口。 在对话框中创立通信控件。假设Control工具栏中缺少该控件,可通过菜单Project-AddtoProjectComponentsandControl(WGalleryXRegisteredActiveXControlsXMicrosoftCommunicationsControl,version6.0)插入即可,再将该控件从工具栏中添加到对话框。此时,你只需要关心控件提供的对Windows通讯驱动程序的API函数的接口即可,换句话说,只需要设置和监视MSComm控件的属性和事件。 将MSCOMM控件拖拽至对话框中适宜位置ID_M
32、SCOMM1,右键单击。assWizard-关联CMSComm类的成员变量m_Comm; 在CHalMotrDlg类的对话框初始化函数(OnInitDialog)函数中,添加初始化语句,对串口属性进行配置,如下:m_Comm.SetCommPort(m_CommList.GetCufSel(+1)R认选择串口1;m_Comm.SeiSeliings(9600,N,8,l);波特察、奇偶校脸、数据位、停止位m_Comm.SeHnButTerSiz&1024);设定接受缓冲区的大小m-Comm.SeInputMode(I)W二进制读;m_Comm.SelRThreshold(l);当接收字符后,产
33、生OnComm事件m_Comm.SeiSThresho1d(0);/数据传箱事件不会产生OnComm事件 单击启动按钮时,翻开串口,即在按钮ID_BmStart的消息BN_CLICKED处理函数OnBmStart()中添加语句:ifCOmm.GeiPortOpenO)确定没有翻开串口m_Comm.Se【PonOpen;那么翻开串口 翻开所需串口后,需要考虑串口通信的时机。在接收或发送数据过程中,可能需要监视并响应一些事件,所以事件驱动是处理串行端口交互作用的一种非常有效的方法。使用OnComm事件和CommEvent属性捕捉并检查通讯事件和错误的值。发生通讯事件或错误时,将触发OnCornm事
34、件。实验中,单片机采集编码器计数电路的6位数据(1个字节)和前一时刻数据信息,为了保证数据的正确接收,在头尾分别加引导码和校验字节,共四个字节经由串口通讯发送至上位机,上位机采用MSCOMM控件的通讯事件监视程序Oneomm监视串口接收到的数据的个数,当接收到引导码后,缓冲区内有三个字节的数据时,那么读取串口数据,进行数据处理,原理如6.1所述。代码如下。 在CHalMOtrDIg类中添加成员变量:inim_bRecving;接收数据引导码标志UINTm_nByiesRecd;输入缓冲区接收的字节数BYTEm_ByRecd3;存放从输入缓冲区中读入的字节数据BYTEm_BylDaia2;存放经
35、校脸的有效数据并在CHalMotrDlg类的对话框初始化函数中对其初始化,即m-bRecving=O;m_nByIeJiReCd=0;m-BytRecd(O=O;m-BytRecd1J=O;m-ByDaafO=O;m-BytData11=0; 在CHalMotrDIg类中添加控件IDC_MSCOMM1的消息处理函数OnCommMscomm1(),并添加代码如下:if(m_COmm.GeiCommEveniO=Z)串口接收事件VARIANTinp_var;定义变体类型变量,读输入媛冲区用COIeSafeArraySafLarr;定义平安数据if(O=mJ)ReCVing)等待接受数据的引导码(i
36、np_var=m_Comm.GetInput();/读输入慢冲区saf_arr=inp_var;1.ONGk=0;BYTEfst_ch;SafLarr.GetElemenl(&k,&f“_ch);从平安数组中取出字节if(0xf=fSLCh)判断是否准备接受有效数据m-bRecving=l;m_nBytesRecd=O:)else(m_nBytesRecd=m_nBytesRecd+1:if(3=mnBy(esRecd)/当接收到3个字节时,读取输入缓冲区inp_var=m_Comm.GeiInput();SafLarr=inp_var;1.ONGk=0;ibr(k=0;kO)DirC=OXf
37、f;电机逆时针一正向elseDirC=OXOoW电机顺时针一反向BYTEf$l_ch=Ox55W弓I导码BYTEVeri=(Volt+Dim)%256;/校脸字节CByteArrayctl-Arr;CtLArr.RemoveAHO;ClLArr.Add(fSLCh);引导吗ctl-Arr.Add(Volt);CtLArr.Add(Dirc);CLArr.Add(Vbri);/校验字节m-Comm.SetOutput(COleVariant(CtLArr);关闭串口。在采集系统停止时,应关闭串口,因此在停止按钮IDC-BtnStop的消息处理函数OnBmStOP()中添加:if(1m-Comm.
38、GeiPortOpen()m_Comm.SetPortOpen(0):8.6 数据保存电机测控系统涉及大量数据的存储,包括采样时刻、电机角度位置、当前转速、控制电压的存储,如果定义全局数组进行保存,随着采样次数的增加,势必会大量占用内存,降低计算机的效率,实验中我们通过在外存储设备中建立一个数据文件,将数据先存入文件中,在用户保存数据时,将数据从文件中读出,再进行保存,防止内存的大量占用。 在全局变量中使用CFIe类新建一个文件变量BUfferfile,文件命名为wDataBuffer:CFileBufferfi1e(DataBuffer,CFile:nodeCreateCFiIe:modeW
39、riie);写入数据用 在CHalMotrDlg类的对话框初始化函数(OnlnitDiaIog)函数中,关闭文件,写数据时再翻开,即添加语句:BUfferfiIe.CloseO;/关闭,写数据时再翻开 在开始按钮IDC_BtnStart的单击消息处理函数OnBtnStartO中翻开文件,即if(CFile:hFileNull=Bufferfile.m_hFile)BufferfiIe.OpenCDataBuffer,CFile:m(xleWrite); 在数据采集线程中,向文件中写入数据,如可将写数据操作放在定时器线程OnTinler()中,设数据文件中每一行数据结构为:时间“空格“速度“空格
40、电压“空格”“回车+换行”CStringstr;str.Fbrmat(%d%f%,m.nIndext=1OOO/m_nEdiiFreq,m_dbE 在保存按钮IDJBtnSave的单击消息处理函数OnBtnSaVe()中,将文件中的数据读出,存入到指定文件,即:Bufferfile.Open(DataBuffer.CFile:modeRead);unsignedintIen=BufferfiIe.GetLengthO;char*pBuf=newchar(len+l;Buffer11le.ReadHuge(pBuf.len);PBUfllen=0;Bufferfile.Close();CFiI
41、eDiaIogmeDlg(FALSE);应先将数据保存到临时文件中,减少数组对内存的使用.illeDlg.m-ofn.lpstrTi(le=当前数据保存为;fileDlg.m-ofn.lpstrFilter=DataFiles(*txO0*.txtU)AIIFiles(*.*)0*.*W;fileDlg.m-ofn.lpstrDefExt=txt;if(lDOK=fileDlg.DoModal()CFiIefile(fileDlg.GetFileName().CFile:modeCreateCRIeinnodeWrite);file.WriIeHUge(PBUfjen);将数据文件拷贝至目标目录并改名和扩展名file.CloseO;MessageBox(fileDlg.GetPahName(),”文件已保存为,MB_OKIMB_ICoNWARNING);)elsereturn;deletepBuf;8.7 控件动作直流电机测控系统的界面控件动作主要有采样频率的调整、控制电压的调整、串口选择以及图形显示和表盘显示,下面一一介绍。 采样频率。将IDC.EditFreq编辑控件关联成员变量UNITm_nEditFreq,范围I-1000;CEditm_Edi