使用51单片机配置CMOS图像传感器.docx

上传人:b****8 文档编号:23633661 上传时间:2023-05-19 格式:DOCX 页数:24 大小:146.23KB
下载 相关 举报
使用51单片机配置CMOS图像传感器.docx_第1页
第1页 / 共24页
使用51单片机配置CMOS图像传感器.docx_第2页
第2页 / 共24页
使用51单片机配置CMOS图像传感器.docx_第3页
第3页 / 共24页
使用51单片机配置CMOS图像传感器.docx_第4页
第4页 / 共24页
使用51单片机配置CMOS图像传感器.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

使用51单片机配置CMOS图像传感器.docx

《使用51单片机配置CMOS图像传感器.docx》由会员分享,可在线阅读,更多相关《使用51单片机配置CMOS图像传感器.docx(24页珍藏版)》请在冰豆网上搜索。

使用51单片机配置CMOS图像传感器.docx

使用51单片机配置CMOS图像传感器

使用51单片机配置CMOS图像传感器

本项目任务要达到通过MCS-51单片机对OV9121CMOS图像传感器进行初始化配置,并控制其工作的目的。

从而使CMOS图像传感器能按要求的工作模式进行工作,实现图像的采集和数字图像数据的顺序输出。

1器件选择及介绍

本课题中用到的器件包括AT89C51单片机,OV9121CMOS图像传感器,SN74LVC4245A电平转换芯片。

编程语言是C,软件运行环境是KeilC。

1.1CMOS芯片介绍

选用OmniVision公司生产的OV9121芯片。

该芯片是用于数字静态图像和摄像产品的高性能数码相机芯片,为130万像素、镜头尺寸1/2英寸,黑白CMOS图像传感芯片。

这款器件集成了一个1280x1024(SXGA)的图像阵列和一个在全分辨率下帧速达到15帧/s的片上10位A/D转换器,并改进了微透镜设计以减少阴影。

可以选择采用SXGA/VGA格式输出,最大帧速为30帧/s。

专有的传感器技术采用了先进的计算方法以消除固定模式噪声(FPN),消除拖尾效应,并大幅度减少图像浮散。

同时用户可以选择让它工作在主/从模式下。

当其工作在从模式下时,主设备向它提供必要的时序信号,控制其工作。

除此以外,OV9121还具有SCCB接口,用户可通过该接口对CMOS进行编程,修改其内部参数,以满足用户需求。

芯片内的控制寄存器允许了时间,极性,以及芯片操作的灵活控制,这样反过来给工程人员在产品设计上带来了很大的自由空间。

OV9121芯片采用48个引脚的表面贴装型封装(CLCC-48)。

如图1所示。

图1.OV9121封装引脚图

按其引脚功能这些引脚可分为:

1.电源引脚SVDD,DEVDD,DEGND,AVDD,AGND,ASUB,ADVDD,ADGND,DVDD,DGND,DOVDD,DOGND,SGND(共13根)

DEGND,AGND,ADGND,DGND,DOGND,SGND,ASUB,:

接地

AVDD,SVDD,DEVDD,ADVDD,DOVDD:

接+3.3V电压。

DVDD:

接+2.5V电压。

2.模拟信号引脚VrHIGH,NBIT,VrLOW,VcCHG,VrAD2,VcCHG(共6根)

前5个均为旁路到地使用一个0.1μF电容,VcCHG为旁路到地使用一个1μF电容。

3.时钟信号XCLK1,XCLK2,PCLK(共3根)

XCLK1是外部晶振时钟信号的输入端,XCLK2是晶振时钟信号的输出端。

PCLK是像素时钟输出端,无论是在主从模式下,像素数据输出都与PCLK,HREF和PCLK时钟同步(如果端口是从模式则为MCLK)。

4.SCCB串口引脚SCCB_E,SIO_C,SIO_D(共3根)

SCCB_E是SCCB总线的使能端,低电平有效。

