当前位置:文档之家› 基于PC的检测系统最后

基于PC的检测系统最后

基于PC机测控系统课程设计说明书

基于研华1712数据采集卡的位移测量系统

学院机械工程学院

班级

学生姓名

学号

指导老师

2015年1月13日

目录

1.设计目的 (3)

2.设计内容 (3)

3.设计要求 (3)

4.方案说明 (3)

5.硬件设计系统 (3)

5.1数据采集卡 (3)

5.2电阻式位移传感器 (4)

6.软件系统设计 (4)

6.1程序调试 (4)

6.2标定 (9)

7.设计结果 (31)

8.程序流程图 (32)

9.设计体会 (33)

10.参考文献 (34)

基于研华1712数据采集卡的位移测量系统

1.设计目的

了解并学习研华1710采集卡的使用,学会使用C语言编程,锻炼大家对采集卡的实践认知,并让大家了解虚拟信号采集的基本过程。

2.设计内容

系统由PC机、研华1710采集卡、位移传感器组成。用VC编写一个测试软件,实现对位移数据的采集、处理和显示。

3.设计要求

(1)硬件设计:数据采集系统结构图;元件选型说明;原理说明

(2)软件设计:软件主流程图;程序。

(3)系统调试

(4)系统标定

4.方案说明

我们设计的系统主要由位移传感器,1712采集卡,PC机组成。传感器采集模拟信号经过采集卡处理转换成数字信号,再经过测试软件的处理,得到电压和测得的位移。

5.硬件设计系统

5.1数据采集卡

PCI-1712是一款PCI总线的多功能数据采集卡。其先进的电路设计使得它具有更高的质量和更多的功能。这其中包含五种最常用的测量和控制功能:12位A/D转换、D/A转换、数字量输入、数字量输出及计数器/定时器功能。

PCI-1712有一个自动通道/增益扫描电路。该电路能代替软件控制采样期间多路开关的切换。卡上的SRAM存储了每个通道不同的增益值及配置。这种设计

能让您对不同通道使用不同增益,并自由组合单端和差分输入来完成多通道的高速采样。

5.2电阻式位移传感器

位移传感器又称为线性传感器,是一种属于金属感应的线性器件,传感器的作用是把各种被测物理量转换为电量。

它通过电位器元件将机械位移转换成与之成线性或任意函数关系的电阻或电压输出。为实现测量位移目的而设计的电位器,要求在位移变化和电阻变化之间有一个确定关系。位移传感器的可动电刷与被测物体接触。物体的位移引起电位器移动端的电阻变化。阻值的变化量反映了位移的量值,阻值的增加还是减小则表明了位移的方向。通常在电位器上通以电源电压,以把电阻变化转换为电压输出。

实验所用位移传感器实物图如下图所示:

图1 电阻式位移传感器

电阻式位移传感器原理图如下图:

图2 电阻式位移传感器原理图图3 电阻式位移传感器原理图

6.软件系统设计

6.1程序调试

1、对话框

void CChildView::OnTransform()

{

// TODO: Add your command handler code here

CTranFrom* pDlg=new CTranFrom(this);

//转换位移记忆功能,将数据回写,就是下一次打开对话框,前一次数据还存在在对话框中

pDlg->m_k=m_k;

pDlg->m_b=m_b;

pDlg->High=High;

pDlg->Low=Low;

if(pDlg->DoModal() == IDOK)

//当dlg.DoModal()后,显示一个模态对话框,此时DoModal()函数并不返回,

//直到用户关闭此对话框时,DoModal才返回。如果用户点击了确定按钮,

//那么DoModal()函数就返回IDOK。IDOK是一个宏

{

m_k=pDlg->m_k;

m_b=pDlg->m_b;

High=pDlg->High;

Low=pDlg->Low;

}

delete pDlg;

}

效果图:

图4 效果图

2、主窗口界面程序

void CChildView::OnPaint()

