[求助] 请问谁能解释ov7725设置分辨率的这段程序吗。

Rainbow434   2018-5-28 21:58 楼主
  1. //设置图像输出窗口
  2. //width:输出图像宽度,<=320
  3. //height:输出图像高度,<=240
  4. //mode:0,QVGA输出模式;1,VGA输出模式
  5. //QVGA模式可视范围广但近物不是很清晰,VGA模式可视范围小近物清晰
  6. void OV7725_Window_Set(u16 width,u16 height,u8 mode)
  7. {
  8.     u8 raw,temp;
  9.     u16 sx,sy;  
  10.     if(mode)
  11.     {
  12.         sx=(640-width)/2;
  13.         sy=(480-height)/2;
  14.         SCCB_WR_Reg(COM7,0x06);     //设置为VGA模式
  15.         SCCB_WR_Reg(HSTART,0x23);   //水平起始位置
  16.         SCCB_WR_Reg(HSIZE,0xA0);    //水平尺寸
  17.         SCCB_WR_Reg(VSTRT,0x07);    //垂直起始位置
  18.         SCCB_WR_Reg(VSIZE,0xF0);    //垂直尺寸
  19.         SCCB_WR_Reg(HREF,0x00);
  20.         SCCB_WR_Reg(HOutSize,0xA0); //输出尺寸
  21.         SCCB_WR_Reg(VOutSize,0xF0); //输出尺寸
  22.     }
  23.     else
  24.     {
  25.         sx=(320-width)/2;
  26.         sy=(240-height)/2;
  27.         SCCB_WR_Reg(COM7,0x46);     //设置为QVGA模式
  28.         SCCB_WR_Reg(HSTART,0x3f);   //水平起始位置
  29.         SCCB_WR_Reg(HSIZE, 0x50);   //水平尺寸
  30.         SCCB_WR_Reg(VSTRT, 0x03);   //垂直起始位置
  31.         SCCB_WR_Reg(VSIZE, 0x78);   //垂直尺寸
  32.         SCCB_WR_Reg(HREF,  0x00);
  33.         SCCB_WR_Reg(HOutSize,0x50); //输出尺寸
  34.         SCCB_WR_Reg(VOutSize,0x78); //输出尺寸
  35.     }
  36.     raw=SCCB_RD_Reg(HSTART);
  37.     temp=raw+(sx>>2);//sx高8位存在HSTART,低2位存在HREF[5:4]
  38.     SCCB_WR_Reg(HSTART,temp);
  39.     SCCB_WR_Reg(HSIZE,width>>2);//width高8位存在HSIZE,低2位存在HREF[1:0]
  40.      
  41.     raw=SCCB_RD_Reg(VSTRT);
  42.     temp=raw+(sy>>1);//sy高8位存在VSTRT,低1位存在HREF[6]
  43.     SCCB_WR_Reg(VSTRT,temp);
  44.     SCCB_WR_Reg(VSIZE,height>>1);//height高8位存在VSIZE,低1位存在HREF[2]
  45.      
  46.     raw=SCCB_RD_Reg(HREF);
  47.     temp=((sy&0x01)<<6)|((sx&0x03)<<4)|((height&0x01)<<2)|(width&0x03)|raw;
  48.     SCCB_WR_Reg(HREF,temp);
  49.      
  50.     SCCB_WR_Reg(HOutSize,width>>2);
  51.     SCCB_WR_Reg(VOutSize,height>>1);
  52.      
  53.     SCCB_RD_Reg(EXHCH);
  54.     temp = (raw|(width&0x03)|((height&0x01)<<2));
  55.     SCCB_WR_Reg(EXHCH,temp);
  56. }



在VGA模式 640*480下 几个寄存器的值(十进制)是这样的:HSTRT = 35 HSIZE = 160 VSTRT = 7 VSIZE = 240 HREF = 0 HOutSize = 160 VOutSize = 240 EXHCH = 0
子啊480*240下几个寄存器的值是这样的:HSTRT = 55 HSIZE = 120 VSTRT = 67 VSIZE = 120 HREF = 0 HOutSize = 120 VOutSize = 120 EXHCH = 0
请问论坛里有同学知道这个为什么关于分辨率的这几个寄存器要这么配置吗,看了好久手册也没找到。困扰了好几天。

回复评论 (4)

这些摄像头的寄存器设置实在没法弄,官网都没有个明白的手册,只能试通了例程就那样了,鬼才知道为啥
点赞  2018-5-29 08:27
我的理解那几个是配置行频场频信号延迟时间的,这个时间以PCLK为参照.
点赞  2018-5-29 08:31
引用: huo_hu 发表于 2018-5-29 08:27
这些摄像头的寄存器设置实在没法弄,官网都没有个明白的手册,只能试通了例程就那样了,鬼才知道为啥

确实很坑,那个手册我都翻烂了都没找到关于这个的介绍
点赞  2018-5-30 21:17
引用: huo_hu 发表于 2018-5-29 08:31
我的理解那几个是配置行频场频信号延迟时间的,这个时间以PCLK为参照.

我的理解跟你差不多,我也觉得是这几个寄存器决定摄像头从哪一行哪一列开始采集
点赞  2018-5-30 21:19
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复