SIO_C是时钟信号输入端,SIO_D是数据输入/输出双向端口。

SCCB总线的作用及使用方法将在下文中重点介绍。

5.控制和复位引脚PWDN,FREX,EXPSTB,VGA,FSIN,RESET(共6根)。

PWDN(7脚):

该引脚用于控制芯片的掉电模式(Power-downMode),为高电平有效。

因为传感器中有一个内部下拉电阻,所以PWDN引脚的默认状态为低电平。

OV9121芯片要到的掉电或待机的目的有两种可行的方法:

一、硬件方式。

通过将PWDN脚置高电平来选择掉电模式。

在此待机模式下,芯片内部设备时钟暂停且所有的内部计数器复位,实际电流小于10μA。

二、软件方式。

通过将COMC寄存器的第四位置高也可以达到掉电的效果。

采用软件掉电方式时,待机电流小于1mA,所有的寄存器内容保持不变。

FREX(8脚),EXPSTB(12脚):

帧曝光引脚,FREX是帧曝光模式使能引脚,EXPSTB作为传感器的曝光开始触发器。

OV9121支持帧曝光模式,曝光模式必须在有外部快门的支持下工作。

设置帧曝光模式的两种方法:

一、同时控制FREX和EXPSTB引脚。

将FREX和EXPSTB引脚上的电平同时拉高可将芯片设置为帧曝光模式。

二、保持EXPSTB为低电平,只控制FREX。

在这种情况下,传感器的曝光时间是从预充电结束到快门关闭这段时间。

当外部主器件控制芯片,并设置FREX引脚为高,传感器阵列会迅速的预充电并保持在复位状态直到EXPSTB引脚被主器件拉低。

在FREX引脚被拉低了之后,视频数据流在时钟控制下按逐行的次序在输出端口输出。

只要是多帧传输模式,在完成一帧数据输出后,OV9121芯片会继续输出连续的动态视频数据。

VGA:

传感器分辨率选择。

OV9121的默认分辨率为1280x1024(SXGA)像素,所有的有源像元都被输出。

但OV9121也可以选择输出640x480(VGA)大小的图像,可以应用于对分辨率要求不高的图像捕获。

该引脚上0:

SXGA分辨率(1280x1024),1:

VGA分辨率(640x480)。

FSIN:

帧同步输入。

RESET(10脚):

复位引脚,高电平有效。

由于传感器内部有一个下拉电阻,所以RESET引脚的默认状态是低电平。

使传感器复位的两种方法:

一、硬件复位。

将RESET引脚置高并维持高电平状态在1ms以上。

二、软件复位。

将寄存器0x12(COMH)中写入0x80。

如果采用软件复位法,则建议做两次复位操作以确保传感器状态稳定并准备访问寄存器。

6.数字视频输出引脚D0~D9(共10根)

OV9121芯片有10位的数字视频端口,其最高位和最低位可以通过修改控制寄存器来互换。

根据输出的要求,连接方式可以有10位和8位连接方法。

如下图所示:

图28-位连接方法

图310-位连接方式

7.参考信号输出引脚HREF,CHSYNC,VSYNC(共3根)

HREF:

水平参考输出。

CHSYNC:

当芯片作为主器件时输出水平同步信号。

VSYNC:

当芯片作为主器件时输出垂直同步信号。

当OV9121作为从设备时,CHSYNC和VSYNC引脚改为输入信号,输入主器件提供的水平和垂直同步信号。

主器件必须提供下列信号:

(1)系统时钟MCLK1,由XCLK1引脚输入

(2)水平同步MHSYNC,由CHSYNC引脚输入

(3)垂直帧同步MVSYNC,由VSYNC引脚输入

8.闲置引脚(共4根)

1.2软件运行环境——KeilC

C语言是一种通用的计算机程序设计语言,在国际上十分流行,它既可以用来编写计算机的系统程序,也可以用来编写一般的程序。

以往编写计算机系统语言主要使用汇编,单片机更是如此。

