摄像头OV7725与OV5640(一)

        背景介绍:图像含有最丰富的信息,作为机器人领域的核心部件,摄像头被广泛的应用在实时监控、视频会议、远程医疗、娱乐多媒体等诸多方面。摄像头按输出信号的类型来看可以分为数字摄像头和模拟摄像头,按照摄像头图像传感器材料构成来看可以分为CCD和CMOS。现在智能手机的摄像头绝大部分都是CMOS类型的数字摄像头。

        摄像头简介:

数字摄像头和模拟摄像投的区别:

1. 输出信号的类型:数字摄像头输出信号为数字信号,模拟摄像头输出信号为标准的模拟信号。

2. 接口类型:数字摄像头有USB接口,IEE1394火线接口、千兆网接口。模拟摄像头采用AV视频端子(信号线+地线)或SVIDEO(即莲花头-SUPER VIDEO,是一种五芯的接口,由两路视频亮度信号、两路视频色度信号和一路公共屏蔽地线共五条芯线组成)

3. 分辨率:模拟摄像头的感光器件,其像素指标一般维持在725(H)*582(V)左右的水平,像素数一般情况下维持在41W左右。数字摄像头分辨率一般从数十万到数百万甚至数千万。但这并不能说明数字摄像头的成像分辨率就比模拟摄像头的高,原因在于模拟摄像头输出的是模拟视频信号,一般直接输入至电视或监听器,其感光器件的分辨率与电视信号的扫描数成一定的换算关系,图像显示介质已经确定,因此模拟摄像头的感光器件的分辨率不是不能坐高,而是要依据实际情况。

CCD与CMOS的区别:

        摄像头图像传感器CCD与CMOS图像传感器的主要区别如下:

1. 成像材料:CCD与CMOS的名称根他们成像使用的材料有关,CCD是一电荷耦合器件||(Charge Coupled Device)的简称,而CMOS是一互补金属氧化物半导体||(Complementary Metal Oxide Semiconducter)的简称。

2. 功耗:由于CCD的像素由MOS电容构成,读取电荷信号时需要使用电压相当大(至少12V)的二巷或三相或四相的时序脉冲,才能有效的传输电荷。因此CCD的取像系统需消耗2~5w的功率。而CMOS光感传感器件只需要使用一个单电源5V或3V,耗电量非常小,仅为CCD的1/8~1/10,有的CMOS取像系统只消耗20~50mW的功率。

3. 成像质量:CCD传感器制作技术起步早,技术成熟,采用PN节或二氧化硅(sio2)隔离层隔离噪声,所以噪声低,成像质量好。与CCD相比,CMOS的主要缺点是噪声高及灵敏度低,不过随着CMOS的电路消噪技术的不断发展,为生产高密度优质的CMOS传感器件提供了良好的条件,现在CMOS传感器已经占领了大部分的市场,主流的单反相机、智能手机都已普遍采用CMOS传感器。

        OV7725简介:该摄像头主要有镜头、传感器、板载电路及下方的信号引脚组成。镜头部件包含一个镜头座和一个可旋转调节距离的凸透镜,通过旋转可以调节焦距。镜头座覆盖在电路板上遮光,光线智能通过镜头传输到正中央的图像传感器上,它采集到的图像数据直接传输给FPGA芯片,FPGA将接收到的图像数据缓存到DDR3 SDRAM中,在VGA图像显示有效区域,VGA驱动自DDR3 SDRAM读取图像数据在显示屏上。
        
        若拆开摄像头座,在摄像头的正下方可看到 PCB 板上的一个方形器件,它是摄像头的
核心部件,型号为 OV7725 CMOS 类型数字图像传感器。该传感器支持输出最大为 30
万像素的图像 (640x480 分辨率 ) ,它的体积小,工作电压低,支持使用 VGA 时序输出图像
数据,输出图像的数据格式支持 YUV(422/420) YCbCr422 以及 RGB565 格式。它还可以
对采集得的图像进行补偿,支持伽玛曲线、 白平衡、饱和度、色度等基础处理。

        OV7725引脚及功能框架图:

        OV7725传感器采用BGA封装,他的前端是采光窗口,引脚都在背面引出,引脚的分布如下图所示:

                                

图中非彩色部分是电源相关的引脚,彩色部分是主要的信号引脚,其介绍如表格:

OV7725功能框图:

