我需要调节摄像头镜筒厂家也像您说的调节镜筒。您可不可以推荐一个类似分化板的调试板

您的位置:
精品软件课程
快播播放器(Qvod Player)是一款基...
360安全卫士是当前功能最强、效果最好、最受...
会声会影(Corel VideoStudio...
腾讯QQ支持在线聊天、视频电话、点对点断点续...
搜狗拼音输入法是网上最流行、功能最强大的拼音...
迅雷是一款常用的下载工具,可以下载电影、视频...
小游戏推荐
出处:三联
人气:1451
您可能感兴趣的话题:
核心提示:win7电脑怎么借助qq调试摄像头?
  1、windows7系统,如下图所示;  2、下载安装软件【QQ】,如下图所示;  3、选中软件,右键单击,选择【打开】,如下图所示;  4、打开与好友的聊天窗口,如下图所示;  5、单击【向下的三角】,如下图所示;  6、单击【视频设置】,如下图所示;  7、正在启动视频组件,如下图所示;  8、我的计算机上,图中硬件表示摄像头,如下图所示;  9、设置完成后,单击【确定】,如下图所示;  以上是借助qq &win7电脑也能调试摄像头的全部内容,希望对大家有所帮助,感谢您对的支持,更多请关注2345软件大全。
相关教程推荐
相关软件推荐查看: 13836|回复: 33
【ALIENTEK 战舰STM32开发板例程系列连载+教学】第四十一章 摄像头实验
主题帖子精华
金钱128529
在线时间1140 小时
第四十一章 摄像头实验
ALIENTEK战舰STM32开发板板载了一个摄像头接口(P8),该接口可以用来连接ALIENTEK OV7670摄像头模块。本章,我们将使用STM32驱动ALIENTEK OV7670摄像头模块,实现摄像头功能。本章分为如下几个部分:
41.1 OV7670简介
41.2 硬件设计
41.3 软件设计
41.4 下载验证
41.1 OV7670简介
OV7670是OV(OmniVision)公司生产的一颗1/6寸的CMOS VGA图像传感器。该传感器体积小、工作电压低,提供单片VGA摄像头和影像处理器的所有功能。通过SCCB 总线控制,可以输出整帧、子采样、取窗口等方式的各种分辨率8位影像数据。该产品VGA图像最高达到30帧/秒。用户可以完全控制图像质量、数据格式和传输方式。所有图像处理功能过程包括伽玛曲线、白平衡、度、色度等都可以通过SCCB接口编程。OmmiVision 图像传感器应用独有的传感器技术,通过减少或消除光学或电子缺陷如固定图案噪声、托尾、浮散等,提高图像质量,得到清晰的稳定的彩色图像。
OV7670的特点有:
l& 高灵敏度、低电压适合嵌入式应用
l& 标准的SCCB接口,兼容IIC接口
l& 支持RawRGB、RGB(GBR4:2:2,RGB565/RGB555/RGB444),YUV(4:2:2)和YCbCr(4:2:2)输出格式
l& 支持VGA、CIF,和从CIF到40*30的各种尺寸输出
l& 支持自动曝光控制、自动增益控制、自动白平衡、自动消除灯光条纹、自动黑电平校准等自动控制功能。同时支持色饱和度、色相、伽马、锐度等设置。
l& 支持闪光灯
l& 支持图像缩放
OV7670的功能框图图如图41.1.1所示:
e2bfaa87a2bd1de4fccad_324.jpg (0 Bytes, 下载次数: 2)
22:54 上传
图41.1.1 OV7670功能框图
&&&&&& OV7670传感器包括如下一些功能模块。
&&&&&& 1.感光整列(Image Array)
OV7670总共有656*488个像素,其中640*480个有效(即有效像素为30W)。
&&&&&& 2.时序发生器(Video Timing Generator)
时序发生器具有的功能包括:整列控制和帧率发生(7种不同格式输出)、内部信号发生器和分布、帧率时序、自动曝光控制、输出外部时序(VSYNC、HREF/HSYNC和PCLK)。
3.模拟信号处理(Analog Processing)
模拟信号处理所有模拟功能,并包括:自动增益(AGC)和自动白平衡(AWB)。
4.A/D 转换(A/D)
原始的信号经过模拟处理器模块之后 ,分G和BR两路进入一个10 位的A/D 转换器,A/D 转换器工作在12M频率,与像素频率完全同步(转换的频率和帧率有关)。
除A/D转换器外,该模块还有以下三个功能:
l& 黑电平校正(BLC)
l& U/V通道延迟
l& A/D范围控制
A/D范围乘积和A/D的范围控制共同设置A/D的范围和最大值,允许用户根据应用调整图片的亮度。
5.测试图案发生器(Test Pattern Generator)
测试图案发生器功能包括:八色彩色条图案、渐变至黑白彩色条图案和输出脚移位“1”。
6.数字处理器(DSP)
这个部分控制由原始信号插值到RGB 信号的过程,并控制一些图像质量:
l& 边缘锐化(二维高通滤波器)
l& 颜色空间转换( 原始信号到RGB 或者YUV/YCbYCr)
l& RGB色彩矩阵以消除串扰
l& 色相和饱和度的控制
l& 黑/白点补偿
l& 镜头补偿
l& 可编程的伽玛
l& 十位到八位数据转换
7.缩放功能(Image Scaler)
这个模块按照预先设置的要求输出数据格式,能将YUV/RGB信号从VGA缩小到CIF以下的任何尺寸。
8.数字视频接口(Digital Video Port)
通过寄存器COM2[1:0],调节IOL/IOH的驱动电流,以适应用户的负载。
9.SCCB接口(SCCB Interface)
SCCB接口控制图像传感器芯片的运行,详细使用方法参照光盘的《OmniVision Technologies Seril Camera Control Bus(SCCB) Specification》这个文档
10.LED和闪光灯的输出控制(LED and Storbe Flash Control Output)
OV7670有闪光灯模式,可以控制外接闪光灯或闪光LED的工作。
OV7670的寄存器通过SCCB时序访问并设置,SCCB时序和IIC时序十分类似,在本章我们不做介绍,请大家参考光盘的相关文档。
接下来我们介绍一下OV7670的图像数据输出格式。首先我们简单介绍几个定义:
VGA,即分辨率为640*480的输出模式;
QVGA,即分辨率为320*240的输出格式,也就是本章我们需要用到的格式;
QQVGA,即分辨率为160*120的输出格式;
PCLK,即像素时钟,一个PCLK时钟,输出一个像素(或半个像素)。
VSYNC,即帧同步信号。
HREF /HSYNC,即行同步信号。
OV7670的图像数据输出(通过D[7:0])就是在PCLK,VSYNC和HREF/ HSYNC的控制下进行的。首先看看行输出时序,如图41.1.2所示:
f2d2bdff6edcbd4a851f2_840.jpg (0 Bytes, 下载次数: 3)
22:54 上传
图41.1.2 OV7670行输出时序
从上图可以看出,图像数据在HREF为高的时候输出,当HREF变高后,每一个PCLK时钟,输出一个字节数据。比如我们采用VGA时序,RGB565格式输出,每2个字节组成一个像素的颜色(高字节在前,低字节在后),这样每行输出总共有640*2个PCLK周期,输出640*2个字节。
再来看看帧时序(VGA模式),如图41.1.3所示:
f5a226b341cc776e4255efcf98aae881_819.jpg (0 Bytes, 下载次数: 2)
22:54 上传
图41.1.3 OV7670帧时序
上图清楚的表示了OV7670在VGA模式下的数据输出,注意,图中的HSYNC和HREF其实是同一个引脚产生的信号,只是在不同场合下面,使用不同的信号方式,我们本章用到的是HREF。
因为OV7670的像素时钟(PCLK)最高可达24Mhz,我们用STM32F103ZET6的IO口直接抓取,是非常困难的,也十分占耗CPU(可以通过降低PCLK输出频率,来实现IO口抓取,但是不推荐)。所以,本章我们并不是采取直接抓取来自OV7670的数据,而是通过FIFO读取,ALIENTEK OV7670摄像头模块自带了一个FIFO芯片,用于暂存图像数据,有了这个芯片,我们就可以很方便的获取图像数据了,而不再需要单片机具有高速IO,也不会耗费多少CPU,可以说,只要是个单片机,都可以通过ALIENTEK OV7670摄像头模块实现拍照的功能。
接下来我们介绍一下ALIENTEK OV7670摄像头模块。该模块的外观如图41.1.4:
e3b947e4cc82_520.jpg (0 Bytes, 下载次数: 3)
22:54 上传
图41.1.4 ALIENTEK OV7670摄像头模块外观图
模块原理图如图41.1.5所示:
aece020f_808.jpg (0 Bytes, 下载次数: 3)
22:54 上传
图41.1.5 ALIENTEK OV7670摄像头模块原理图
&&&&&& 从上图可以看出,ALIENTEK OV7670摄像头模块自带了有源晶振,用于产生12M时钟作为OV7670的XCLK输入。同时自带了稳压芯片,用于提供OV7670稳定的2.8V工作电压,并带有一个FIFO芯片(AL422B),该FIFO芯片的容量是384K字节,足够存储2帧QVGA的图像数据。模块通过一个2*9的双排排针(P1)与外部通信,与外部的通信信号如表41.1.1所示:
模块供电脚,接3.3V电源
FIFO写使能
FIFO写指针复位
SCCB通信时钟信号
FIFO读指针复位
SCCB通信数据信号
FIFO输出使能(片选)
FIFO_D[7:0]
FIFO输出数据(8位)
OV7670帧同步信号
读FIFO时钟
表41.1.1 OV7670模块信号及其作用描述
&&&&&& 下面我们来看看如何使用ALIENTEK OV7670摄像头模块(以QVGA模式,RGB565格式为例)。对于该模块,我们只关心两点:1,如何存储图像数据;2,如何读取图像数据。
&&&&&& 首先,我们来看如何存储图像数据。
&&&&&& ALIENTEK OV7670摄像头模块存储图像数据的过程为:等待OV7670同步信号àFIFO写指针复位àFIFO写使能à等待第二个OV7670同步信号àFIFO写禁止。通过以上5个步骤,我们就完成了1帧图像数据的存储。
&&&&&& 接下来,我们来看看如何读取图像数据。
&&&& 在存储完一帧图像以后,我们就可以开始读取图像数据了。读取过程为:FIFO读指针复位à给FIFO读时钟(FIFO_RCLK)à读取第一个像素高字节à给FIFO读时钟à读取第一个像素低字节à给FIFO读时钟à读取第二个像素高字节à循环读取剩余像素à结束。
&&&&&& 可以看出,ALIENTEK OV7670摄像头模块数据的读取也是十分简单,比如QVGA模式,RGB565格式,我们总共循环读取320*240*2次,就可以读取1帧图像数据,把这些数据写入LCD模块,我们就可以看到摄像头捕捉到的画面了。
&&&&&& OV7670还可以对输出图像进行各种设置,详见光盘《OV7670 中文数据手册1.01》和《OV7670 software application note》这两个文档,对AL422B的操作时序,请大家参考AL422B的数据手册。
&&&&&& 了解了OV7670模块的数据存储和读取,我们就可以开始设计代码了,本章,我们用一个外部中断,来捕捉帧同步信号(VSYNC),然后在中断里面启动OV7670模块的图像数据存储,等待下一次VSHNC信号到来,我们就关闭数据存储,然后一帧数据就存储完成了,在主函数里面就可以慢慢的将这一帧数据读出来,放到LCD即可显示了,同时开始第二帧数据的存储,如此循环,实现摄像头功能。
本章,我们将使用摄像头模块的QVGA输出(320*240),刚好和战舰STM32开发板使用的LCD模块分辨率一样,一帧输出就是一屏数据,提高速度的同时也不浪费资源。注意:ALIENTEK OV7670摄像头模块自带的FIFO是没办法缓存一帧的VGA图像的,如果使用VGA输出,那么你必须在FIFO写满之前开始读FIFO数据,保证数据不被覆盖。
41.2 硬件设计
本章实验功能简介:开机后,初始化摄像头模块(OV7670),如果初始化成功,则在LCD模块上面显示摄像头模块所拍摄到的内容。我们可以通过KEY0设置光照模式(5种模式)、通过KEY1设置色饱和度,通过KEY2设置亮度,通过WK_UP设置对比度,通过TPAD设置特效(总共7种特效)。通过串口,我们可以查看当前的帧率(这里是指LCD显示的帧率,而不是指OV7670的输出帧率),同时可以借助USMART设置OV7670的寄存器,方便大家调试。DS0指示程序运行状态。
本实验用到的硬件资源有:
1)& 指示灯DS0
2)& 5个按键(包括TPAD触摸按键)
4)& TFTLCD模块
5)& 摄像头模块
ALIENTEK OV7670摄像头模块在41.1节已经有详细介绍过,这里我们主要介绍该模块与ALIETEK 战舰STM32开发板的连接。
在开发板的左下角的2*9的P8排座,是摄像头模块/OLED模块共用接口,在第十七章,我们曾简单介绍过这个接口。本章,我们只需要将ALIENTEK OV7670摄像头模块插入这个接口即可,该接口与STM32的连接关系如图41.2.1所示:
2c0ca5c7b25f86c13eb8_320.jpg (0 Bytes, 下载次数: 2)
22:54 上传
图41.2.1 摄像头模块接口与STM32连接图
&&&&& 从上图可以看出,OV7670摄像头模块的各信号脚与STM32的连接关系为:
&&&&&& OV_SDA接PG13;
OV_SCL接PD3;
FIFO_RCLK接PB4;
FIFO_WEN接PB3;
&&&&&& FIFO_WRST接PD6;
&&&&&& FIFO_RRST接PG14;
FIFO_OE接PG15;
OV_VSYNC接PA8;
&&&&&& OV_D[7:0]接PC[7:0];
这些线的连接,战舰STM32的内部已经连接好了,我们只需要将OV7670摄像头模块插上去就好了。实物连接如图41.2.2所示:
ebf3bb3c7d63fe51a936_57.jpg (0 Bytes, 下载次数: 2)
22:54 上传
图41.2.2 OV7670摄像头模块与开发板连接实物图
41.3 软件设计
打开上一章的工程,首先在HARDWARE文件夹下新建一个OV7670的文件夹。然后新建如下文件:ov7670.c、sccb.c、ov7670.h、sccb.h、ov7670cfg.h等5个文件,将他们保存在OV7670文件夹下,并将这个文件夹加入头文件包含路径。
&&&&&& 本章总共新增了5个文件,代码比较多,我们就不一一列出了,仅挑两个重要的地方进行讲解。首先,我们来看ov7670.c里面的OV7670_Init函数,该函数代码如下:
u8 OV7670_Init(void)
&&&&&& u8 u16 i=0;&&
&&&&&& //设置IO
&&&&&& RCC-&APB2ENR|=1&&2;&&&&&&&&&&& //先使能外设PORTA时钟
&&&&&& RCC-&APB2ENR|=1&&3;&&&&&&&&&&& //先使能外设PORTB时钟
&&&&& RCC-&APB2ENR|=1&&4;&&&&&&&&&&& //先使能外设PORTC时钟
& &&& RCC-&APB2ENR|=1&&5;&&&&&&&&&&& //先使能外设PORTD时钟
&&&&&& RCC-&APB2ENR|=1&&8;&&&&&&&&&&& //先使能外设PORTG时钟&& && &
& &&& GPIOA-&CRH&=0XFFFFFFF0; &&&
& &&& GPIOA-&CRH|=0X; &&& //PA8 输入&
&&&&&& GPIOA-&ODR|=1&&8;
&& & GPIOB-&CRL&=0XFFF00FFF; & &&
& &&& GPIOB-&CRL|=0X; &&&& //PB3/4 输出
&&&&&& GPIOB-&ODR|=3&&3; &&&&
& &&& GPIOC-&CRL=0X; &&&&& //PC0~7 输入&&&
&&&&&& GPIOC-&ODR|=0x00
&& & GPIOD-&CRL&=0XF0FFFFFF; //PD6 输出&&
& &&& GPIOD-&CRL|=0X; &&&& &
&&&&& GPIOD-&ODR|=1&&6;
&& & GPIOG-&CRH&=0X00FFFFFF; &
&&&&&& GPIOG-&CRH|=0X;&&&&& &&&
&&&&&& GPIOG-&ODR=7&&14;&&&&& &&&&&&&&&&& &&&&&& //PG14/15& 输出高 &&&& &&&&
&&&&& JTAG_Set(SWD_ENABLE);
&&&&& SCCB_Init();&&&& &&&&&&&&&&& &&&&&&&&&&&&&&&&&&&& //初始化SCCB 的IO口&&&&& && & &&
&&&&& if(SCCB_WR_Reg(0x12,0x80))return 1;&&&& //复位SCCB&& &
&&&&&& delay_ms(50);
&&&&&& //读取产品型号
&&&&& temp=SCCB_RD_Reg(0x0b);&&
&&&&&& if(temp!=0x73)return 2;&
&&&&& temp=SCCB_RD_Reg(0x0a);&&
&&&&&& if(temp!=0x76)return 2;
&&&&&& //初始化序列& &
&&&&&& for(i=0;i&sizeof(ov7670_init_reg_tbl)/sizeof(ov7670_init_reg_tbl[0]);i++)
&&&&&& && & SCCB_WR_Reg(ov7670_init_reg_tbl[0],ov7670_init_reg_tbl[1]);
&&&&&&&&&&&&& delay_ms(2);
&& & return 0x00; & //ok
&&&&&& 此部分代码先初始化OV7670相关的IO口(包括SCCB_Init),然后最主要的是完成OV7670的寄存器序列初始化。OV7670的寄存器特多(百几十个),配置特麻烦,幸好厂家有提供参考配置序列(详见《OV7670 software application note》),本章我们用到的配置序列,存放在ov7670_init_reg_tbl这个数组里面,该数组是一个2维数组,存储初始化序列寄存器及其对应的值,该数组存放在ov7670cfg.h里面。
&&&&&& 接下来,我们看看ov7670cfg.h里面ov7670_init_reg_tbl的内容,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&&
&&&&&& 以上代码,我们省略了很多(全部贴出来太长了),我们大概了解下结构,每个条目的第一个字节为寄存器号(也就是寄存器地址),第二个字节为要设置的值,比如{0x3a, 0x04},就表示在0X03地址,写入0X04这个值。
&&&&&& 通过这么一长串(110多个)寄存器的配置,我们就完成了OV7670的初始化,本章我们配置OV7670工作在QVGA模式,RGB565格式输出。 在完成初始化之后,我们既可以开始读取OV7670的数据了。
&&&&&& OV7670文件夹里面的其他代码我们就不逐个介绍了,请大家参考光盘该例程源码。
&&&&&& 因为本章我们还用到了帧率(LCD显示的帧率)统计和中断处理,所以我们还需要修改timer.c、timer.h、exti.c及exti.h这几个文件。
&&&&&& 在timer.c里面,我们新增TIM6_Int_Init和TIM6_IRQHandler两个函数,用于统计帧率,增加代码如下:
u8 ov_ &&&&&& //统计帧数
//定时器6中断服务程序&&&&
void TIM6_IRQHandler(void)
{ &&&&&&&&&& &&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&& &&&&
&&&&&& if(TIM6-&SR&0X0001)//溢出中断
&&&&&& {&&&&&&&&&&&&&&&&&&&&&&&&& &&&
&&&&&&&&&&&&& printf("frame:%dfps\r\n",ov_frame);&&& //打印帧率
&&&&&&&&&&&&& ov_frame=0;&&&&&&&&& &&& &&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&& &&&&&&&&&&
&&&&&& }&&&&&&&&&&&&&&&&&&&&&&&&& &&
&&&&&& TIM6-&SR&=~(1&&0);//清除中断标志位 & &&&&
//基本定时器6中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void TIM6_Int_Init(u16 arr,u16 psc)
&&&&&& RCC-&APB1ENR|=1&&4;//TIM6时钟使能&&&
&&&&& TIM6-&ARR=& &&&&& //设定计数器自动重装值//刚好1ms&&&
&&&&&& TIM6-&gtSC=& &&&&&& //预分频器7200,得到10Khz的计数时钟
&&&&&& TIM6-&DIER|=1&&0;&& //允许更新中断&&&&&&&&&&
&&&&&& TIM6-&CR1|=0x01;&&& //使能定时器3
& &&& MY_NVIC_Init(1,3,TIM6_IRQChannel,2);//抢占1,子优先级3,组2&&&&&&&&& &&&&&&&&&&&&&
这里,我们用到基本定时器TIM6来统计帧率,也就是1秒钟中断一次,打印ov_frame的值,ov_frame用于统计LCD帧率。
再在timer.h里面添加TIM6_Int_Init函数的定义,就完成对timer.c和timer.h的修改了。
在exti.c里面添加EXTI8_Init和EXTI9_5_IRQHandler函数,用于OV7670模块的FIFO写控制,exti.c文件新增部分代码如下:
&//外部中断5~9服务程序
void EXTI9_5_IRQHandler(void)
{&&&&&&&&&&& &&&&&&&&&&&
&&&&&& if(EXTI-&gtR&(1&&8))//是8线的中断
&&&&&& {&&&&
&&&&&&&&&&&&& if(ov_sta&2)
&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&& if(ov_sta==0)
&&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&&&&&& OV7670_WRST=0;&&&&&& &&&& //复位写指针&&&&&&&& & &&&&&&&&&& &
&&&&&&&&&&&&&&&&&&&&&&&&&&& OV7670_WRST=1; OV7670_WREN=1;//允许写入FIFO& &&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&& }else
&&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&&&&&& OV7670_WREN=0;&&&&&&&&&&&& //禁止写入FIFO
&&&&&&&&&&&&&&&&&&&&&&&&&&& OV7670_WRST=0; OV7670_WRST=1;//复位写指针&&&&&&&
&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&& ov_sta++;
&&&&&&&&&&&&& }
&&&&&& EXTI-&gtR=1&&8;&&&& //清除LINE8上的中断标志位&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &
//外部中断8初始化
void EXTI8_Init(void)
{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &
&&&&&& Ex_NVIC_Config(GPIO_A,8,RTIR);&&&&&&&&& &&&&&&&&&&& //任意边沿触发&&&&&&&&&&&&&&&&&& &
&&&&&& MY_NVIC_Init(0,0,EXTI9_5_IRQChannel,2);&&&&&&&&& //抢占0,子优先级0,组2&&& &&
因为OV7670的帧同步信号(OV_VSYNC)接在PA8上面,所以我们这里配置PA8作为中端输入,因为STM32的外部中断5~9共用一个中端服务函数(EXTI9_5_IRQHandler),所以在该函数里面,我们需要先判断中断是不是来自中断线8的,然后再做处理。
中断处理部分很简单,通过一个ov_sta来控制OV7670模块的FIFO写操作。当ov_sta=0的时候,表示FIFO存储的数据已经被成功读取了(ov_sta在读完FIFO数据的时候被清零),然后只要OV_VSYNC信号到来,我们就先复位一下写指针,然后ov_sta=1,标志着写指针已经复位,目前正在往FIFO里面写数据。再等下一个OV_VSYNC到来,也就表明一帧数据已经存储完毕了,此时我们设置OV7670_WREN为0,禁止再往OV7670写入数据,此时ov_sta自增为2。其他程序,只要读到ov_sta为2,就表示一帧数据已经准备好了,可以读出,在读完数据之后,程序设置ov_sta为0,则开启下一轮FIFO数据存储。
再在exti.h里面添加EXTI8_Init函数的定义,就完成对exti.c和exti.h的修改了。
最后,打开test.c文件,修改代码如下:
const u8*LMODE_TBL[5]={"Auto","Sunny","Cloudy","Office","Home"};&&&& //5种光照模式
const u8*EFFECTS_TBL[7]={"Normal","Negative","B&W","Redish","Greenish","Bluish",
"Antique"};//7种特效
extern u8 ov_&&& &&&&&& //在exit.c里面定义
extern u8 ov_&&&&& //在timer.c里面定义&&&&&&&&&&
//更新LCD显示
void camera_refresh(void)
&&&&&& u32 u16 &&&&&&&&& &
&&&&&& if(ov_sta==2)
&&&&&&&&&&&&& LCD_Scan_Dir(U2D_L2R);&&&&&&&& &&&&&& //从上到下,从左到右
&&&&&&&&&&&&& LCD_SetCursor(0x00,0x0000);&&&& &&&&&& //设置光标位置
&&&&&&&&&&&&& LCD_WriteRAM_Prepare();&&& & &&&&& //开始写入GRAM
&&&&&&&&&&&&& OV7670_RRST=0;&&&&&&&&&&&&&&&&&&&&& &&&&&& //开始复位读指针
&&&&&&&&&&&&& OV7670_RCK=0;
&&&&&&&&&&&&& OV7670_RCK=1;
&&&&&&&&&&&&& OV7670_RCK=0;
&&&&&&&&&&&&& OV7670_RRST=1;&&&&&&&&&&&&&&&&&&&&& &&&&&& //复位读指针结束
&&&&&&&&&&&&& OV7670_RCK=1;&
&&&&&&&&&&&&& for(j=0;j&76800;j++)
&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&& OV7670_RCK=0;
&&&&&&&&&&&&&&&&&&&& color=GPIOC-&IDR&0XFF; &&&&&& //读数据
&&&&&&&&&&&&&&&&&&&& OV7670_RCK=1;
&&&&&&&&&&&&&&&&&&&& color&&=8;&
&&&&&&&&&&&&&&&&&&&& OV7670_RCK=0;
&&&&&&&&&&&&&&&&&&&& color|=GPIOC-&IDR&0XFF;&&&&&& &&&&&& //读数据
&&&&&&&&&&&&&&&&&&&& OV7670_RCK=1;
&&&&&&&&&&&&&&&&&&&& LCD-&LCD_RAM=&&&
&&&&&&&&&&&&& }&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &
&&&&&&&&&&&&& EXTI-&gtR=1&&8;&&&& &&&&&&&&&&&&&&&&&&&& &&&&&& //清除LINE8上的中断标志位
&&&&&&&&&&&&& ov_sta=0;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&& //开始下一次采集
&&&&&&&&&&&& ov_frame++;
&&&&&&&&&&&&& LCD_Scan_Dir(DFT_SCAN_DIR);&&&&& //恢复默认扫描方向
int main(void)
{&&&&&&&&&&&
&&&&&& u8 u8 effect=0; u8 i=0;& u8 tm=0;
&&&&&& u8 lightmode=0,saturation=2,brightness=2,contrast=2;&&&&&&&&&&&&& &&&
&&&&&& u8 msgbuf[15];&&&&&&&&&&&&&&&&&&& //消息缓存区&
&&&&& Stm32_Clock_Init(9);&&& &&&&&& //系统时钟设置
&&&&&& uart_init(72,9600); &&&& &&&&&& //串口初始化为9600
&&&&&& delay_init(72);&&&&&& && & &&&&& &&&&&& //延时初始化
& &&& OV7670_Init();
&&&&&& LED_Init();&&&&&&&&&& & &&&&&&&&&& //初始化与LED连接的硬件接口
&&&&&& LCD_Init();&&&&&&&&&&&&&&&&& && & //初始化LCD
&&&&&& usmart_dev.init(72);&&&&& &&&&&& //初始化USMART&&&&&&&
&&&&& KEY_Init();&&&&&&&&&&&&&&&&&&&&&&&& //按键初始化&
&&&&&& TPAD_Init(72);&&&&&&&&&&&&&&&&&&& //触摸按键初始化 &&&&&&&&&&&&&&&&&&&& &&&&
&&&&& POINT_COLOR=RED;//设置字体为红色
&&&&&& LCD_ShowString(60,50,200,16,16,"WarShip STM32");&&&
&&&&&& LCD_ShowString(60,70,200,16,16,"OV7670 TEST");&&&&&&
&&&&&& LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
&&&&&& LCD_ShowString(60,110,200,16,16,"");&
&&&&&& LCD_ShowString(60,130,200,16,16,"KEY0ight Mode");
&&&&&& LCD_ShowString(60,150,200,16,16,"KEY1:Saturation");
&&&&&& LCD_ShowString(60,170,200,16,16,"KEY2:Brightness");
&&&&&& LCD_ShowString(60,190,200,16,16,"KEY_UP:Contrast");
&&&&&& LCD_ShowString(60,210,200,16,16,"TPAD:Effects");&&&&&&
& &&& LCD_ShowString(60,230,200,16,16,"OV7670 Init...");&&&& &
&&&&&& while(OV7670_Init())//初始化OV7670
&&&&&&&&&&&&& LCD_ShowString(60,230,200,16,16,"OV7670 Error!!"); delay_ms(200);&&&&&&&
&&&&&& &&& LCD_Fill(60,230,239,246,WHITE); delay_ms(200);&&&&&&&&&
&&&&& LCD_ShowString(60,230,200,16,16,"OV7670 Init OK");
&&&&&& delay_ms(1500);&&& &&&& &&&
&&&&&& OV7670_Light_Mode(lightmode);
&&&&&& OV7670_Color_Saturation(saturation);
&&&&&& OV7670_Brightness(brightness);
&&&&&& OV7670_Contrast(contrast);
&&&&& OV7670_Special_Effects(effect);& &&&&
&&&&&& TIM6_Int_Init();&&&&&&&&&&&&&& &&&&&& //10Khz计数频率,1秒钟中断&&&&&
&&&&&& EXTI8_Init();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&& //使能定时器捕获
&&&&&& OV7670_Window_Set(10,174,240,320);&&&&& //设置窗口&&&& &
& &&& OV7670_CS=0;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&& &
&&&&& while(1)
&&&&&& {&&&&
&&&&&&&&&&&&& key=KEY_Scan(0);//不支持连按
&&&&&&&&&&&&& if(key)
&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&& tm=20;
&&&&&&&&&&&&&&&&&&&& switch(key)
&&&&&&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&&&& & &&
&&&&&&&&&&&&&&&&&&&&&&&&&&& case KEY_RIGHT: //灯光模式Light Mode
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& lightmode++;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& if(lightmode&4)lightmode=0;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& OV7670_Light_Mode(lightmode);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& sprintf((char*)msgbuf,"%s",LMODE_TBL[lightmode]);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&& case KEY_DOWN: //饱和度Saturation
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& saturation++;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& if(saturation&4)saturation=0;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& OV7670_Color_Saturation(saturation);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& sprintf((char*)msgbuf,"Saturation:%d",(signed char)saturation-2);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&& case KEY_LEFT:&& //亮度Brightness&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& brightness++;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& if(brightness&4)brightness=0;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& OV7670_Brightness(brightness);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& sprintf((char*)msgbuf,"Brightness:%d",(signed char)brightness-2);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&& case KEY_UP:&&&&&& //对比度Contrast&&&&&&&&&&&&&&&& &&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& contrast++;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& if(contrast&4)contrast=0;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& OV7670_Contrast(contrast);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& sprintf((char*)msgbuf,"Contrast:%d",(signed char)contrast-2);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&& }
&&&&&&&&&&&&& if(TPAD_Scan(0))//检测到触摸按键
&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&& effect++;
&&&&&&&&&&&&&&&&&&&& if(effect&6)effect=0;
&&&&&&&&&&&&&&&&&&&& OV7670_Special_Effects(effect);//设置特效
&&&&&& &&&&&&&&&&&& sprintf((char*)msgbuf,"%s",EFFECTS_TBL[effect]);
&&&&&&&&&&&&&&&&&&&& tm=20;
&&&&&&&&&&&&& }
&&&&&&&&&&&&& camera_refresh();//更新显示
&&&&&&&&&&&& if(tm) { LCD_ShowString(60,60,200,16,16,msgbuf); tm--;}&&&&
&&&&&&&&&&&&& i++;
&&&&&&&&&&&&& if(i==15) { i=0;LED0=!LED0;}&& //DS0闪烁.
&&&&&& }&&&& &&
此部分代码除了mian函数,还有一个camera_refresh函数,该函数用于将摄像头模块FIFO的数据读出,并显示在LCD上面。main函数则比较简单,我们就不细说了。
前面提到,我们要用USMART来设置摄像头的参数,我们只需要在usmart_nametab里面添加SCCB_WR_Reg和SCCB_RD_Reg这两个函数,就可以轻松调试摄像头了。
41.4 下载验证
在代码编译成功之后,我们通过下载代码到ALIENTEK战舰STM32开发板上,得到如图41.4.1所示界面:
e1f0e91c6e7dc4ff920b8ef8dbb198e0_126.jpg (0 Bytes, 下载次数: 3)
22:54 上传
图41.4.1 程序运行效果图
随后,进入监控界面。此时,我们可以按不同的按键(KEY0~KEY2、WK_UP、TPAD等),来设置摄像头的相关参数和模式,得到不同的成像效果。 同时,你还可以在串口,通过USMART调用SCCB_WR_Reg函数,来设置OV7670的各寄存器,达到调试测试OV7670的目的,如图41.4.2所示:
1335cee3db3c9880cdc59f_382.jpg (0 Bytes, 下载次数: 2)
22:54 上传
图41.4.2 USMART调试OV7670
&&&&&& 从上图还可以看出,LCD显示帧率为8帧左右,则可以推断OV7670的输出帧率则至少是3*8=24帧以上(实际是30帧)。
cd414ba.png (0 Bytes, 下载次数: 3)
22:54 上传
23:01 上传
点击文件名下载附件
185.03 KB, 下载次数: 2089
23:01 上传
点击文件名下载附件
874.29 KB, 下载次数: 4509
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
主题帖子精华
初级会员, 积分 56, 距离下一级还需 144 积分
在线时间1 小时
沙发!!谢谢斑竹分享!!学习学习!
主题帖子精华
中级会员, 积分 320, 距离下一级还需 180 积分
在线时间12 小时
回复【楼主位】正点原子:
---------------------------------
请教原子大侠,我的显示只有2fps,直接刷你的源程序也是这样,可能是什么原因啊?怎么排查?谢谢!
主题帖子精华
金钱128529
在线时间1140 小时
回复【3楼】ilikerome:
---------------------------------
2帧不止吧。。。
战舰板上测试的?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
主题帖子精华
中级会员, 积分 320, 距离下一级还需 180 积分
在线时间12 小时
回复【4楼】正点原子:
---------------------------------
是的,找到原因了,跳线帽没有把ADC与TPAD连到一起去,导致在TPAD检测这里循环了很长时间。
原子大侠什么时候推一个带任务调度的比较实用的教程吧,现在这个delay实在伤不起。
还有你的xmos&HIFI啥时候搞好啊,等着买个呢。
主题帖子精华
金钱128529
在线时间1140 小时
回复【5楼】ilikerome:
---------------------------------
呵呵,战舰板的ucosii例程,还不好用么?
delay和ucosii的delay共存,我觉得非常方便啊。
XMOS预计还需2个月左右,现在样机已经基本完成,细节改善中。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
主题帖子精华
中级会员, 积分 320, 距离下一级还需 180 积分
在线时间12 小时
回复【6楼】正点原子:
---------------------------------
还没搞到ucosii那里呢。
ok,先买的能不能等你后续的改进型搞好了,换购啊,哈哈。
主题帖子精华
金钱128529
在线时间1140 小时
回复【7楼】ilikerome:
---------------------------------
啥意思?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
主题帖子精华
中级会员, 积分 320, 距离下一级还需 180 积分
在线时间12 小时
回复【8楼】正点原子:
-----------------------------
你的HIFI肯定会有后续升级了,那么买的比较早的可否拿老的加价换购新的,就像手机换购一样,哈哈。
主题帖子精华
金钱128529
在线时间1140 小时
回复【9楼】ilikerome:
---------------------------------
额,这个还没确定。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
主题帖子精华
中级会员, 积分 320, 距离下一级还需 180 积分
在线时间12 小时
回复【10楼】正点原子:
---------------------------------
哈哈。
主题帖子精华
新手入门, 积分 25, 距离下一级还需 -5 积分
在线时间0 小时
求大神解释&&&void&EXTI9_5_IRQHandler(void)&&这个函数中的一个语句:
{
&&&&&&&&&&&&OV7670_WRST=0;&&&&&&&&&&&&//复位写指针&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&OV7670_WRST=1;
&&&&&&&&&&&&OV7670_WREN=1;//允许写入FIFO&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&OV7670_WREN=0;&&&&&&&&&&&&&//禁止写入FIFO
&&&&&&&&&&&&OV7670_WRST=0;&
&&&&&&&&&&&&OV7670_WRST=1;//复位写指针&&
AL422B的数据手册中说&写使能&端是低电平有效,为什么这里允许写入FIFO&是将&写使能&端&置位为高电平呢?
主题帖子精华
金钱128529
在线时间1140 小时
你得看看我们模块的原理图,看看是不是有什么74系列的芯片在呢?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
主题帖子精华
新手入门, 积分 25, 距离下一级还需 -5 积分
在线时间0 小时
回复【13楼】正点原子:
---------------------------------
多谢原子哥指点,光看程序了,忽略了电路图上的与非门芯片。但对于这个芯片的具体功能不是太理解,只有在正常输出像素信号时才允许或禁止写操作,而在恰好换行时(HREF为低电平时),写操作被禁止,这样可能忽略一帧信号,是为了数据稳定吗?
主题帖子精华
新手入门, 积分 35, 距离下一级还需 -15 积分
在线时间0 小时
请教一下,为什么我在通过USMART调用函数时,会显示错误?我用的是MINI板,源码也是使用MINI板的例程。
主题帖子精华
金钱128529
在线时间1140 小时
回复【15楼】亲王艾德瑞:
---------------------------------
截图看看.
回复【14楼】Lee_C:
---------------------------------
HREF操作的时候,不会忽略一帧啊.
VSYNC后面,有好多HREF呢...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
主题帖子精华
新手入门, 积分 35, 距离下一级还需 -15 积分
在线时间0 小时
回复【16楼】正点原子:
---------------------------------
原来是参数写错&了。
主题帖子精华
新手入门, 积分 35, 距离下一级还需 -15 积分
在线时间0 小时
有没有完整的摄像头模块接口与STM32连接图?未标出的是不是不影响使用。
主题帖子精华
金钱128529
在线时间1140 小时
&回复【18楼】 亲王艾德瑞 :
---------------------------------
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
主题帖子精华
新手入门, 积分 35, 距离下一级还需 -15 积分
在线时间0 小时
回复【19楼】正点原子:
---------------------------------
这个模板是怎样运作的?可以简要说明一下吗,光看代码已经看得头大了...
主题帖子精华
金钱128529
在线时间1140 小时
回复【20楼】亲王艾德瑞:
---------------------------------
看战舰板OV7670摄像头实验.
在STM32开发指南,有介绍.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
主题帖子精华
新手入门, 积分 35, 距离下一级还需 -15 积分
在线时间0 小时
回复【21楼】正点原子:
---------------------------------
谢谢
主题帖子精华
初级会员, 积分 175, 距离下一级还需 25 积分
在线时间40 小时
谢谢lz的分享!!正在学习
主题帖子精华
初级会员, 积分 92, 距离下一级还需 108 积分
在线时间2 小时
回复【6楼】正点原子:
---------------------------------
原子哥,最近在弄摄像头,我想只采集黑色与白色(做循迹小车),图像改怎么处理呢?怎么采集黑色或者白色呢?
主题帖子精华
金钱128529
在线时间1140 小时
回复【24楼】冬迹:
---------------------------------
论坛搜索:灰度
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
主题帖子精华
新手入门, 积分 21, 距离下一级还需 -1 积分
在线时间0 小时
请教原子哥,你的摄像头例程可以用在OV2640上吗?我借鉴你的代码,有像素同步和帧同步,但是数据线只有D5有波形啊,其他引脚没有反映。求助
主题帖子精华
金钱128529
在线时间1140 小时
回复【26楼】代洪波:
---------------------------------
ov的例程。见我们F4的开发板例程。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
主题帖子精华
高级会员, 积分 691, 距离下一级还需 309 积分
在线时间69 小时
回复【27楼】正点原子:
---------------------------------
怎么没找到呢,能发个链接吗
淘宝小店,没事可以点一下增加点流量http://shop.taobao.com/
主题帖子精华
金钱128529
在线时间1140 小时
回复【28楼】yuanxinfei:
---------------------------------
论坛搜索:ATK-OV2640
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
主题帖子精华
新手入门, 积分 27, 距离下一级还需 -7 积分
在线时间0 小时
初始化失败是怎么回事?
主题帖子精华
金钱128529
在线时间1140 小时
回复【30楼】masosam:
---------------------------------
可能硬件连接问题
也可能模块坏了.
还有可能代码有问题.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
主题帖子精华
新手入门, 积分 44, 距离下一级还需 -24 积分
在线时间6 小时
原子哥,请问如何可以读取出摄像头采集到的图像数据吗?
主题帖子精华
初级会员, 积分 79, 距离下一级还需 121 积分
在线时间25 小时
原子哥,我想直接让fifo数据直接bmp编码,然后存储在sd卡中。不通过lcd,请问怎么实现呢?
主题帖子精华
初级会员, 积分 95, 距离下一级还需 105 积分
在线时间19 小时
原子哥,如果要存储视频的话是不是通过寄存器COM2[1:0]来实现啊?
Powered by

我要回帖

更多关于 电脑摄像头调节曝光 的文章

 

随机推荐