但是,作为一种低级语言,汇编语言的程序具有很多不可忽视的缺点,包括程序的可读性和可移植性差,调试和排版困难。

利用汇编语言编译的单片机应用程序还有周期长的缺点。

因此,高级语言逐渐在这一领域中取代了汇编语言,从而解决或减小了上述的种种问题。

C语言由于本身既具有高级语言的特点,又可以直接对计算机的硬件进行操作,同时还有表达和运算能力较强的优点,所以成为了替代汇编的一种很好的选择。

目前C语言已经可以解决很多以往只能靠汇编来解决的问题。

KeilC是目前比较流行的单片机C语言调试和开发软件,由德国KeilSoftware公司开发,该公司多年来一直致力于单片机C语言编译器的研究,该软件已为当下单片机设计者所广泛采用。

但是,KeilC和普通的C语言有一些区别,差异主要是KeilC可以让用户针对8051的结构进行程序设计,其它差异主要是由8051的一些局限引起的。

KeilC支持符合ANSI标准的C程序设计,它完全支持C的标准指令和单片机优化C扩展指令。

特别地,针对8051单片机的自身特点它作了一些特殊扩展。

KeilC生成的目标代码效率非常高,生成的语句编码紧凑,易理解,在开发单片机软件时,能充分发挥单片机的有限资源,所占用的存储空间非常小,体现其高级语言的优势。

Keil公司目前已经推出了V7.0以上版本的Cx51编译器,为8051单片机软件开发提供了全新的C语言环境,同时保留的汇编代码高效快速的特点。

Keil提供了包括项目(project)管理器、Cx51编译器、Ax51宏汇编、BL51/Lx51连接定位器、RTX51实时操作系统、Simulator软件模拟器以及Monitor51硬件目标调试器等在内的完整开发方案,通过一个集成开发环境(µVision)将这些部份组合在一起。

在这个单一而灵活的集成开发环境中,这些功能可以极为简单的被操作。

1.3AT89C51单片机介绍及硬件电路连接

单片机,即MicroControllerUnit(微控制器件),它是由INTEL公司发明的,最早的系列是MCS-48,后来有了MCS-51,现在还有MCS-96系列,我们经常说的51系列单片机就是MCS-51,它是一种8位的单片机,而MCS-96系列则是一种16位的单片机。

后来INTEL公司把它的核心技术转让给了世界上很多的小公司,所以有许多公司生产51系列兼容单片机,比如飞利浦的87LPC系列,伟邦的W78L系列,达拉斯的DS87系列,现代的GSM97系列等等,目前在我国比较流行的就是美国ATMEL公司的89C51,它是一种带FlashROM的单片机,也是本课题所使用到的单片机。

89C51单片机的引脚及功能介绍如下:

图4.单片机的封装引脚图

1.VCC(40):

电源+5V。

2.VSS(20):

接地,也就是GND。

3.XTAL1(19)和XTAL2(18):

振荡电路。

单片机是一种时序电路,必须有脉冲信号才能工作,在它的内部有一个时钟产生电路,有两种振荡方式,一种是内部振荡方式,只要接上两个电容和一个晶振即可;另一种是外部振荡方式,采用外部振荡方式时,需在XTAL2上加外部时钟信号。

在这里我们选用第一种方式。

4.PSEN(29):

片外ROM选通信号,低电平有效。

5.ALE/PROG(30):

地址锁存信号输出端/EPROM编程脉冲输入端。

6.RST/VPD(9):

复位信号输入端/备用电源输入端。

单片机上电后,只要在该引脚上输入24个振荡周期(2个机器周期)宽度以上的高电平就会使单片机复位;若在RST与VCC之间接一个10μF的电容,而在RST与VSS之间接一个8.2kΩ的下拉电阻,则可实现单片机上电自动复位。

7.EA/VPP(31):

内/外部ROM选择端。

