1、前言
目前数字摄像技术,主要采用两种方式:一种是使用CCD(电容耦合器件)图像传感器,另一种是使用CMOS(互补金属氧化物半导体)图像传感器。CCD图像传感器具有读取噪声低、动态范围大、响应灵敏度高等优点。但CCD技术难以与主流的CMOS技术集成于同一芯片之中。因而CCD图像传感器具有体积大、功耗高等缺点。CMOS(互补金属氧化物半导体)图像传感器在嵌入式系统中的接口技术,通过设计软件驱动使嵌入式处理器能够控制CMOS图像传感器图像数据自动采集。
2、系统硬件设计
2.1嵌入式系统硬件平台选择
摩托罗拉MC9328MX1处理器基于ARM920T嵌入式处理器内核,能工作于高达200MHz的主频。它集成了许多模块,支持接口模块、GPIO(GeneralPurposeI/O)接口模块、时钟产生模块(CGM,ClockGenerationModule)等,为各种外设提供了灵活的接口控制功能。摩托罗拉MC9328MX1处理器内置的CSI(CMOSSensorInterface)模块提供了时序控制模块,可以适应不同CMOS图像传感器的要求。
2.2COMS图像传感器的选择
ICM105C是ICMedia公司生产的一种单芯片数字彩色图像器件,使用1/4英寸的光学系统。它内置了一个640×480(650×490物理像素)传感器阵列、数模转换器和相关双采样电路。它的控制部分使用I2C总线,只需要一个I2C总线的从设备地址就可以对其内部的控制和状态寄存器进行设置和读取。ICM105C输出的是贝叶尔格式的图像数据,其中的RGB颜色分量可以被数字增益所调整,可以反馈给嵌入式处理器进行色彩处理或压缩。
2.3接口电路的设计
接口电路设计主要应考虑图像传感器的电源驱动控制电路的接口以及数据输出电路的接口。ICM105C使用3V的电源驱动、24MHz的时钟频率,输出8位的数据,控制部分主要使用总线,要保证ICM105C正常工作必须提供这些条件。
(1)电源驱动电路的设计。由于CMOS图像传感器是电源敏感元件,如果电源不稳会给成像效果造成很大影响。ICM105C对于供电电压的要求为3V,最小2.8V,最大3.1V,并且分开了数字电源和模拟电源。但是主处理板只提供了单3V的电源,而且这个电源同时提供给主处理板芯片使用,所以必须采取相应的机制保证电源的稳定和数字电源和模拟电源的隔离,同时本系统的另一个设计目标是小型化和简单化。为了兼顾这两者的要求,电源设计舍弃了使用复杂的稳压芯片的方案,仅使用电容和电感来稳定电压和消除数字电源和模拟电源之间的干扰。
VDD3V是主板提供的电源,VCCD和VCCA分别是提供给ICM105C的数字电源和模拟电源,其中L1,L4,C1,C3起到隔离数字电源和模拟电源及滤波的作用。数字地和模拟地也用电感消除干扰。
数据输出接口电路设计。摩托罗拉MC9328MX1处理器内置的CSI模块提供了时序控制模块,这样可以简化电路的设计,只需要将8位数据线和输出时钟还有场频、行频和像素时钟与CSI模块连接即可保证处理器的正确采集数据。其中时钟线是从MC9328MX1输入24MHz的时钟信号,PCLK是CMOS输出的像素时钟,VSYNC是场频,HSYNC是行频,DOUT[0-7]为输出的数据。DOUT[7:0]在PCLK时钟上升沿有效,HSYNC和VSYNC处于低电平时有效。为了达到这种时序效果需要对芯片的某些引脚进行正确地初始化设置。ICM105C的引脚37控制数据的同步模式,用上拉电阻接高电平,这样可以使传感器输出HSYNC和VSYNC同步信号。
HSYNC和VSYNC的极性也可以进行配置,将引脚46和47接地,这样HSYNC和VSYNC在有效时为低电平。引脚14为时钟选择信号,将其接地表示使用外部时钟,这样内部晶振输入引脚12、13就可以悬空。
(3)控制电路设计。要使传感器正常工作,必须对芯片内部的寄存器进行初始化。初始化的工作必须通过传感器的I2C接口进行。ICM105C提供了一种硬件初始化的方式,如果引脚33在芯片启动时为高电平,那么传感器的I2C接口将首先工作在主设备模式下,并且试图从外部的串行EEPROM中读取初始化数据。然后,传感器又回到正常的从设备工作模式下。为了使接口电路简单化,直接用主处理板的I2C接口来控制传感器,将此引脚接地,使其工作在从模式,这样EEPROM部分的电路就可以舍弃。
3、软件驱动
CMOS图像传感器需要嵌入式系统的软件驱动才能正常工作,并输出正确的图像数据。由于处理端的嵌入式系统采用的是嵌入式Linux操作系统,I2C接口的驱动程序已经集成在操作系统内部,中断资源可以作为资源来申请,操作系统还提供了调用其它资源的接口函数,这极大地方便了驱动程序的编写。在本次设计中采用了Linux系统下模块形式的字符设备驱动程序的编写方法。整个软件驱动需要完成两个功能模块:接口的初始化模块和接收输出的数据。
3.1初始化
(1)CSI模块的初始化。根据ICM105C芯片的数据手册,CSI的重置信号需要保持有效直至输入电压保持恒定大于两个时钟周期。由于主处理板是一上电就开始工作,而ICM105C的驱动程序必须在处理板上的操作系统启动后才开始工作。尤其是时钟信号只有在驱动加载后才开始提供给ICM105C,要造成重置信号的时序效果,必须使用一个软件控制的重置信号,在时钟输出到传感器后至少两个时钟周期保持有效,然后拉高电平使之无效。在设计中,采用了摩托罗拉MC9328MX1处理器一个GPIO端口来实现软重置信号。
(2)设置时钟,初始化I2C接口。ICM105C需要24MHz的时钟,摩托罗拉的MC9328MX1处理板的外频是96MHz,因此需要四分之一的主频。只需要设置相应的时钟产生模块寄存器的值即可保证输出24MHz。I2C总线的两个信号线SDA,SCL需要设置相应GPIO的两个引脚,使其用来进行I2C传输。还需要挂载Linux操作系统的I2C驱动,编写I2C读和写的功能函数。需要注意的是ICM105C的I2C地址值为21H。
(3)初始化CMOS传感器。ICM105C内部控制和状态寄存器通过I2C总线来初始化CMOS,初始化序列(寄存器的地址、值序列)由ICMedia公司提供,初始化完成后,就可以接收到数据和时序信号了。
3.2接收数据
接收数据是驱动程序中最重要的一个部分,它需要协调好中断和DMA传输,保证数据的正确接收,并且在出错时能够正确地恢复。其中在开始阶段申请中断和DMA资源并申请内存空间存放接收的数据。中断的主要任务是在每一帧开始时,开始DMA传输。DMA传输主要将从FIFO中读出数据保存在内存中,并处理可能出现的错误。本例中一旦出现DMA传输错误就丢弃该帧。
3.3数据处理
下面就是数据的处理模块。由于接收到的数据还是原始数据,需要处理才能形成最终的图像数据。具体的处理过程如下:
(1)线性插值。由于制作工艺的问题,CMOS图像传感器中的感光点只能放置一种滤色片,也就是说它的每个物理像素点只能感应R或G或B一种颜色,这就是贝叶尔格式的数据。它必须经过插值运算才能得到每个像素的RGB值。
4、结语
文中提出的ICM105C图像传感器的接口技术已经成功应用在二维条码识读器当中,为了实际应用的需要,ICM105C的电路模块被设计成只有35mm×35mm大小,通过一个20芯的排线与主处理板连接。正常工作时功耗低于50mW,采集的图像数据良好,而且可以通过软件来控制图像传感器的工作方式,非常适用于手持式设备的应用。
参考文献:
[1]安然,陈彦,解静.CMOS图像传感器自适应动态范困调整曝光控制[J].红外与激光工程,2013,42(1):88-92.
[2]陈燕男.基于高动态范围图像技术的光环境参数提取方法研究[D].天津:天津大学,2012.