1. 控制寄存器:

        控制寄存器根据这些寄存器配置的参数来运行,而这些参数是由外部控制器通过SCL和SDA引脚写入的,SCL与SDA使用的通讯协议SCCB和IIC十分相识。

2. 通信、控制信号及时钟

        PCLK、HREF及VSYNC分别是像素同步时钟、行同步信号以及帧同步信号,这与液晶屏控制中的VGA信号相似;RSTB引脚为低电平时用于复位整个传感器芯片,PWND用于控制芯片进入低功耗模式。注意最后一个XCLK引脚,它与PCLK不同,XCLK用于用于驱动整个传感器芯片的时钟信号,是外部输入到OV7725的信号。XCLK可以用外部晶振或外部控制器提供,

3. 感光矩阵:

        感光矩阵,光信号在这里转化成电信号,经过各种处理,这些信号存储成由一个个像素点表示的数字图像。

4. 数据输出信号

        标号4处包含了DSP处理单元,它会根据控制寄存器的配置做一些基本的图像处理运算。这部分还包含了图像格式转换单元及压缩单元,转换出的数据最终通过D0-D9引脚输出,一般来说我们使用8根数据线来传输,这时仅使用D2-D9引脚

        SCCB时序:

        外部控制器对OV7725寄存器的配置参数是通过SCCB总线传输过去的,而SCCB总线跟IIC十分类似完整内容可以查看SCCB协议。

SCCB起始、停止信号及数据有效性:SCCB的起始信号、停止信号及数据有效性与IIC完全一样,如图所示:

                

SCCB数据读写过程:

        在SCCB协议中定义的读写操作与IIC也是一样的,只是换了一种说法,它定义了两种写操作,即三步写操作和两步写操作。三步写操作可向从设备的一个目的寄存器中写入数据,如下图,在三步操作中,第一阶段发送从设备的ID地址+W标志(等于IIC的设备地址:7位设备地址+读写方向标志),第二阶段发送从设备目标寄存器的8位地址,第三阶段发送要写入寄存器的8位数据。图中的X数据位可以写入0或1,对通讯无影响。

        而两步写操作没有第三阶段,即只向从器件传输了设备ID+W标志和目的寄存器的地址,两步写操作是用来配合后面的读寄存器数据操作的,它与读操作一起使用,实现IIC的复合过程。

        两步读操作,它用于读取从设备目的寄存器中的数据,在第一阶段发送从设备的设备ID+R标志(设备地址+读方向标志)和自由位,在第二阶段中读取寄存器中的8位数据和写NA位(非应答信号)。由于两步读操作没有确定的目的寄存器的地址,所以在读操作前,必须有一个两步写操作,以提供读操作中的寄存器地址。

OV7725的寄存器

        要想驱动OV7725摄像头,需要对其内部诸多寄存器进行配置,对于相关寄存器的配置参数,可以查询《OV7725datasheet》,通过这些寄存器的配置,可以控制摄像头输出图像的分辨率大小、图像格式、图像处理以及图像方向等。

像素数据输出时序

        FPGA驱动OV7725时采用SCCB协议对其寄存器进行配置,而它输出图像时则使用VGA或QVGA时序,其中VGA在输出图像分辨率为640*480时采用,QVGA是Quarter VGA,其输出分辨率为32*240;OV7725传感器输出图像时,一帧帧的输出,在帧内的数据一般是从左到右,从上到下,一个像素一个像素的输出(也可以通过寄存器修改方向),使用D2~D9数据线,图像格式设置为RGB565进行数据传输时,D2-D9数据线在PCLK上升沿阶段维持稳定,并且会在一个像素同步时钟PCLK的驱动下发送一字节的数据信号,所以两个PCLK的时钟可以发送一个RGB565格式的像素数据,当HREF为高电平时,像素数据依次传输,每传输完一行数据时,行同步信号HREF会输出一个电平跳变信号间隔开当前行和下一行的数据;一帧的图像由N行数据组成,当VSYNC为低电平时,各行的像素数据依次传输,每传输完一帧图像时,VSYNC会输出一个高电平的跳变信号。