当EA输入高电平时,CPU执行程序,在低4K地址范围内,访问片内程序存储器;在程序计数器PC的值超过4K地址时,将自动转向执行片外程序存储器的程序。

8.P0口(39-32):

双向I/O口。

9.P1口(1-8):

准双向通用I/0口。

10.P2口(21-28):

准双向I/0口。

11.P3口(10-17):

多用途口。

1.4电平转换芯片SN74LVC4245A

由于单片机的I/O口额定电平为+5V,而OV9121的I/O口为+3.3V,所以为了使硬件电路能够正常工作,我们必须考虑电平转换的问题。

在这里选择使用SN74LVC4245A电平转换芯片。

该芯片为3.3V到5V双向电平转换器,是八位(八进制)同向总线收发器,封装如下图所示:

图5.电平转换芯片的封装引脚图

芯片包含了两个单独的电源轨,A端加VCCA电源,置为+5V,B端加VCCB电源,置为+3.3V。

这样可以完成+5V和+3.3V的双向转换。

该芯片是为数据总线之间的异步通信专门设计的,由DIR(direction-control)方向控制引脚输入的逻辑电平来决定数据传输的方向是从A到B还是从B到A。

输出使能端OE可以控制芯片电平转换功能的开启和关闭,如果关闭芯片功能,则芯片两边的总线可以有效地被隔离。

功能表:

输入端

操作

OEDIR

LL

LH

HX

由B到A转换

由A到B转换

两边隔离

在本课题研究中,OE选择输入低电平,电平转换的方向可由软件编程控制。

由于本课题中只需要对单片机的输出控制波形进行观察,而CMOS芯片不需要上板实验。

所以对DIR的方向控制在程序中并体现。

但要实现这一功能并不困难,如果单片机在A端,OV9121在B端,需保持DIR在由单片机进行写入传输时为高电平,而每当传输方向改变时,DIR上的电平也同时改变。

2程序设计

本部分介绍CMOS驱动程序的设计,选用KeilC软件,使用C语言来实现。

设计的主要思想是自顶向下。

2.1整体系统框架

在硬件设计中,应采用层次化,结构化的设计方法。

一个完整的任务可以被划分为若干个可操作的模块,编制出相应的行为的或结构的模型,通过调试模拟仿真加以验证后,再把这些模块分配给下一层设计师。

用这样的方式,可以达到团队合作完成一个项目的目的,即允许多个设计师参与项目的开发,而每个人承担不同部分的任务。

上级设计师可以对下级设计师的设计模块进行验证。

在实际的开发中,为了提高设计质量并节省时间和费用,可以通过商业渠道得到其中的一部分模块设计,即购买它的知识产权的使用权。

所谓自顶向下的设计思想,就是指该设计从系统级开始,把系统划分为若干个基本单元,而每个基本单元又可以向下划分为下一层的基本单元,直到可以直接使用基本元件来实现为止。

这种设计方法的好处是方便从系统划分和管理整个项目,使得复杂设计成为可能。

实际设计时,设计师也应该同时结合自底向上的设计方法。

采用自顶向下的设计方法,首先,本系统可以被划分为两个主要功能:

1.向CMOS寄存器写入数据。

2.从CMOS寄存器读出数据。

要完成这两个功能,必须完成以下的模块:

SCCB总线传输起始模块,SCCB总线传输停止模块,检查应答模块,产生应答模块,不产生应答模块。

每个模块的具体功如下:

SCCB总线传输起始模块:

使单片机输出如图9所示的时序信号给CMOS芯片,作为数据开始传输的判断标准。

SCCB总线传输停止模块:

使单片机输出如图10的时序信号给CMOS芯片,作为数据停止传输的判断标准。

检查应答模块:

在每一相的前八位传输结束后,第九位由从器件(此时是OV9121)来决定。

故单片机在这个时候检查SIO_D数据线上的逻辑电平,放入CY寄存器中。

产生应答模块:

SIO_D数据线上产生一个由低到高的跳变。

