基于单片机的井径测量系统软件设计
2015-09-16杨晨娜
杨晨娜
摘 要: 针对传统油井测量仪器体积大、价格贵等问题,设计了一种新型高效的智能三臂测井仪器。该测井仪器将传统的仪器做成以SPCE061A单片机为核心的嵌入式系统,其集成度高,大部分功能用软件实现,包括测量、计算、结果校正、显示、仪器量程自动校正和存储、语音提示、报警等模块。实验证明,该系统能够稳定工作,可靠性高,测量精度可达2%,能够满足实际油井直径测试要求。
关键词: SPCE061A; 软件设计; 测量精度; 自动校正
中图分类号: TN702?34 文献标识码: A 文章编号: 1004?373X(2015)18?0053?04
Abstract: To solve the problems of large volume and high cost of traditional oil well measuring instruments, a new?type intelligent three?arm logging instrument with high efficiency was designed. Instead of the traditional instruments, the embedded system with high integration density based on SPCE061A was implemented, whose most of functions can be realized with software, including measurement, calculation, result calibration, display, automatic correction/storage of instrument range, voice prompt and alarm modules. The experiment results show that the system has better stability and reliability, and its measuring accuracy can reach 2%, so it can meet the requirements of actual test of oil well diameter.
Keywords: SPCE061A; software design; measurement accuracy; automatic calibration
目前,我国油井直径测量需求量大,井径测量仪作为采油设备工具之一,随着科学技术的快速发展不断的更新,但普遍存在着体积大、价格贵、灵活性低等缺点。基于这种现象,本文设计了一种基于凌阳单片机的智能井径测量系统,其集成度高、测量误差小、操作简单、便于携带,具有很高的实用价值。
1 系统总体方案设计
系统功能的实现建立在硬件基础之上,但也离不开质量较好的软件设计,只有硬件和软件无缝连接,所设计出的系统性能稳定,具有较高的可靠性及使用性。在对仪器使用状况充分了解的基础上,设计了以单片机为核心的硬件电路。功能框图及硬件原理图如图1所示。但是在测量系统中,不能只靠硬件来实现,功能强大的软件是驱动硬件不可或缺的。一个好的软件大大简化了硬件的设计,软硬件必须两者紧密结合起来。既要看到硬件的效率高、又要发挥软件功能强的特点。
2 井径测量仪软件实现
本井经测量软件主要由6部分组成:测量、滤波、标度变换、存储、显示、报警、LED指示和校正。井径测量软件是一个包含键盘操作、LED显示和主板控制存储的小型操作系统。它用汇编语言和C语言联合编写而成。汇编和C语言相结合,既显现出了汇编语言的精炼,又不失C语言的简练。本程序合理安排汇编和C的比例,使程序精炼而高效。
2.1 主程序模块
程序采用模块化设计。主程序模块是整个程序的核心,其流程如图2所示。进入系统后,首先对仪器的标准点进行设置,然后对系统进行初始化。接着采用永为真的while语句进行不断循环扫描,进行数据采集以及标度变换工作。在循环中,先对键盘进行初始化操作,之后进行键盘扫描,直到有一个键按下,并读取键值,若再有一键按下,则进入系统矫正程序,当有第三键按下时进行FLASH擦除工作。接着进入A/D转换程序,对采样的4组数据进行A/D转换后,进行求平均值,所得结果作为最后采样数据。接着对采样数据进行判断,其值是否处于有效范围之内,若结果小于最小值,则显示LLL,当结果大于最大值时,则显示HHH并进行报警,之后才进行标度变换。
具体程序如下:
#include "hardware.h" //定义头文件
#include "math.h"
int main() //主函数
{
int i;
unsigned long int AD_result;
//定义变量存储A/D转换的结果
unsigned long int AD_resultall;
//定义变量存储A/D转换的结果值
F_FlashErase(0xbf00); //初始化存储效正值的FLASH段
F_FlashWrite1Word(0xbf00,0); //将A/D转换结果存入FLASH中 F_FlashWrite1Word(0xbf01,250);
F_FlashWrite1Word(0xbf02,500);
F_FlashWrite1Word(0xbf03,750);
F_FlashWrite1Word(0xbf04,1000);
Initial(); //程序初始化
//A/D转换&误差效正 //
while(1)
{
key_Initial(); //键盘初始化
uiKeyValue=F_GetKeyValue(); //得到键值
if ((uiKeyValue==0x0002)|(uiKeyValue==0x0003))
tiaozheng(); //如果为2键或1、2同时键进入调整程序
if ((uiKeyValue==0x0004)|(uiKeyValue==0x0005))
{
Flash_erase();Flash_enpty=0;}
//初始化FLASH存储器
AD_resultall=0; //A/D转换累加器清0
AD_average=0; //A/D转换平均值清0
system_off(); //关闭系统中断
for(i=1;i<=4;i++) //进行4次转换
{
AD_result=AD_converter(); //返回一次A/D转换的结果
AD_resultall=AD_resultall+AD_result; //求A/D总值
}
system_on();
AD_average=AD_resultall/4; //进行4次转换求平均值
//标度变换 //
if (AD_averagehhh)
{
shiwei=0x000b;
gewei=0x000b;
xshdhyw=0x000b;
xshdhew=0x000b;
}
else
{
DATA_result=DATA_converte(AD_average);
//对A/D转换结果进行标度变换
alarm();
DATA_result*=100; //对结果乘100
shiwei=DATA_result/1000; //取出结果的十位
gewei=fmodf(DATA_result,1000)/100; //取出结果的个位
xshdhyw=fmodf(DATA_result,100)/10;
//取出结果的小数点后1位
xshdhew=fmodf(DATA_result,10);
//取出结果的小数点后2位
}
}
} //结束while循环
}
2.2 A/D转换模块及其误差校正
A/D转换模块是整个程序数据的入口,如图3所示,其关系着测量的速度和精度。为了提高精度和减少函数数量便与传递参数,误差校正模块嵌入在主程序中,而A/D转换函数则用汇编语言编写,函数无入口参数,返回值为A/D转换的10位2进制结果。
如图4所示,进入误差校正程序后,首先对标志变量清0,调用A/D转换函数,并将A/D转换的结果累加,判断4次转换是否结束,未结束则继续进行转换,结束后求出平均值存入全局变量AD_average中。
在A/D转换函数中,首先选择模拟量输入通道为LINEIN IOA0 ,允许A/D转换,延时后查询A/D转换标志,判断A/D转换是否结束,未结束继续转换,结束后将结果左移6位,然后返回给调用函数。
2.3 标度变换模块
量程校正模块是一个结构简单的模块,它主要完成复杂的4次牛顿插值计算,所以它用C语言编写,代码精炼简单,如图5所示。
2.4 系统初始化模块
系统初始化模块是对系统运行前各个参数的设置,如图6所示,包括I/O口的初始化,系统时基的初始化,中断初始化等,其中时基选择为32 Hz,中断为IRQ5?2 Hz用于存储数据计时,IRQ6?32 Hz用于LED动态显示中断。32 Hz频率适中,使LED即能达到亮度,又不回闪烁,显示稳定。RAM校正表的缓存作为一个程序在这里被调用, 这段程序首先从FLASH ROM中读出参考的校正数据,然后根据计算生成4次牛顿插值表,并将表存入RAM等候被调用。
2.5 LED显示模块
LED显示是人机交互最直观的部分,要让他即能及时显示,又能不受其他程序的影响,所以LED显示被放在32 Hz中断中被调用,当每次进入中断时首先就是进行压栈保护,然后取出入口参数,入口参数为4位要显示的数字如:23.87,入口参数就为2,3,8,7。然后初始化了位选标志位寄存器,接着进入相应位的显示程序,在那里查表,找到LED位选和段选的编码送IOB口显示,延时显示完1位后就给位标志位加1显示下1位,当位选标志为5时表示一轮显示完毕,即出栈后退出中断程序,如图7所示。
2.6 存储程序模块
存储程序模块包括2部分,一部分为FLASH ROM初始化即擦除程序,另一部分为FLASH写子程序,如图8所示。FLASH擦除时每次可擦256 B,当给FLASH中存储数据时必须先擦除才可写入。所以专门设立FLASH擦除键,用于手动控制FLASH的初始化。FLASH写子程序被0.5 Hz的中断调用,用于定时存储数据,便于日后分析,它将A/D转换的结果存在以c000开始的FLASH中,每存1次给地址指针加1。
2.7 系统校正程序模块
系统校正程序标志本井径测量仪进入了智能仪器的行列,它之所以被称为智能是因为它可以根据需要和实际情况自动的调整量程,同时亦是对系统误差的校正,如图9所示。它的原理是人为地输入5个标准点,测量仪记录下这5个标准点,并通过4次插牛顿值公式生成校正表,等下次测量时就可以根据这5个标准点和校正表对测量值进行标度变换,程序具体流程如下所述,进入系统校正程序后,首先点亮校正模式指示灯,然后系统关中断,将存储校正值的FLASH初始化,语音提示:“进入系统校正模式”提示用户做好相应的校正准备;程序进入一个5次循环,即设置5个标准点,程序提示开始校正第一点,请用户把标准值放在第一点上,紧接着程序不断进行键盘扫描等候用户按确定键确认输入的标准量程;当有键按下时系统进行4次A/D转换,并通过求平均值法消除随即误差,并将标准值存入内存指定单元,程序接着进入第二轮循环,并提示进行校正第二点,这样当进行完5次校正后,系统会把校正值存入指定的FLASH ROM单元中,调用生成校正表程序,提示:“系统校正完毕”,指示灯灭;系统恢复现场并继续进行测量,此后测量的结果都是通过新生成的校正表,插值校正等计算而成,精确度提高误差减小。
2.8 其他模块
(1) 报警程序模块:报警程序被放在标度变化后被调用,判断变化结果是否低于报警值,不低于时退出不做任何操作;若小于设定报警值立刻进行语音报警,并驱动相应报警灯闪烁。它是仪器智能化的一个重要部分。
(2) LED指示程序模块:LED指示模块,作为一个独立的模块,需要LED指示的程序调用,它的入口参数为要显示的相应灯16进制编码,由于其在IOA的高8位输出,又不影响IOA口原来的状态,所以要将数据左移8位,然后和IOA口原来的数据相异或,在送给IOA口显示这样就点亮了相应的指示灯。这段程序用汇编语言编写恰到好处,代码精炼,运行速度快。
(3) 语音播放程序模块:语音播放是SPCE061A单片机的特色功能,在这里增加语音提示功能,可以使人机交互更加方便,生动。它的入口参数为被播放的语音段编码,语言播放很简单,这里采用凌阳压缩算法S480,它有较高的压缩率和较清晰的音质,作为语音提示是个理想的选择。由于SPCE公司已经做好了语音播放函数库,这里只需要进行语言播放初始化和提供相应播放参数就可进行播放;不过每次提示音播放完毕后都要对系统的时钟和中断复位,使系统能够正常运行。
3 结 语
本井径测量仪所实现的功能为:量程范围为7~15 inch,即17~38 cm;测量仪上电时会立即进入测量模式,从3位LED上显示输出测量值,测量的结果会自动存储,同时存储指示灯会闪烁,仪器放入井中后会进行实时的测量;当测量值小于报警值时,仪器报警指示灯会闪烁,并有语音报警提示;仪器若卡在井中,会自动发出声光报警,可以根据实际给定的标准值进行自动校正。
参考文献
[1] 赵茂泰.智能仪器原理及应用[M].北京:电子工业出版社,2009.
[2] 杨秀萍,刘嵩岩.小型化油井综合测试系统设计[J].哈尔滨商业大学学报:自然科学版,2008(3):344?346.
[3] 侯媛彬.凌阳单片机原理及其开发[M].北京:科学出版社,2012.
[4] 陈言俊.凌阳16位单片机应用[M].北京:北京航空航天大学出版社,2009.
[5] 任卫军.凌阳十六位单片机原理及应用[M].西安:西安电子科技大学出版社,2011.
[6] 谭浩强.C程序设计教程[M].北京:清华大学出版社,2013.