索智R16点亮ov2640.txt 开发板:深圳市索智科技有限公司SC3817R开发板,全志R16(CPU:Quad-Core Cortex-A7 CPU) 全志官网R16的简介 android4.4.2/linux3.4.39 2016/7/18 16:38 1、配置ov2640在android层配置的分辨率为vga(预览/拍照/录像) 注意:系统自带的快拍APP就在这里查找分辨率参数发送到camera的HAL层。 这里得分辨率设置为:1280x720 驱动里面搜索可以设置为:1600x1200, 1280x960, 1024x768, 1280x720, 800x600(出错), 640x480 R:\wyb\test_ov2640_r16\android\device\softwinner\astar-evb20\configs\camera.cfg ;------------------------------------------------------------------------------- ; 用于camera的配置 ; ; 采用格式: ; key = key_value ; 注意: 每个key需要顶格写; ; key_value紧跟着key后面的等号后面, 位于同行中; ; key_value限制大小为256字节以内; ; ;------------------------------------------------------------------------------- ;------------------------------------------------------------------------------- ; exif information of "make" and "model" ;------------------------------------------------------------------------------- key_camera_exif_make = MAKE_A31S key_camera_exif_model = MODEL_A31ST ;------------------------------------------------------------------------------- ; 1 for single camera, 2 for double camera ;------------------------------------------------------------------------------- number_of_camera = 1 ;------------------------------------------------------------------------------- ; CAMERA_FACING_BACK ; gc0307 ov2640 ;------------------------------------------------------------------------------- camera_id = 0 ;------------------------------------------------------------------------------- ; 1 for CAMERA_FACING_FRONT ; 0 for CAMERA_FACING_BACK ;------------------------------------------------------------------------------- camera_facing = 0 ;------------------------------------------------------------------------------- ; 1 for camera without isp(using built-in isp of Axx) ; 0 for camera with isp ;------------------------------------------------------------------------------- use_builtin_isp = 0 ;------------------------------------------------------------------------------- ; camera orientation (0, 90, 180, 270) ;------------------------------------------------------------------------------- camera_orientation = 90 ;------------------------------------------------------------------------------- ; driver device name ;------------------------------------------------------------------------------- camera_device = /dev/video0 ;------------------------------------------------------------------------------- ; device id ; for two camera devices with one CSI ;------------------------------------------------------------------------------- device_id = 0 used_preview_size = 1 key_support_preview_size = 1600x1200, 1280x960, 1024x768, 1280x720, 800x600, 640x480 key_default_preview_size = 1280x720 used_picture_size = 1 key_support_picture_size = 1600x1200, 1280x960, 1024x768, 1280x720, 800x600, 640x480 key_default_picture_size = 1600x1200 used_flash_mode = 0 key_support_flash_mode = on,off,auto key_default_flash_mode = on used_color_effect=0 key_support_color_effect = none,mono,negative,sepia,aqua key_default_color_effect = none used_frame_rate = 1 key_support_frame_rate = 10 key_default_frame_rate = 10 used_focus_mode = 0 key_support_focus_mode = auto,infinity,macro,fixed,continuous-video,continuous-picture key_default_focus_mode = auto used_scene_mode = 0 key_support_scene_mode = auto,portrait,landscape,night,night-portrait,theatre,beach,snow,sunset,steadyphoto,fireworks,sports,party,candlelight,barcode key_default_scene_mode = auto used_white_balance = 0 key_support_white_balance = auto,incandescent,fluorescent,warm-fluorescent,daylight,cloudy-daylight key_default_white_balance = auto used_exposure_compensation = 1 key_max_exposure_compensation = 3 key_min_exposure_compensation = -3 key_step_exposure_compensation = 1 key_default_exposure_compensation = 0 2、没有/dev/video1,只有/dev/video0 R:\wyb\test_ov2640_r16\android\device\softwinner\astar-evb20\ueventd.sun8i.rc /dev/video0 0666 media media #/dev/video1 0666 media media 3、在init.rc(init.sun8i.rc)中加载ov2640.ko这个驱动模块。 R:\wyb\test_ov2640_r16\android\device\softwinner\astar-evb20\init.sun8i.rc #csi module insmod /system/vendor/modules/videobuf-core.ko insmod /system/vendor/modules/videobuf-dma-contig.ko insmod /system/vendor/modules/cam_detect.ko #insmod /system/vendor/modules/actuator.ko #insmod /system/vendor/modules/ad5820_act.ko insmod /system/vendor/modules/cci.ko insmod /system/vendor/modules/vfe_os.ko insmod /system/vendor/modules/vfe_subdev.ko #insmod /system/vendor/modules/gc0307.ko #insmod /system/vendor/modules/ov2035.ko insmod /system/vendor/modules/ov2640.ko insmod /system/vendor/modules/vfe_v4l2.ko 启动之后实际加载的摄像头的驱动模块: shell@astar-evb20:/ $ lsmod gt82x 9849 0 - Live 0x00000000 bma250 7848 0 - Live 0x00000000 sunxi_schw 12559 0 - Live 0x00000000 (O) rtl8150 9023 0 - Live 0x00000000 sunxi_keyboard 3021 0 - Live 0x00000000 sw_device 13916 0 - Live 0x00000000 vfe_v4l2 445444 0 - Live 0x00000000 ov2640 11637 0 - Live 0x00000000 vfe_subdev 4523 2 vfe_v4l2,ov2640, Live 0x00000000 vfe_os 3951 2 vfe_v4l2,vfe_subdev, Live 0x00000000 cci 21775 2 vfe_v4l2,ov2640, Live 0x00000000 videobuf_dma_contig 5567 1 vfe_v4l2, Live 0x00000000 videobuf_core 16520 2 vfe_v4l2,videobuf_dma_contig, Live 0x00000000 bcm_btlpm 7442 0 - Live 0x00000000 bcmdhd 629907 0 - Live 0x00000000 mali 209490 25 - Live 0x00000000 (O) lcd 41263 0 - Live 0x00000000 disp 992816 8 mali,lcd, Live 0x00000000 nand 282774 0 - Live 0x00000000 (O) shell@astar-evb20:/ $ 4、驱动程序:ov2640.c及其V4L2的适配层。 配置ov2640.c的编译选项,只需要修改device目录中的Makefile打开ov2640即可: R:\wyb\test_ov2640_r16\lichee\linux-3.4\drivers\media\video\sunxi-vfe\device\ov2640.c R:\wyb\test_ov2640_r16\lichee\linux-3.4\drivers\media\video\sunxi-vfe\device\Makefile obj-m += ov2640.o R:\wyb\test_ov2640_r16\lichee\linux-3.4\drivers\media\video\sunxi-vfe\Kconfig R:\wyb\test_ov2640_r16\lichee\linux-3.4\drivers\media\video\sunxi-vfe\Makefile 5、 R:\wyb\test_ov2640_r16\lichee\tools\pack\chips\sun8iw5p1\configs\evb-20\sys_config.fex ;-------------------------------------------------------------------------------- ;vip (video input port) configuration ;vip_used: 0:disable 1:enable ;vip_mode: 0:sample one interface to one buffer 1:sample two interface to one buffer ;vip_dev_qty: The quantity of devices linked to capture bus ; ;vip_define_sensor_list: If you want use sensor detect function, please set vip_define_sensor_list = 1, and ; verify that file /system/etc/hawkview/sensor_list_cfg.ini is properly configured! ; ;vip_dev(x)_pos: sensor position, "rear" or "front", if vip_define_sensor_list = 1,vip_dev(x)_pos must be configured! ; ;vip_dev(x)_isp_used 0:not use isp 1:use isp ;vip_dev(x)_fmt: 0:yuv 1:bayer raw rgb ;vip_dev(x)_stby_mode: 0:not shut down power at standby 1:shut down power at standby ;vip_dev(x)_vflip: flip in vertical direction 0:disable 1:enable ;vip_dev(x)_hflip: flip in horizontal direction 0:disable 1:enable ;vip_dev(x)_iovdd: camera module io power handle string, pmu power supply ;vip_dev(x)_iovdd_vol: camera module io power voltage, pmu power supply ;vip_dev(x)_avdd: camera module analog power handle string, pmu power supply ;vip_dev(x)_avdd_vol: camera module analog power voltage, pmu power supply ;vip_dev(x)_dvdd: camera module core power handle string, pmu power supply ;vip_dev(x)_dvdd_vol: camera module core power voltage, pmu power supply ;vip_dev(x)_afvdd: camera module vcm power handle string, pmu power supply ;vip_dev(x)_afvdd_vol: camera module vcm power voltage, pmu power supply ;x indicates the index of the devices which are linked to the same capture bus ;fill voltage in uV, e.g. iovdd = 2.8V, vip_devx_iovdd_vol = 2800000 ;fill handle string as below: ;axp22_eldo3 ;axp22_dldo4 ;axp22_eldo2 ;fill handle string "" when not using any pmu power supply ;-------------------------------------------------------------------------------- [csi0] vip_used = 1 vip_mode = 0 vip_dev_qty = 1 vip_define_sensor_list = 0 vip_csi_pck = port:PE00 vip_csi_mck = port:PE01 vip_csi_hsync = port:PE02 vip_csi_vsync = port:PE03 vip_csi_d0 = port:PE04 vip_csi_d1 = port:PE05 vip_csi_d2 = port:PE06 vip_csi_d3 = port:PE07 vip_csi_d4 = port:PE08 vip_csi_d5 = port:PE09 vip_csi_d6 = port:PE10 vip_csi_d7 = port:PE11 vip_csi_sck = port:PE12 vip_csi_sda = port:PE13 ;vip_dev0_mname = "ov5640" vip_dev0_mname = "ov2640" vip_dev0_pos = "rear" vip_dev0_lane = 1 vip_dev0_twi_id = 2 ;vip_dev0_twi_addr = 0x78 vip_dev0_twi_addr = 0x60 vip_dev0_isp_used = 0 vip_dev0_fmt = 0 vip_dev0_stby_mode = 0 vip_dev0_vflip = 0 vip_dev0_hflip = 0 vip_dev0_iovdd = "axp22_dldo3" vip_dev0_iovdd_vol = 3300000 vip_dev0_avdd = "" vip_dev0_avdd_vol = 3300000 vip_dev0_dvdd = "" vip_dev0_dvdd_vol = 1800000 vip_dev0_afvdd = "" vip_dev0_afvdd_vol = 3300000 vip_dev0_power_en = vip_dev0_reset = port:PE14 vip_dev0_pwdn = port:PE15 vip_dev0_flash_en = vip_dev0_flash_mode = vip_dev0_af_pwdn = 6、开发板上摄像头的I2C挂载在TWI2上面了,逻辑是需要打开的(但是不打开也能够用,很奇怪!): ;---------------------------------------------------------------------------------- ;i2c configuration ; twi_used = twix enable ;---------------------------------------------------------------------------------- [twi0] twi_used = 1 twi_scl = port:PH02 twi_sda = port:PH03 [twi1] twi_used = 1 twi_scl = port:PH04 twi_sda = port:PH05 [twi2] twi_used = 0 twi_scl = port:PE12 twi_sda = port:PE13 直接配置摄像头的I2C了: vip_csi_sck = port:PE12 vip_csi_sda = port:PE13 不过奇怪的是,摄像头并没有向其它平台那样生成这个设备节点: /sys/class/i2c-adapter/i2c-2/2-0030 shell@octopus-f1:/ $ shell@octopus-f1:/ $ cd /sys/class/i2c-adapter/i2c-2/ shell@octopus-f1:/sys/class/i2c-adapter/i2c-2 $ shell@octopus-f1:/sys/class/i2c-adapter/i2c-2 $ ll drwxr-xr-x root root 1970-01-02 08:06 2-003b --w------- root root 4096 1970-01-02 08:06 delete_device lrwxrwxrwx root root 1970-01-02 08:06 device -> ../../twi.2 -r--r--r-- root root 4096 1970-01-02 08:06 name --w------- root root 4096 1970-01-02 08:06 new_device drwxr-xr-x root root 1970-01-02 08:06 power lrwxrwxrwx root root 1970-01-02 08:06 subsystem -> ../../../../bus/i2c -rw-r--r-- root root 4096 1970-01-02 08:06 uevent shell@octopus-f1:/sys/class/i2c-adapter/i2c-2 $ 可能是ov2640的驱动程序不完整,没有通过i2c_detect来注册2-0030这个节点。 直接在驱动程序中读取I2C,还是对的。device ID = 0x2642。 7、奇葩的问题: 摄像头使用的是: http://www.waveshare.net/shop/OV2640-Camera-Board.htm OV2640 Camera Board vsync=15HZ,XCLK=24MHZ。href/pclk都有 camera打开摄像头是绿色屏幕(VGA分辨率),但是右上角貌似出来点点图像。 后来使用示波器的探头挂在vsync之后,图像正常。 由于开发板和摄像头模组ov2640是飞线链接,硬件另外接了个地,然后用纸胶布将地线和vsync捆绑在在起,解决问题。 刚开始摄像头的3.3V电源使用的是g-sensor的(VCC-3V0),看见图像出现竖条纹(电源纹波干扰),接回来(VCC-3V0-CSI)就正常了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值