用于单片机从CMOS图像传感器芯片中读出数据时数据传输成功的应答。

3.2.2程序主体介绍

SCCB函数是本程序最重要的部分,完成根据三相数据传输的标准格式完成向OV9121的指定寄存器中写入或读出数据的功能。

其中调用的功能子模块包括:

SCCBstart(),提供起始信号。

SCCBstop(),提供结束信号。

SCCBreceiveByte(),数据接收。

SCCBsendByte(),数据发送。

SCCBRecAck(),检查应答。

SCCBAck(),应答。

Delay_1(time),延迟一定时间。

SCCB函数有三个参数:

ID-Address主机地址,Sub-Address从地址,以及hex,如果函数用于写数据则表示待写入的数据,如果用于读数据则表示读出数据存放的位置。

规定了OV9121在写数据时的ID-Address是0x60,用于读数据时是0x61。

SCCB函数的主要构思是:

先由单片机向OV9121发送主机地址,然后发送从地址,这样构成了一个两相写数据环。

调用的函数是SCCBsendByte()。

接下来对主机地址的第八位进行读写判断。

如果是写,则依旧由单片机调用SCCBsendByte()函数向OV9121发送写数据,这样,这三次传输就构成了一个三相写数据环。

而如果是读,则由单片机再一次向OV9121发送主机地址,然后调用SCCBreceiveByte()函数,通过SIO_D数据线由OV9121向单片机写入数据,这两次传输构成了一个两相读数据环,而OV9121的寄存器地址是由上面的两相写数据环决定的。

当然,在每次传输完成之后,都需要完成一次握手。

如果传输是写,则在SCCBsendByte()函数之后需要调用SCCBRecAck()函数,对OV9121请求应答,并通过得到的应答来判断是传输成功继续进行下一步传输,还是发生错误结束程序。

如果传输是读,则在传输结束后由单片机发送一个应答信号表示成功。

由于本课题需要完成的任务是对CMOS进行配置,所以一般只需要用到三相写数据传输。

该部分的程序流程图如下图所示:

图6.写数据部分程序流程图

在main函数中,可以直接调用SCCB函数,向OV9121的指定寄存器中写入或读出数据。

程序参加附录二。

3.3硬件电路设计

选择单片机的P1.0口作为SCCB_E,P1.6作为SIO_C,P1.7作为SIO_D。

在单片机上电后,这三个口可以正常工作。

在KeilC下运行代码,观察端口P1,P1.0表示SCCB_E,P1.6表示SIO_C,P1.7表示SIO_D,如图所示:

P1.0口在程序运行时处于低电平状态,P1.6端口周期性的变化,P1.7端口按照输出数据做相应的变化。

可见代码可以正常运行,可以用于配置CMOS芯片。

用KEILC51或其他的单片机开发软件把源代码汇编成HEX文件;然后用编程器把汇编文件烧写入单片机中;再把单片机插入实验板中,可以看到软件的执行结果。

附录

附录一

引脚序号

名称

类型

功能/描述

01

SVDD

电源

为像元阵列提供3.3V电压

02

VrHIGH

模拟

传感器高参考--旁路到地使用一个0.1μF电容

03

NBIT

模拟

传感器位线参考—旁路到地使用一个0.1μF电容

04

DEVDD

电源

为传感器阵列解码器提供3.3V的电源

05

DEGND

电源

传感器阵列解码器的地线

06

VrLOW

模拟

传感器低参考--旁路到地使用一个0.1μF电容

07

PWDN

输入(0)a

掉电模式使能,高有效

08

FREX

输入(0)

快照触发器,用来激活一个快照序列

09

NC

——

无连接

10

RESET

输入(0)

芯片复位,高有效

11

SCCB_E

输入(0)

SCCB接口使能,低有效

12

EXPSTB

输入(0)

快照曝光开始触发器

0:

传感器开始曝光—只在快照模式中有效

1:

传感器保持在复位模式

13

VGA

输入(0)

