找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 16211|回复: 3
打印 上一主题 下一主题
收起左侧

ov7670摄像头分辨率设置方法详解

[复制链接]
跳转到指定楼层
楼主
最近一直在纠结如何把 OV7670 输出的 图片分辨率缩小,以减少数据量来适应数据的传输, 在网上看了好多也没有关于寄存器的具体设置,最终又读了几遍数据手册,加上网友们写的 帖子的启发,总结出如下结论,希望大家批评指正。
Ov7670 的寄存器中跟分辨率有关的寄存器主要是一下几个:
0x17 HSTART               输出格式-行频开始高八位(低三位在HREF[2:0])
0x18 HSTOP              输出格式-行频结束高八位(低三位在HREF[5:3])
0x19 VSTRT               输出格式-场频开始高八位(低二位在VREF[1:0])
0x1A VSTOP              输出格式-场频结束高八位(低二位在 VREF[3:2])
0x03 VREF               位[3:2]VREF 结束的低两位(高八位见VSTOP[7:0] 位[1:0]VREF 开始的低两位(高八位见 VSTOP[7:0]
0x32 HREF              读写HREF控制 位[5:3]:HREF结束的低3位(高8位在HSTOP) 位[2:0]:HREF 结束的低 3 位(高 8 位在HSTOP)
网上给的一般的设置方式是这样的:QVGA RGB565 320*240
{0x32, 0x80},
{0x17, 0x17},
{0x18, 0x05},
{0x19, 0x02},
{0x1a, 0x7b},
{0x03, 0x0a}, 先把这几个寄存器的值计算一下可以发现设置是这样的 : HSTART               HSTOP              VSTART              VSTOP
184              40              10              490 先看一下 HREF 的意义:


可以看出 HREF 的高电平宽度等于我们所要显示的一行像素的数据的个数: HREF = WEIGHT*2;              乘以二是因为每个像素点是有两个数据
HSTOP=START +  HREF;
184 + 320*2 =  824;
可是 HSTOP 是 40;              这里的 40 是 824%784 得到的 为什么对 784 取余数可以看下数据手册中的这个图:



计算 PCLK 的参数,如下:

VSYNC: 510* Line =  3*tLine +  15*tLine +480*tLine
HREF: 784*tP = 640*tP +  144*tP
HSYNC: 784*tP =  80*tP +  45*tP +  640*tP +  19*tP VGA RGB565, YUV 30fps:
PCLK = 784 * 510 * 30 * 2(byte) = 23990400  = 24MHz



再看 VGA 和 QVGA               的区别:
通过这几幅图可以看出来 VSTART               VSTOP 这两个寄存器决定了采集的行数也就是高度 VSTART   = HEIGHT*2 +  VSTOP;
通过比较 QVGA 和 VGA 时序的区别可以看出 乘以二的 原因



这样我们就可以写一个简单的函数来设置 OV7670 的分辨率了
输入图像的行起始点,场起始点, 宽度 ,高度计算得到相应寄存器的值 编译环境:keil mdk
void OV7670_config_window(u16 startx,u16 starty,u16 width, u16 height)
{
u16 endx=(startx+width*2)%784;
u16 endy=(starty+height*2);
u8 x_reg, y_reg;
u8 state,temp;

state = rdOV7670Reg(0x32, &x_reg );
x_reg &=  0xC0;
state = rdOV7670Reg(0x03, &y_reg );
y_reg &=  0xF0;

//设置 HREF
temp = x_reg|((endx&0x7)<<3)|(startx&0x7);
state = wrOV7670Reg(0x32, temp );
temp = (startx&0x7F8)>>3;
state = wrOV7670Reg(0x17, temp );
temp = (endx&0x7F8)>>3;
state = wrOV7670Reg(0x18, temp );


//设置 VREF
temp = y_reg|((endy&0x3)<<2)|(starty&0x3);
state = wrOV7670Reg(0x03, temp );
temp = (starty&0x3FC)>>2;
state = wrOV7670Reg(0x19, temp );
temp = (endy&0x3FC)>>2;
state = wrOV7670Reg(0x1A, temp );
}




我们设置 OV7670_config_window(184,10,320,240)的图片如下:



我们设置 OV7670_config_window(184,10,160,120)的图片为:



同理设置 OV7670_config_window(184+160*2,10+120*2,160,120)的图片为:


微笑 smile


完整的pdf格式文档51黑下载地址(共4页):
ov7670分辨率设置.pdf (250.63 KB, 下载次数: 160)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:138247 发表于 2019-4-4 12:53 | 只看该作者

谢谢分享。。。
回复

使用道具 举报

板凳
ID:514567 发表于 2019-7-28 15:25 | 只看该作者
谢谢楼主,我用你的方法设置好了
回复

使用道具 举报

地板
ID:543829 发表于 2020-1-22 14:14 | 只看该作者
正好需要
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表