{

RECT rect;

float temperature = m_k * m_fVoltage+m_b;

CPaintDC dc(this); // device context for painting

//this是指当前窗体对象,dc用带有this指针的构造函数进行构造,是指当前窗口的dc。

//用了this指针初始化后,你操作的dc就是当前窗体,也即当前窗体就是你的画布!

//每个类都有一个默认指针this指向自己。

//字体函数

CFont font;

font.CreateFont(-40, //字体字符的逻辑高度

0, //字符的平均宽度取默认值

0, //文本行角度为0,水平

0, //字符角度为0,正立

FW_NORMAL, //正常字体

FALSE, //不倾斜

FALSE, //不加下划线

FALSE, //不加删除线

ANSI_CHARSET,

OUT_DEFAULT_PRECIS,

CLIP_DEFAULT_PRECIS,

DEFAULT_QUALITY,

DEFAULT_PITCH|FF_MODERN,

"Times New Roman");

// TODO: Add your message handler code here

GetClientRect(&rect);

int x=rect.right,y=rect.bottom;

if(m_bRun)

{

CBrush brush(RGB(220,220,220)); //窗口背景色

dc.FillRect(&rect,&brush);

GetClientRect(&rect); //获取窗口大小

CFont *oldFont=dc.SelectObject(&font);//选择字体

dc.SetBkColor(RGB(220,220,220)); //字体背景色

dc.SetTextColor(RGB(150, 50, 150)); //文字颜色

dc.SetTextAlign(TA_CENTER); //文字位置,居中

dc.TextOut(x/2,y/3, Statement); //显示"基于研华1712数据采集卡的位移测量系统"

dc.TextOut(x/2,y/2, Team_Menber); //显示"小组成员:宋强,张梅,周子健,左嘉伟"

dc.SelectObject(oldFont); //字体使用

}

if(!m_bRun)

{

dc.SetBkColor(RGB(236,196,209)); //文字背景

CBrush brush(RGB(230,230,230)); //窗口背景

dc.FillRect(&rect,&brush);

GetClientRect(&rect); //获取窗口大小

sprintf(m_szBuffer, "报警位移上限 = %10.6f mm", High);

dc.DrawText(m_szBuffer,CRect(0,2*y/3,2*x/3,y), DT_CENTER );

//显示位置报警位移上限

sprintf(m_szBuffer, "报警位移下限 = %10.6f mm", Low);

dc.DrawText(m_szBuffer,CRect(0,2*y/3+y/8,2*x/3,y), DT_CENTER );

dc.TextOut(5*x/8,y/8,"位移测量范围为-5~5mm");

dc.TextOut(15*x/24,2*y/9,"5mm");

dc.TextOut(15*x/24,7*y/8,"-5mm");

dc.TextOut(15*x/24,5*y/9," 0mm");

CRect rect(2*x/3,y/4,3*x/4,7*y/8);

CBrush brush1(RGB(236,196,209));

//位移计颜色

dc.FillRect(&rect,&brush1);

GetClientRect(&rect); //获取窗口大小

CFont *oldFont=dc.SelectObject(&font);

//选择字体

if (m_bTimerOverrun == FALSE)

{

sprintf(m_szBuffer, "采集电压 = %10.6f V", m_fVoltage);

dc.DrawText(m_szBuffer,CRect(0,y/5,2*x/3,y), DT_CENTER );

sprintf(m_szBuffer, "实际位移 = %10.6f mm", temperature);

dc.DrawText(m_szBuffer,CRect(0,y/3,2*x/3,y), DT_CENTER );

if(temperature > High) //位移超过设定的上限

{

dc.SetTextColor(RGB(255, 0, 0)); //报警红色

dc.DrawText("超过位移上限!",CRect(0,y/2,2*x/3,y), DT_CENTER);

CBrush brush(RGB(255,0,0));

if(temperature <= 5) //超过上限,进度条不会越界

{

CRect

rect(2*x/3,(y/4+(1-(temperature+5)/10.0)*5*y/8),3*x/4,7*y/8);

dc.FillRect(&rect,&brush);

}

else

{

CRect rect(2*x/3,y/4,3*x/4,7*y/8);

dc.FillRect(&rect,&brush);

}

else if(temperature < Low) //位移超过报警下限{

if(temperature>=0)

{

dc.SetTextColor(RGB(0, 0, 255)); //报警蓝色

dc.DrawText("低于位移下限!",CRect(0,y/2,2*x/3,y), DT_CENTER);

CBrush brush(RGB(0,0,255));

CRect

rect(2*x/3,(y/4+(1-(temperature+5)/10.0)*5*y/8),3*x/4,7*y/8);

dc.FillRect(&rect,&brush);

}

else //超过下限,进度条不会越界

{

dc.SetTextColor(RGB(0, 0, 255));

dc.DrawText("低于位移下限!",CRect(0,y/2,2*x/3,y), DT_CENTER);

CBrush brush(RGB(0,0,255));

if(temperature>=-5)

{

CRect

rect(2*x/3,(y/4+(1-(temperature+5)/10.0)*5*y/8),3*x/4,7*y/8);

dc.FillRect(&rect,&brush);

}

else

{

CRect rect(2*x/3,(y/4+5*y/8),3*x/4,7*y/8);

dc.FillRect(&rect,&brush);

}

}

}

else //位移在正常范围内

{

dc.SetTextColor(RGB(81,220,15)) //显示绿色

dc.DrawText("位移正常!",CRect(0,y/2,2*x/3,y), DT_CENTER);

CBrush brush(RGB(81,220,15));

CRect rect(2*x/3,(y/4+(1-(temperature+5)/10.0)*5*y/8),3*x/4,7*y/8);

dc.FillRect(&rect,&brush);

}

}

// DT_SINGLELINE :单行显示DT_CENTER :居中显示DT_VCENTER:垂直居中显示

else

sprintf(m_szBuffer, "Timer Overrun! data = %10.6f", m_fVoltage);

dc.SelectObject(oldFont);

}

// Do not call CWnd::OnPaint() for painting messages

}