传感器分辨率选择

0:

SXGA分辨率(1280x1024)

1:

VGA分辨率(640x480)

14

FSIN

输入(0)

帧同步输入

15

VcCHG

模拟

传感器参考--旁路到地使用一个0.1μF电容

16

AVDD

电源

为模拟电路提供3.3V电源

17

AGND

电源

模拟电路的地线

18

ASUB

电源

模拟电路衬底的地线

19

ArAD2

模拟

A/D转换器参考--旁路到地使用一个0.1μF电容

20

ADVDD

电源

为A/D转换器提供3.3V电源

21

ADGND

电源

A/D转换器的地线

22

DVDD

电源

为数字电路提供2.5V电源

23

DGND

电源

数字电路的地线

24

D0

输出

数字视频输出位[0]

25

D1

输出

数字视频输出位[1]

26

D2

输出

数字视频输出位[2]

27

D3

输出

数字视频输出位[3]

28

D4

输出

数字视频输出位[4]

29

XCLK1

输入

时钟晶振输入

30

XCLK2

输出

时钟晶振输出

31

PCLK

输出

像素时钟输出

32

D5

输出

数字视频输出位[5]

33

D6

输出

数字视频输出位[6]

34

D7

输出

数字视频输出位[7]

35

D8

输出

数字视频输出位[8]

36

D9

输出

数字视频输出位[9]

37

DOVDD

电源

为数字视频端口提供3.3V电源

38

DOGND

电源

数字视频端口的地线

39

HREF

输出

水平参考输出

40

CHSYNC

输出

当芯片作为主器件时输出水平同步信号

41

VSYNC

输出

当芯片作为主器件时输出垂直同步信号

42

NC

——

无连接

43

NC

——

无连接

44

NC

——

无连接

45

SIO_D

I/O

SCCB串口数据I/O

46

SIO_C

输入

SCCB串口时钟输入

47

VcCHG

模拟

传感器参考--旁路到地使用一个1μF电容

48

SGND

电源

像元阵列的地线

a.输入(0)代表一个内部下拉低电阻

附录二:

程序代码:

#include

#include

#include

/*全局符号定义*/

#defineHIGH1

#defineLOW0

#defineucharunsignedchar

#defineERRORCOUNT1

sbitSCCB_E=P1^0;

sbitSIO_C=P1^6;

sbitSIO_D=P1^7;

/*****************************************************************************/

voidmain(void)

{

bitSCCB(ucharID_Address,unsignedintsub_Address,ucharhex);

uchara=0x08,b=0x23,c=0xa0,d=0x53,e=0x4a,f=0x83,g=0x20,h=0xf6,m;

unsignedintID_Address=0x61,sub_address=0x0000;

//SCCB(0x60,0x37,a);//单屏和多屏

//SCCB(0x60,0x15,c);//水平场信号变换

//SCCB(0x60,0x18,d);SCCB(0x60,0x17,b);//水平窗口变成一行象素384个

//SCCB(0x60,0x1A,e);

//SCCB(0x60,0x10,f);//暴光时间控制

//SCCB(0x60,0x19,g);////垂直窗口调整288个行象素;;

//SCCB(0x60,0x13,h);//自动和手动暴光

SCCB(0x61,0x19,m);

}

/*提供工作时序中的起始位*/

voidSCCBstart(void)

{

SIO_D=HIGH;

SCCB_E=HIGH;

SIO_C=HIGH;

_nop_();//SIO_D的充电时间大于15ns

SCCB_E=LOW;

_nop_();//SCCB_E下降沿到SIO_D下降沿的时间差不小于1.25us

_nop_();

SIO_D=LOW;

_nop_();

SIO_C=LOW;

_nop_();

}

/*提供工作时序中的停止位*/

voidSCCBstop(void)

{

SCCB_E=LOW;

SIO_C=LOW;

SIO_D=LOW;

_nop_();

SIO_C=HIGH;

SIO_D

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 法学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1