- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
一种便携式水下 像实时采集系统软件设计
摘 要: 为了快速、实时地采集水下图像,提出了一种基于RVMDK开发平台的便携式水下图像实时采集系统软件设计。首先给出了水下图像采集系统的总体组成,阐述了RVMDK开发软件环境;其次,分别对OV7670程序、LCD程序、SCCB接口程序进行了设计;最后,对提出的图像采集软件系统进行了试验。试验结果表明,该程序设计能够有效地实现水下图像实时采集功能。
关键词: 水下图像采集;OV7670程序;SCCB接口程序;LCD程序
0 引言
21世纪是海洋的世纪,水下探测技术是水下观测、海洋防卫、水下搜救打捞、舰艇检修等方面的关键技术之一。海警舰艇机舱集中了船上绝大多数设备装置的仪表,是舰艇航行的关键部分。基于PC机的图像采集系统具有功能丰富、接口灵活多变、数据处理能力强等优点[1-2]。该类型图像采集系统通过硬件传输路线连接到多媒体监控终端,然后基于通信网络,将图像信息传到一个或者多个监控中心[3-4]。系统不仅能够实现多媒体信息处理如压缩、存储等基本功能,还能够实现智能存储和图像自动识别等高级功能,实现模拟监控无法实现的“监控”功能[5-6]。但是该类图像采集系统在有限空间的机舱内部所占体积大,且成本较高,不利于便携采集。因此,本文设计了一种快速、实时的水下图像采集系统软件,通过试验验证,该软件能够有效地实现水下图像便捷、实时采集的功能。
1 水下图像采集系统的总体设计
本系统的总体目标是采用带FIFO的OV7670摄像头模块,由STM32F103ZET6单片机通过SCCB总线读取数据,并在LCD液晶显示屏上实时显示图像数据。如图1所示为水下图像采集系统的总体设计框图。由图可知,本系统结构主要由ARM主处理器及其外围电路、CMOS图像传感器、LCD液晶显示屏等几部分组成,系统硬件实现简单。
2 软件环境
软件以RVMDK为开发平台,实现水下图像采集系统的主要算法、控制流程等。RVMDK源自德国的KEIL公司,是RealView MDK的简称。该软件集成了最领先的技术,支持Cortex-M3主处理器内核,本文将选择RVMDK3.80A版本的编译器进行程序编译。由于单片机主处理器为STM32F103ZET6,FLASH容量为512 KB,容量偏大,因此选择startup_stm32f10x_hd.s作为STM32芯片启动文件。如图2所示为STM32芯片启动文件加载图。
3 水下图像采集软件设计
3.1 软件方案设计
如图3所示为水下图像采集程序流程图。首先是系统初始化程序,主要包括TFT液晶显示模块的初始化、SCCB接口、OV7670摄像头、FIFO缓存器AL422B模块的初始化。系统产生中断指令,使得FIFO_WEN置高电位,再次产生中断指令,使得FIFO_WEN置低电位,从而完成一个FIFO_WEN周期。读取FIFO_WEN数据,检测是否完成一帧,如果完成,则检测是否收到采集完毕指令,如此往复循环,直到采集完毕。
3.2 OV7670程序设计
通过OV7670.c代码先编程设计OV7670相关的I/O口和SCCB接口,完成OV7670的寄存器序列的初始化工作。OV7670的寄存器特多,配置很麻烦,本文用到的配置序列,存放在ov7670_init_reg_tbl数组里面,通过这个二维数组来存储初始化序列寄存器和写入寄存器的数值,整个数组存放在ov7670cfg.h文件中。ov7670cfg.h文件的代码如下:
const u8 ov7670_init_reg_tbl[][2]=
{
/*以下为OV7670 QVGA RGB565参数*/
{0x3a,0x04},
{0x40,0x10},
{0x12,0x14},//QVGA,RGB 输出
{0x6e,0x11}, //100
{0x6f,0x9f}, //0x9e for advance AWB
{0x55,0x00}, // 亮度
{0x56,0x40}, // 对比度
{0x57,0x80},
//0x40,change according to Jim′s request
};
#end if
以上代码中,每个条目的第一个字节为寄存器地址,第二个字节为设置的值,比如{0X3a,0x04},就表示在0X3a地址,写入0X04这个值。
通过对寄存器的配置,完成了OV7670摄像头模块的程序设计,使OV7670工作在QVGA模式,以RGB565格式输出。在完成初始化之后,准备读取OV7670采集的图像数据。
3.3 LCD初始化程序设计
TFT-LCD液晶显示模块程序设计的关键在于FSMC控制器的配置和寄存器地址的计算。单片机的FSMC使用的是AHB3提供的时钟信号,STM32微处理器的FSMC控制器对外设地址映射从0X60000000开始到0X9FFFFFFF结束,一共由4个Bank组成,在TFT-LCD程序设计过程中选择了Bank1。寄存器地址则由TFT-LCD的RS和CS端与FSMC接口的连接方式来计算。本文STM32与TFT模块连接时,仅将2.8英寸的TFT屏看成一个SRAM来处理。本程序函数用来驱动ILI9320LCD芯片。程序函数如下:
void LCD_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;
FSMC_NORSRAMInitTypeDef
FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDefreadWriteTiming;
FSMC_NORSRAMTimingInitTypeDefwriteTiming;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE); //使能FSMC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOG|RCC_APB2Periph_AFIO,ENABLE);
//使能PORTB,D,E,G以及AFIO复用功能时钟
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
//PB0推挽输出背光
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
..........
readWriteTiming.FSMC_AddressSetupTime=0x01;
//地址建立时间(ADDSET)为2个HCLK1/36 MHz=27 ns
readWriteTiming.FSMC_AddressHoldTime=0x00;
readWriteTiming.FSMC_DataSetupTime=0x0f;
readWriteTiming.FSMC_BusTurnAroundDuration=0x00;
readWriteTiming.FSMC_CLKDivision=0x00;
readWriteTiming.FSMC_DataLatency=0x00;
readWriteTiming.FSMC_AccessMode=FSMC_AccessMode_A; //模式A
writeTiming.FSMC_AddressSetupTime=0x00;
//地址建立时间(ADDSET)为1个HCLK
writeTiming.FSMC_AddressHoldTime=0x00;
//地址保持时间(A)
writeTiming.FSMC_DataSetupTime=0x03;
//数据保存时间为4个HCLK
writeTiming.FSMC_BusTurnAroundDuration=0x00;
writeTiming.FSMC_CLKDivision=0x00;
writeTiming.FSMC_DataLatency=0x00;
writeTiming.FSMC_AccessMode=FSMC_AccessMode_A; //模式A
3.4 SCCB接口初始化程序设计
由于对摄像头的工作参数的配置是通过SCCB来实现的,因此在软件设计时,首先设计出SCCB程序从而控制摄像头的相关参数。SCCB设计程序如下:
void SCCB_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE); //使能PB端口时钟
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
//端口配置
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_SetBits(GPIOG,GPIO_Pin_13); //输出高电平
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3; //端口配置
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_SetBits(GPIOD,GPIO_Pin_3); //输出高电平
SCCB_SDA_OUT();
}
以上是模拟SCCB初始化函数、使能PB端口时钟和相关引脚的配置。SCCB起始信号函数如下:
void SCCB_Start(void)
{
SCCB_SDA=1; //数据线高电平
SCCB_SCL=1; //在时钟线高的时候数据线由高至低
delay_us(50);
SCCB_SDA=0;
delay_us(50);
SCCB_SCL=0;
//数据线上电位恢复低电平(对于单操作函数必要)
}
通过SCCB起始信号函数可以看出,当时钟为高电平时,数据线由高到低为SCCB起始信号,在激活状态下,SDA和SCL均为低电平。SCCB的停止信号如下:
void SCCB_Stop(void)
{
SCCB_SDA=0;
delay_us(50);
SCCB_SCL=1;
delay_us(50);
SCCB_SDA=1;
delay_us(50);
}
通过SCCB停止信号函数可以看出,当时钟为高电平的时候,数据线的由低到高为SCCB停止信号,在空闲状况下SDA和SCL均为高电平。
4 实验分析
为了方便操作,整个系统设计为外接电源供电,同时打开控制面板来控制供电。控制面板带总开关、灯光旋转开关、摄像头控制接口、灯光控制接口和电源输入接口,通过220 V交流电转12 V直流电转换器实现STM32、摄像头、LED灯光的供电一体化。整个系统的供电由4根电源线控制,包含18根摄像头信号线和两根LED灯光控制线。
由于摄像头前设计了33颗专业级LED灯,总光源面积为504π mm2。实验前将LED灯光全部打开且调节到最亮状态,用不同环径(中间空出摄像头的位置)的不透光的圆环形黑纸条成比例地遮住LED灯,分别在明亮、一般、较暗三种环境下进行图像采集实验。明亮、一般、较暗环境的判断标准如表1所示。三种情况下圆柱体的图像采集情况如图4、5、6所示。
从以上在不同灯光环境下采集的同一物体图像可以看出,三种环境下石块纹理清晰可见,从而证实了本文设计的水下图像采集软件能够有效地实现图像采集功能,并且在不同的灯光强度下,图像采集效果不同,灯光强度越强,采集效果越好。
5 结论
结合论文的研究目标,给出了包含OV7670摄像头模块、STM32F103ZET6单片机处理器模块、SCCB总线读取数据模块以及LCD液晶显示屏模块的水下图像采集系统。分别对系统的OV7670程序、LCD程序、SCCB接口程序进行了设计。通过在不同灯光强度下的试验,证实了本文设计的水下图像采集软件能够有效地实现水下图像采集功能。
参考文献
[1] 张磊.基于ARM的CMOS数字图像传感器图像采集系统的研究与设计[D].哈尔滨:哈尔滨工程大学,2008.
[2] 刘甲玉.基于ARM的图像采集与无线传输技术的研究[D].芜湖:安徽工程大学,2010.
[3] 詹青龙.网络视频技术及应用[M].西安:西安电子科技大学出版社,2004.
[4] OSTHEIMER D, LEMAY S, GHAZAL M. A modular distributed video surveillance system over IP[C]. Canadian Conference on Electrical and Computer Engineering, 2006: 518-521.
[5] 梁修如,严国萍.嵌入式视频监控服务器系统典型方案及其性能分析[J].电视技术,2005,24(10):93-96.
[6] 耿艳明,王宏远.一种基于IP的视频监控系统设计[J].电视技术,2004,23(3):75-77.
上一篇:一种基于子孔径SAR的地面运动目标检测方法
下一篇:斜齿轮断裂分析