人机界面效果图:

开机界面:

图5 开机界面

用户界面:

图6 用户界面

6.2标定

可将螺旋测微器测量(千分尺)所测得值与位移测量系统所得值进行比对。

图7 比对图

1.螺旋测微器简介

螺旋测微器又叫千分尺,是比游标卡尺更精密的测量长度的工具,用它测长度可以准确到0.01mm,测量范围为几个厘米。

螺旋测微器是依据螺旋放大的原理制成的,即螺杆在螺母中旋转一周,螺杆便沿着旋转轴线方向前进或后退一个螺距的距离。因此,沿轴线方向移动的微小

距离,就能用圆周上的读数表示出来。

图8 螺旋测微器

2.标定

首先利用螺旋测微器确定一个位移数值记为Y,从人机界面上读出电压值

记为X,即得到一组数据(X,Y)。

改变Y值测N次X值得到N组数据(Xn,Yn)如下:

图9 数据处理

3.计算电压、位移转换的线性方程K、B,并得到方程F(X)表达式。

通过6中的数据计算可得线性方程的K=-34.051, B=20.106则有标定公式:

Y=-34.051X+20.106。

4.检验标定公式是否合理

我们将K ,B 值输入到测量系统中,那么一个测量位移的数学模型就已经完成。

理论上数据采集卡通道可以读出任意位移大小,我们现在任意给定位移大小,观察人机界面读得一个测量值Y1,并于螺旋测微器所读实际值Y10比较,看是否在误差允许范围内。

7.设计结果

图10 数据处理

图11 拟合曲线

通过6中的数据计算可得线性方程的K=-34.051, B=20.106则有标定公式:

Y=-34.051X+20.106。

8.程序流程图

图12 流程图

开始,初始化

定义通道,菜单栏各项ID ,并与变量一一对应

扫描Setting ,Scan 各变量值是否有变化

m_lDriverHandle ——设备句柄,代表数据采集卡在计算机中分配到的地址 m_bRun ——布尔量,对应菜单栏中启动选项 m_usChannel ——对应数据采集卡的输入通道,设为0

m_usScanTime ——对应菜单栏中设置的扫描时间,初始化为1000

PT_AIV oltageIn ——结构体数据类型,包含输入电压的通道号、输入值、内触发方式 PT_DioWriteBit ——结构体数据类型,包含输出数据的通道号,位号,输出状态 CSettingDlg ——类数据,包含菜单栏中Setting 对话框的全部内容

