摘要:为测量在油气井开发过程中所需要的压力数据,设计制作了一种以PIC16F87X单片机为核心的微型井下智能压力计。在设计中,采用I2C总线技术中器件地址的硬件接口设置,可同时挂接多个存储器到总线,解决了大容量数据快速存储的问题;利用FT245BL芯片,实现了USB和并行I/O口之间数据传输协议的自动转换。
1 系统整体设计方案
本系统分为井下仪器部分和地面软件处理部分,如图1所示。井下仪器部分主要有压力采集电路,并进行相应的处理,以完成信号电平调整,阻抗匹配等;在井下复杂环境中不利于数据的无线传输,需要把采集到的数据存储起来;地面软件部分,将数据送入计算机,利用PC机强大的数据处理功能进行数据分析。
2 数据传输存储模块
(1)系统的数据传输存储采用I2C总线标准。I2C总线是一种高性能芯片间串行同步传输总线,它仅需要两根信号线,就可实现完善的双工同步数据传送,能够极其方便地构成多机系统和外围器件扩展系统。本系统采用AT24C16存储压力数据,方法如下:AT24C系列E2PROM接口及地址选择。由于I2C总线可挂接多个串行接口器件,在I2C总线中每个器件应有唯一的器件地址,按I2C总线规则,器件地址为7位数据,它和1位数据方向位构成一个器件寻址字节,最低位D0为方向位(读/写)。器件寻址字节中的最高4位(D7~D4)为器件型号地址,不同的I2C总线接口器件的型号地址是厂家给定的,如AT24C系列E2PROM的型号地址皆为1010;器件地址中的低3位为引脚地址A2、A1、A0,对应器件寻址字节中的D3、D2、D1位,在硬件设计时由连接的引脚电平给定。
AT24C系列片内地址在接收到每—个数据字节地址后自动加1,故装载一页以内规定数据字节时,只须输入首地址,若装载字节多于规定的最多字节数,数据地址将自动翻页,新页中以前的数据将被覆盖。
(2)主控器与从接收器之间在总线上进行一次数据传输,称为“一帧”。按I2C总线规范的约定,一帧之内由启动信号、寻址字节、若干个数据字节、停止信号以及重启动信号组成。在传输数据开始前,主控器件应发送起始位,通知从接收器件作好接收准备;接着发送地址字节,当主控器收到从接收器件的应答位后发送第一个数据字节,从接收器收到数据后又返送一个应答信号,主控器收到应答位后发送第二个数据字节,如此循环反复;在传输数据结束时,主控器件发送停止位,通知从接收器件停止接收。每次传输的字节不受限制,每个字节必须有—个确认位(又称应答位ACK)。数据传送时都是高位在前。
3 USB通信模块
系统的USB通信模块完成PIC单片机与上位机设备的通信,从而将采集到的数据送到上位机进行处理。数据传送需要遵循相同的传输协议,如果单片机和上位机之间的传输协议不一样,就需要进行协议间的转换。
本文采用FT245BL芯片实现USB和并行I/O口之间的协议转换。一方面, FT245BL从主机接收USB数据,并将其转换为并行I/O口的数据流格式发送给外设;另一方面,外设通过并行I/O口将数据转换为USB的数据格式传回主机。中间的转换工作全部由芯片自动完成,开发者无须考虑固件的设计。采用FT245BL芯片,需事先安装虚拟串口VCP驱动程序(VirtualCOM Port),并且可以在这虚拟串口上进行应用程序的开发。该虚拟串口可以像一个标准的物理串口那样被访问,可本质上所有针对虚拟串口的数据通信都是通过USB总线完成的,在设备端则通过并行I/O口完成。
3.1 单片机端
在单片机设备端,接收数据时:首先,采样RXF#端上的信号,若为低,表明有接收到来自PC机的数据,允许单片机通过8位数据总线RD0~RD7读取数据;接着,通过信号由低到高的变化锁存数据(读入数据);最后,延迟一段时间,重新开始下一字节的读取。发送数据时,采样TXE#端上的信号,若为低,允许发送,将数据写入发送缓冲区,等待上位机接收。
3.2 上位机端
只需把与FT245BL相连的USB线接到计算机的USB接口。上位机软件的串口通信采用VisualC++6.0自带的串口通信类(MSComm类)来完成,MSComm类通过控件的形式来使用。
MSComm通信控件有两种处理事件的方式,分别为查询方式和事件驱动方式。本文采用事件驱动方式,在串口接收缓冲区中有字符时,利用MSComm控件的OnComm事件捕获并处理这些通信事件。这种方法的优点是程序响应及时、可靠性高。编写程序时,只要了解使用MSComm的属性和事件的用法就可以实现对串口的操作。
在当前应用程序中插入MSComm控件。本文新建一个MFC AppW izard工程项目,应用程序类型选择基本对话框,视图类基于CFormView。只需在CForm-View对应的对话框窗体插入MSComm控件,再在ClassW izard中为该控件声明一个变量即可。
下位机采集的数据及上位机发给下位机的指令都是通过串口进行传输的。上位机与下位机通过双方共同认可的协议进行通信,所以要进行串口初始化,使得串口参数设置匹配。串口初始化要完成以下几个设置:通信端口号、通信协议、传输速率、其他参数。两种方法可以对串口进行初始化:一是自己编写串口初始化函数,另一种是利用MSComm控件的属性对话框进行初始化。本文采用了自定义函数INItial-izeComPort()初始化其端口。
初始化主要程序代码片段如下(这里m_Com1是有效的MSComm对象):
InitializeComPort()
{
m_Com1. SetCommPort(3); //选择COM3
m_Com1. SetInBufferSize(512); //设置输入缓冲区的大小
m_Com1. SetOutBufferSize(512); //设置输出缓冲区的大小
if(!m_Com1.GetPortOpen()); //打开串口
m_Com1. SetPortOpen(TRUE);
m_Com1. SetInpuMt ode(1); //设置输入方式为二进制方式
m_Com1. SetSettings(“9600, n, 8, 1”); //设置数据传输速率、偶校验、数据比特、停止比特参数
m_Com1. SetRThreshold(1); //为1表示有一个字符引发一个事件
m_Com1. SetInputLen(0); //读取全部字符
}
上位机向下位机发送“读指令”,并将数据保存起来。该功能主要由两部分程序实现,一部分为发“读数据”指令程序,另一部分为串口接收数据程序。发“读数据”指令程序主要实现的功能是向下位机发送“读数据”指令,并提示数据传输的状态;串口接收数据程序实现的功能是根据命令类型变量,在发“读数据”指令时置的值,决定相应的操作,若命令类型为“读数据”,则从下位机接收压力数据,并保存。流程图见图2。
图2 发“读数据”指令流程图
4 结果与讨论
完成系统的硬件测试与软件调试之后,将下位机与上位机连接好,上位机串口设置和下位机串口设置匹配,便可以对整个系统所测量的结果进行观察。硬件电路将压力转化成相应的频率,程序采集频率数据,并转换成相应的压力数据。输出结果如图3所示,由图中可以看出,压力与频率成正比,实际给定的压力值与测量到的压力值几乎一致。