随着我国工业发展,水污染问题日益突出,对水质进行监测越来越重要。2000年我国自主生产的“长江水环检测2000”[1],因其检测船造价昂贵,难以在全国推广。电子技术的发展,使得以更微型、更廉价的方式制造出类似“长江2000”监测船功能的在线水质监测平台成为可能。因此,本文提出了以德州仪器2012年最新发布的以低功耗且价格敏感的工业用芯片AM3359为核心处理器的移动在线水质监测平台。该平台可以实现水域中的任意移动、平台的经纬度实时监测、水样本的自动获取及各项水质指标的检测、图像数据及被检水质数据的无线传输。平台配备了柔性太阳能电池板、12 V蓄电池以及相应的电源控制电路,可实现蓄电池的自动充电。
1 系统构成
整个系统主要由移动平台和监控中心两部分组成。监控中心主要由基于PC机的上位机软件和算法组成。移动平台包括核心处理器、电源模块以及各种功能模块。核心处理器采用AM3359低功耗芯片,它是一款基于Cortex-A8内核的高性能低价格(约5美元一片)工业型芯片,具有720 MHz的主频,采用32 bit RISC精简指令,具有12 bit高精度ADC、3路增强型的PWM通道、SGX530图像引擎,支持ddr2和ddr3内存,支持最新的Linux和Wince操作系统,功耗低至7 mW。功能模块包括水质测量模块、图像采集模块、电源模块、电机控制模块、GPS定位模块、GPRS无线传输模块、电子罗盘方向导航模块、超声波测障模块。
水质监测平台系统构成图如图1所示。
2 硬件设计
在图1中,电子罗盘模块采用霍尼韦尔公司推出的3轴数字罗盘HMC5883;GPS模块和GPRS模块采用SIMCom公司最新推出的sim908模块,该模块把GPS和GPRS集成到一起,由AT指令控制;水质采样模块使用2个小型水泵,通过I/O口控制继电器实现水泵的抽水和排水;太阳能充电模块采用CN3063太阳能充电管理芯片。这些模块在应用时十分简单,本文不详细阐述。本文将重点介绍运动控制模块的改进和基于Linux操作系统的图像采集与传输。
2.1 运动控制模块设计
本设计选用无刷直流电机作为运动控制模块的核心部件,选用IR21365和GIB10B60KD1构成无刷电机的驱动电路。无刷电机由于没有电刷,寿命比有刷电机提高了6倍,同时还具有结构简单、性能可靠、永无磨损、空载电流小、过载能力大等优点[2-3]。运动控制模块结构框图如图2所示。
2.2 硬件逻辑防短路电路设计
软件逻辑上的错误可能导致与电机某相连接的上下两只IGBT管同时导通,使电路出现短路[4],引起电流过大而烧坏IGBT管。对此,本文通过“与非门”搭建一个电路,使得当与上下两只IGBT管栅极相连的PWM波引脚都为高电平时,与电机相连的相不导通。由于电机三相存在对称性,这里仅取电机的A相来分析硬件上如何防止上下两只IGBT管同时导通,其原理图如图3所示。
由于IR2136S只是增强信号的驱动能力,不改变信号逻辑上的值,因此从逻辑上说Q1′和Q1、Q2′和Q2是一样的。根据本文的设计,当Q1′、Q2′为低电平时,相应的IGBT管为导通状态,其真值表如表1所示。
由表1可知,当由于软件误操作导致PWM1和PWM2同时高电平或者同时低电平时,与之相连的两个IGBT管都是截止状态,防止了短路的发生,从硬件上有效地保护了电机。
2.3 图像采集模块
本文采用OV7620 COMS摄像头,其分辨率达到640×480,支持 RGB和YUV图像数据格式。5 V电源供电,工作时功耗<120 mW,待机时功耗<10 μW[5]。该模块与微处理器的连接框图如图4所示。
OV7620的控制符合SCCB(Serial Camera Control Bus)协议,它是一种简化了的I2C协议,本文采用I/O模拟SCCB总线的方式来控制OV7620。编写一个I2CSendByte()函数来写寄存,该函数的第一个参数为OV7620的芯片地址0x42,第二个参数为片内寄存器地址,第三个参数为相应寄存器的设定值。本文设置OV7620为连续扫描、RGB原始数据16位方式输出。用如下的函数可以完成设置:
Void Camera_Setup()
{
I2CSendByte(0x42,0x12,0x2d);
I2CSendByte(0x42,0x13,0x01);
I2CSendByte(0x42,0x28,0x20);
I2CSendByte(0x42,0x20,0x02);
}
处理器把OV7620采集到的RGB格式的图像数据压缩成JPEG格式并存储于SD卡中,当收到相应命令时,通过GPRS无线模块把图像发送给监控中心。
3 系统软件设计
3.1 操作系统
本文采用具有可靠性高、源代码开放等优点的Linux操作系统。在为系统移植Linux操作系统之后,将为OV7620添加驱动程序。
整个系统流程为:系统开机后进行初始化并创建各个任务,任务创建成功后系统检测GPRS缓冲区中的数据并判断是自主导航还是手动导航。如果是手动导航,则系统直接接收远程遥控到目的地采集水样;如果是自动导航,则系统通过GPS获取目标位置和当前位置并计算运动路线。运动过程中通过超声波不断探测前方是否有障碍物,如果有障碍则系统进行避障运动。避障后系统重新确定运动路线和运动方向。当系统到达指定位置时便开始水质采样和分析以及水质的影像采集。最后数据通过无线模块传输回监控中心。这样就完成了一次水质采样。
3.2 驱动程序的编写
摄像头设备属于字符设备,它能够像字节流一样被访问,并且只能够顺序读写[6]。添加一个设备驱动程序的标准流程如图5所示。
当调用驱动程序时,操作系统会自动调用module_
init()函数;退出驱动程序时,操作系统会自动调用module_exit()函数以释放系统资源。
关键的函数如下:
register_chrdev_region(devno,1,″ov7620″);
/*申请设备号*/
cdev_init(&dev.cdev,&ov7620_fops);
/*初始化cdev结构体*/
dev.cdev.owner=THIS_MODULE;
dev.cdev.ops=&ov7620_fops;
/*关联cdev结构体和file_operations结构体*/
cdev_add(&dev.cdev,devno,1);
/*添加cdev结构体*/
其中有一个非常重要的结构体(即file_operations结构体)是Linux系统中为应用程序提供各种操作接口的核心结构体,编写驱动的大部分工作实际上就是填充file_operations结构体中的各个子函数。在本文中,摄像头的file_operations结构体如下:
static const struct file_operations ov7620_fops=
{
.owner=THIS_MODULE,
.open=ov7620_open,
.read=ov7620_read,
.write=ov7620_write,
.ioctl=ov7620_ioctl,
};
如填充ov7620_open子函数如下:
static void ov7620_open(struct inode *inode,struct file *filp)
{
GPIO_Init();/*初始化IO口*/
Camera_Setup();/*通过SCCB接口设置OV7620摄像头
中的各个寄存器,使摄像头处于合适的工作模式*/
}
当应用程序调用open函数时,程序最终会调用到驱动程序里的OV7620_open()函数,从而操作硬件。其他的应用程序的函数调用,最终也会寻找到file_operations结构体中对应的钩子函数,在此不再赘述。
3.3 图像的压缩传输
为加快图像传输的速度和节省流量,本文采用JPEG的图像压缩方式。在JPEG算法中,通常是将图像分成一个个8×8的图像子块,对每一个图像子块进行离散余弦变换。所使用的二维离散余弦变换(DCT)公式如下[7]:
JPEG图像压缩在Linux操作系统中的具体实现方式为:在工程文件夹下一次拷贝libjpeg.lib、jconfig、jmorecfg.h、jpeglib.h这4个文件;然后在主程序所在的#include “jpeglib.h”源文件中,调用jpeg_start_compress()函数进行压缩;压缩完成后需调用jpeg_finish_compress()函数来完成压缩;最后需要调用jpeg_destroy_compress()函数来释放压缩过程中申请的资源。压缩效果如图6所示,压缩(上接第36页)
前图片大小为850 KB,压缩后图片大小为45 KB,可见采用JPEG压缩效果十分明显。
本文介绍了以高性能Cortex-A8微处理器为核心的移动在线水质监测平台的开发和系统的软、硬件组成,并且对一些不足提出了改进。实践证明,该系统可长期在水域中监测水质,并可顺畅地传输回所在位置的水质图像,具有一定的应用价值。