CScanDlg ——类数据,与CSettingDlg 类似,包含菜单菜单栏中Scan 对话框全部内容 Ctransform ——类数据,包含菜单栏中Transform 对话框全部内容

m_fV oltage ——对应数据采集卡所采集到的电压值,是PT_AIV oltageIn 的一个成员 m_high ——浮点数据类型,对应Setting 中设置的位移上限,初始化为0 m_low ——浮点数据类型,对应Setting 中设置的位移下限,初始化为0

m_k ——浮点数据类型,对应Setting 中标定的电压/温度曲线的斜率,初始化为0 m_b ——浮点数据类型,对应Setting 中电压/温度曲线的截距,初始化为0

数据交换

根据设备句柄建立与

设备的连接

打开通道

连接是否成功

通道不正常:Device open error !

句柄不正确:Invalid driver handle failed!

弹出对话框Transform ,进行参数设置,输入完毕

参数保存,按照所选择的扫描时间,触发方式进行数据采集

是否确定开始运行系统,m_bRun=1?

显示采集电压,并根据设置k 和b 计算出位移值

将实时位移与设置位移范围比较,是否超出范围?

报警:改变显示字体颜色与图形显示状态

按照设定输出通道号,位号将预定状态输出

报警完毕,恢复上一步状态,继续进行判断

采样过程中,判断是否按下stop?

Y

N

Y

Y

N

Y

9.设计体会

为期一周的测量系统课题设计终于落下帷幕了,经过这一周的辛苦努力,终于完成了我们的测量系统设计--基于研华1712数据采集卡的位移测量系统设计。因为以前只是习惯听老师讲解,只知道研究书上的内容动手很少,对做这种具体设计经验不足,所以刚开始有点不知所措。但我们没有放弃这次难得的动手机会,通过查阅相关资料,脑海中形成粗略的思路,然后把程序框图大致确定,经过不断地仿真调试确定其可行性。

在动手操作的过程中,增强了实践动手能力,更增加了我以后动手操作的信心,通过对位移测量系统的设计,在后期调试过程中,在结合实验现象和结果分析,我掌握了位移传感器基本使用方法,采集卡的基本接线的知识。

通过本课题的设计,我还深刻认识到了“理论联系实际”的这句话的重要性与真实性。而且通过对此课程的设计,我不但知道了以前不知道的理论知识,而且也巩固了以前知道的知识。最重要的是在实践中理解了书本上的知识,明白了学以致用的真谛。也明白老师为什么要求我们做好这个课程设计的原因。他是为了教会我们如何运用所学的知识去解决实际的问题,提高我们的动手能力。在整个程序调试过程中,我个人感觉调试部分是最难的,因为你理论计算的值在实际当中并不一定是最佳参数,我们必须通过观察效果来改变参数的数值以期达到最好。而参数的调试是一个经验的积累过程,没有经验是不可能在短时间内将其完成的,而这个可能也是老师要求我们加以提高的一个重要方面吧!

非常感谢老师的指导,在这个过程中我也明白了我们遇到问题应该通过各种努力去解决它,而不是任其发展,不管不顾,做学问就要有这种不怕阻碍不怕困难的勇气和韧性。在实验过程中,我遇到了不少的问题。编写存储数据的函数是不知道数据类型有什么格式。在老师和同学的帮助下,把问题一一解决,那种心情别提有多高兴啦。实验中暴露出我们在理论学习中所存在的问题,有些理论知识还处于懵懂状态,同学们不厌其烦地为我们讲解知识点,实在令我感动。

感谢学校给我们提供了这次宝贵的动手实践机会,通过动手操作,我们学到了许多书本上没有的知识,而且更加巩固了所学知识,真正做到了所学即所用。

10.参考文献

1.研华1710或1712或NIUSB6008DAQ卡使用说明书

2. 温度或位移或编码器等传感器技术参数;

3. 温度传感器AD590技术参数;

4. LabVIEW程序设计从入门到精通;

5. VC++程序设计指南;

相关主题
文本预览
相关文档 最新文档