1、基于VC与单片机数据采集系统设计 接口实验报告一、实验目的及意义(1) 用微控制器实现对温度数据的采集;(2) 对采集数据进行控制与显示;(3) 将采集数据发送给PC机,学会用VC编写相应界面进行数据处理和显示;二、试验内容及方案论证在实际应用中,经常会遇到一些突发信号,需要对其进行高速采集,这种情况下采用高速的A/D自然成为首选。AD7862是AD公司推出的一个高速,低功耗,双12位的A/D转换,单+5V供电,功率为60mW。它包含两个4us的延时的ADC,两个锁存器,一个内部的+2.5V参考电压和一个高速并行输出端口。有四个模拟输入通道,分为两组,由A0选择。每一组通道有两个输入(VA1
2、& VA2 or VB1 & VB2),它们能同时的被采样和转化,保存相对的信号信息。它可以接受+10v的输入电压范围(AD7862-10),+2.5(AD7862-3)和0-2.5v(AD7862-2)。对模拟电压输入,具有过电保护功能,相对地,允许输入电压到达+17v,+7v,+7v,而不会造成损害,本实验选用AD7862-10。其具有以下主要特点:1、4通道模拟输入,2路同时转换(内置2个可同时工作的12位集成AD转换器);2、4us转换时间,250ksps采样速率;3、可选模拟量输入10V(AD7862-10);4、高速12位并行总线输出;5、内部提供+2.5V参考电压或者由外部提供参
3、考电压;;6、单一电源工作。本实验采用的微处理器是STC89C52RC单片机。STC89C52RC单片机使用方便,它与AT89S52单片机具有相同的内核,内部有256 Bytes片内RAM、8K Flash ROM,支持串口下载,易于在线编程调试,故采用这种单片机来做处理器。由于A/D的输出位数是12位,单片机的寄存器是8位的,所以要分成两次才能读得A/D转换的结果。本设计中,只需将单片机的两个IO口(P2、P0)分别与AD7862的DB0-DB11相连,即可完成数据采集基本硬件设计。本实验采用串口(RS232)将数据发送给PC机,波特率为9600、无校验;用VC 6.0编写相应的界面进行控制
4、与显示。实验电路的结构框图设计如下:微处理器STC89C52RCAD7862数据采集串口RS232PC机显示界面模拟信号输入( DC|AC )图1 数据采集系统结构框图如图,单片机控制AD进行数据采集,将采到的其中一路数据(共8字节)存入事先定义的数据缓冲区(共占8个字节),然后通过RS232串口发送到上位机,由PC进行相关数据处理,最后在界面上显示采集结果。本设计可以同时采集4路数据(AC|DC),并可以显示电压幅值与相关应波形。三、硬件设计单片机与PC机通过串口进行通信,软件程序的设计和硬件电路的连接都很简单。对于硬件来说,只需要把单片机的串口发送管脚TXD和接收管脚RXD经过232芯片的
5、电平转换通过DB9与PC机的I/O口直接相连就可以了。单片机串口为TTL电平,PC机串口为232电平,故需要电平转换电路。实验采用MAX232进行电平转换,转换的电路如图2所示:图2:RS232电平与TTL电平转换电路AD7862硬件设计如下。其中R5为0欧姆电阻0欧电阻相当于很窄的电流通路,能够有效地限制环路电流,使噪声得到抑制。电阻在所有频带上都有衰减作用(0欧电阻也有阻抗),这点比磁珠强。图3:AD7862硬件设计电路图四软件设计(1)上位机设计下位机的工作有两个方面,一个是控制AD7862采集VB1模拟通道,得到8字节数据(一个通道占2个字节),并保存到内部RAM单元;另一方面负责与上
6、位机(PC)通信,将保存的数据发送到PC,让上位机做处理。下面是上位机处理数据的核心算法部分代码:void CMSCommTestDlg:OnComm() / TODO: Add your control notification handler code here VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; int DataConut=0; BYTE rxdata2; /设置BYTE数组 用于接受数据 CString strtemp; if(ctrlComm.GetCommEvent()=2) /事件值为2表示接
7、受缓冲区内有字符 variant_inp=ctrlComm.GetInput(); /读缓冲区safearray_inp=variant_inp; /VARIANT型变量转换为COleSafeArray型len=safearray_inp.GetOneDimSize();/得到有效数据长度for(k=0;k=128) rxdata0=rxdata0-128;num =(float)(rxdata0*64+rxdata1); else rxdata1=rxdata1-128; num=(float)(rxdata1*64+rxdata0); /*/if(num2048)num=num*10/20
8、48; /AfxMessageBox(已得到正数!); else num=(num-4096)*10/2048; /AfxMessageBox(已得到负数!);value=num;savea=num; /保存数据到数组对后来以便求平均值和有效值/*绘制曲线*/CClientDC dc(this); CPen Line_pen(PS_SOLID,2,RGB(20,200,200);CPen *Old_pen;Old_pen=dc.SelectObject(&Line_pen); /将画笔选进设备描述表dc.MoveTo(b,int(-numb*10+141);/113dc.LineTo(b+8,
9、int(-num*10+141);dc.SelectObject(Old_pen);/*/if(a=49)for(count=0;count50;count+) /计算平均值并送上位机显示ave_val+=savecount;ave_val=ave_val/50; char cc10; /定义存储单元 _gcvt(ave_val,10,cc); /把浮点数转换成字符串m_avg=(LPCTSTR)cc; /CString 和 LPCTSTR 可以说通用for(count=0;count50;count+) /计算有效值并送上位机显示 /方均根/ene_val+=savecount*saveco
10、unt; ene_val=ene_val/50;ene_val=sqrt(ene_val); char dd10; _gcvt(ene_val,10,dd); /把浮点数转换成字符串 m_ene=(LPCTSTR)dd;UpdateData(FALSE); char ee10; _gcvt(value,10,ee); m_strEditRXData=(LPCTSTR)ee; UpdateData(FALSE);a+; b=b+8;if(a=50)a=0;b=50;CMSCommTestDlg:OnPaint(); PC读回的数据是十六进制数,要经过一系列的处理,才能得到最终的结果显示在界面上。
11、数据的处理过程比较繁琐,现只作一些简要的叙述。设计中,对AD7862D的VB1通道的采回的值进行处理,在下位机中设置一个数组将采集到的50次数据保存起来 然后将这些数据以每次两个字节的数据发送给上位机,在上位机中进一步要判断得到的转换数据对应的电压是正的或负的。若电压是正的,也就是说得到的数据小于2048,则处理公式如下:outa*LSB这里a为得到的数字量,out为显示的电压,LSB为AD最小分辨电压LSB=20/。若电压为负的,也就是说得到的数据大于等于2048,则处理公式如下:out(a-4096)*LSBAD7862的转换结果输出码是以二进制的补码表示的,当其输入电压为负时,数据处理的
12、方法可以采样上面的方法,而不必还原成原码。这种方法大大的简化了程序的编写工作,处理得到的结果和将其直接还原成原码的算法得到的结果完全是一样的。下图就是用VC制作的数据采集控制与显示界面:图4:数据采集上位机界面(2)下位机设计下位机软件设计的核心部分包括两个方面,即控制数据采集与RS232通信。控制数据采集主要依据AD7862工作时序来完成。下图就是AD7862的工作时序图。图5:数据采集工作时序图如图所示,CONVST、CS、RD、A0由单片机来控制,让AD采哪个通道、何时采集等;BUSY接入单片机的外部中引脚(以便能快速的接受数据),以确定AD转换是否完成。当CONVST下降沿一来,AD转
13、换开始,这时两个锁存器同时锁存两个通道的模拟量,在3.6us之后,转换完成(单片机的中断检测到BUSY由高为低,进入中断),AD7862的输出寄存器的数据是有效的,可以读取数据了。A0为0可以读A通道,为1可以读B通道。当/CS和/RD有效时,数据可从12位的并行数据总线上读出。读操作由一个/CS负脉冲和两个/RD负脉冲组成(当/CS有效时),获得两个12位的数据。RS232通信分为发送和接收两个功能,其中发送流程如下图:设置串口通信波特率为9600b/s串口初始化将一字节数据写入SUBF等待TI为1将TI清0返回100个字节传送完毕?NY图6:RS232通信发送功能流程图五、系统调试与误差分
14、析为将时间连续、幅值也连续的模拟量转换为时间离散、幅值也离散的数字信号,A/D转换一般要经过取样、保持、量化及编码4个过程。在实际电路中,这些过程有的是合并进行的,例如,取样和保持,量化和编码往往都是在转换过程中同时实现的。取样是将随时间连续变化的模拟量转换为时间离散的模拟量。通过分析可以看出,取样信号的频率愈高,所取得信号经低通滤波器后愈能真实地复现输入信号。合理的取样频率由取样定理确定。 取样定理:设取样信号的频率为fs,输入模拟信号的最高频率分量的频率为fimax,则fs与fimax必须满足fs大于等于2fimax的关系。一般取fs大于2fimax。 将取样电路每次取得的模拟信号转换为数
15、字信号都需要一定的时间,为了给后续的量化编码过程提供一个稳定值,每次取得的模拟信号必须通过保持电路保持一段时间。 在量化过程中,由于取样电压不一定能被量化单位整除,所以量化前后不可避免地存在误差,此误差称之为量化误差。量化误差属原理误差,它是无法消除的。A/D转换器的位数越多,各离散电平之间的差值越小,量化误差越小,分辨率也就越高。对AD7862来说,输出位数为12位,输入信号范围为-10V到+10V,那么AD7862能区分的输入信号的最小电压为:20V/40964.883 mV。所以其最大的转换误差为4.883 mV。故实验中得到的测量绝对误差应低于这个值。然而在实际的实验过程中,检测到的误
16、差要远大于这个值,一般为10-30mV的样子。产生误差的因素有很多:(1)电源。USB电源的纹波比较大,幅值不稳定。在芯片的电源接口部分应加上相应的滤波电容,以减小电源波动对芯片的干扰。(2)数据字地与模拟地。特别对于AD芯片,数字地一定要与模拟地隔开,实际中用的是0欧姆电阻,它可以相当于很窄的电流通路,能够有效地限制环路电流,使噪声得到抑制。电阻在所有频带上都有衰减作用。(3)干扰。单片机在传送数据的时候,由于外界干扰的存在可能会发送误码给上位机。此外上位机将得到的数据进行类型转换的时候也存在着误差,这给后来的曲线绘制带来了一些影响。另外要注意,加入的测试信号幅度不宜过大,正常范围为-10V
17、到+10V,最大范围为-17V到+17V,否则超过最大范围的话会烧坏AD7862芯片;所加交流信号的频率由于受采集速率的限制也要控制在一定的范围之内。此外由于上位机VC显示界面在低频时所画的曲线现实效果不明显,综合所得采集的交流信号最好在500HZ左右,这样在计算机上显示的波形就比较好。下面各图是分别对不同频率的信号进行数据采集结果:图7:刚上电时测得的(约1.42V)直流电压采集图图8:对22Hz正弦波信号进行采集图图9:对22Hz三角波信号进行采集图图10:对22Hz方波信号进行采集图图11:对222Hz正弦波信号进行采集图图12:对500Hz三角波信号进行采集图图13:对1.2KHz正弦
18、波信号进行采集图2六、实验小结及体会经过这次接口实验的设计体会不仅使我学到了更多的知识,同时也让我了解了自己做东西的一个基本程序。由于之前都没做过类似的东西,而且也只是在理论上掌握一点这方面相关的内容,所以我做接口实验的目的是通过这次很好的机会,也是一个挑战,因为很多都是自己以前没做过的,可以自己单独好好体验一下做个小系统的各个方面,有些东西只有亲手去才能真正体会到其中的弦妙之处。包括查资料、看时序、构思路、做板子等方面。在一次一次解决问题中使我养成了去思考和修改方案:如何才能达到预期的目标,如何让自己的想法得以实现。此外,在做接口实验中让我体会合作的重要性。之前也听导师跟我说一个优秀的团队的
19、作用,那时还没有能领会到。要知道一个人封闭起来单干是很不理智的做法,我们身边有很多可以利用的资源,人力资源最重要也最有效。一个小问题一个人苦心研究可能要花费许多时间,效率很低;如果及时与别人交流心得就可能在交流中产生思想的火花,别人的一两句无关紧要的话对于我可能就有很好的启发作用,这次试验中在积极参阅资料的同时不断与同学沟通从中学到了很多,同时也在帮助同学的过程中发现问题,不断补充自己的不足,这些都将为以后的做项目时积累宝贵的经验。总结一下这次接口实验我的方法是:首先自己摸索学习,遇到问题查找相关资料观看和有关的视频教程;然后从网上搜索相话题看看别人做的东西;最后问他人,身边有很多比我学得好的
20、人,有的硬件好,有的软件强。(这在我要说一下,由于以前没有学过vc+,在学习过程中遇到很多的问题,查阅的资料也比较乱,后来在同学的介绍和帮助下使我在串口这一块有了不小的收获。)我觉得我不会放弃这么好的有用的资源的。然后是与别人讨论,交流思路,看看我的设计思路方法是不是有不合理之处。此外,在别人需要帮助的时候,给予提醒和讲解,不断充实自己。七参考文献1郭天祥等.51单片机C语言教程入门、提高、开发、拓展全攻略. 电子工业出版社,2008.2何立民.单片机应用系统设计.北京:北京航空航天大学出版社,2004.3张洪润等.单片机应用设计200例.北京:北京航空航天大学出版社,2006.4孙余凯等.电子元器件检测选用代换手册.电子工业出版社,2007.5谭思良等.Visual C串口通信工程开发实例导航M.北京.人民邮电出版社.20036兰吉昌等,单片机C 51完全学习守册. 北京:化学工业出版社,20087李朝青,PC机及单片机数据通信技术. 北京:北京航空航天大学出版社,20008求是科技,Visual C+ Visual Basic串并口开发技术工程应用实例导航. 北京:人民邮电出版社,20069龚建伟,熊光明等.Visual C/TurboC串口通信编程实践.北京:电子工业出版社,2004