鹰眼摄像头(OV7725)的使用

来源:互联网 发布:c4dr19中文版软件下载 编辑:程序博客网 时间:2024/04/28 00:03

原载:http://blog.csdn.net/lxk7280/article/details/26975233?utm_source=tuicool


凭借着OV7620,将已经调好速度控制和角度控制的车子能跑起来了。基础功能实现后就开始对车子优化了。

一个好的人眼睛最重要,同样对于一个好的平衡车,摄像头传感器最重要。因此我决心首先做的是对摄像头的优化。


方针:

OV7620  -->  OV7725(鹰眼摄像头)    使用:KEIL 鹰眼摄像头 超核库


OV7620的缺点:

OV7620是1/3”CMOS彩色/黑白图像传感器。它支持连续和隔行两种扫描方式,VGA与QVGA两种图像格式;最高像素为664×492,帧速率为30fps。而他的缺点正是在此,帧速率太低。每秒中只能产生30唱图像。可以确定他的VSYNC信号为30HZ。

  帧速率不高为何是缺点:
 因为车子跑到一定速度之后,图像变化很快,帧的速率低导致了道路实时性差,不能够及时刷新道路情况。所以会影响智能车的提速。

鹰眼摄像头(OV7725)的优点:
1.高达150HZ的帧频率。
2.硬件二值化。(也有人认为是缺点。)
3.BGA封装:
但是鹰眼的制造商野火,采用捆绑销售,每次买的时候必须购买套装。不过商家也是为了购买者着想,因为很多人不会自己驱动OV7725,只会对例程进行修改,不会移植,这样的购买者买套件确实也不失为一个好方法。
不过博主比较穷,在一番软磨之下,商家给我单卖了一个鹰眼摄像头(OV7725),在此谢谢商家了。


驱动鹰眼的步骤:
1.知道该款摄像头的工作特点和方式。
 
  


第一大步:理解时序图。
2.在我介绍OV7620的使用http://blog.csdn.net/lxk7280/article/details/22207001)的时候,就说了理解时序图是驱动一款摄像头的重中之重。尤其是对于鹰眼这款比较特殊的摄像头。


接下来一个必须理解的地方,否则就驱动不了该款摄像头。
那就是:鹰眼摄像头的一个PCLK信号传来的时候,会传输8个像素点。而不是OV7620的一个PCLK信号,对应1个像素点。
So:如果一行为80个点,那么一个行信号中只会有10个PCLK信号,而不是80个PCLK信号。
示例:采集到:0xFF 0X00  。  对应二值化的像素点。 黑黑黑黑白白白白

为了更好的让自己理解鹰眼摄像头的时序图,我在实验室的示波器上仔细看了下各个信号的波形。如下图:

场信号和行信号波形:


看完这么多关于时序图的波形后,相信大家对鹰眼摄像头的波形都了解了。


接下来开始进攻第二大部分:SCCB的操作。 
 3. 没有对SCCB进行操作,就没办法操作摄像头。

有人会奇怪为什么使用OV系列的摄像头每次都要进行SCCB的操作呢?难道它自己不会保存上次的操作结果吗?

原因是:OV系列的摄像头的寄存器是EEPROM,不稳定,数据很容易丢失,因此程序每次初始化时我们都要重新写入寄存器设置。

需要修改的寄存器有,PCLK速率,帧率、图像亮度、对比度、色饱和度、镜像等功能。



步骤:

首先给出OV7725的SCCB各个功能对应的寄存器的写入值:

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. #ifndef _OV7725_REG_H_  
  2. #define _OV7725_REG_H_  
  3.   
  4. #define OV7725_ID           0x21  
  5.   
  6.   
  7. #define OV7725_GAIN      0x00  
  8. #define OV7725_BLUE      0x01  
  9. #define OV7725_RED       0x02  
  10. #define OV7725_GREEN     0x03  
  11. #define OV7725_BAVG      0x05  
  12. #define OV7725_GAVG      0x06  
  13. #define OV7725_RAVG      0x07  
  14. #define OV7725_AECH      0x08  
  15. #define OV7725_COM2      0x09  
  16. #define OV7725_PID       0x0A  
  17. #define OV7725_VER       0x0B  
  18. #define OV7725_COM3      0x0C  
  19. #define OV7725_COM4      0x0D  
  20. #define OV7725_COM5      0x0E  
  21. #define OV7725_COM6      0x0F  
  22. #define OV7725_AEC       0x10  
  23. #define OV7725_CLKRC     0x11  
  24. #define OV7725_COM7      0x12  
  25. #define OV7725_COM8      0x13  
  26. #define OV7725_COM9      0x14  
  27. #define OV7725_COM10     0x15  
  28. #define OV7725_REG16     0x16  
  29. #define OV7725_HSTART    0x17  
  30. #define OV7725_HSIZE     0x18  
  31. #define OV7725_VSTRT     0x19  
  32. #define OV7725_VSIZE     0x1A  
  33. #define OV7725_PSHFT     0x1B  
  34. #define OV7725_MIDH      0x1C  
  35. #define OV7725_MIDL      0x1D  
  36. #define OV7725_LAEC      0x1F  
  37. #define OV7725_COM11     0x20  
  38. #define OV7725_BDBase    0x22  
  39. #define OV7725_BDMStep   0x23  
  40. #define OV7725_AEW       0x24  
  41. #define OV7725_AEB       0x25  
  42. #define OV7725_VPT       0x26  
  43. #define OV7725_REG28     0x28  
  44. #define OV7725_HOutSize  0x29  
  45. #define OV7725_EXHCH     0x2A  
  46. #define OV7725_EXHCL     0x2B  
  47. #define OV7725_VOutSize  0x2C  
  48. #define OV7725_ADVFL     0x2D  
  49. #define OV7725_ADVFH     0x2E  
  50. #define OV7725_YAVE      0x2F  
  51. #define OV7725_LumHTh    0x30  
  52. #define OV7725_LumLTh    0x31  
  53. #define OV7725_HREF      0x32  
  54. #define OV7725_DM_LNL    0x33  
  55. #define OV7725_DM_LNH    0x34  
  56. #define OV7725_ADoff_B   0x35  
  57. #define OV7725_ADoff_R   0x36  
  58. #define OV7725_ADoff_Gb  0x37  
  59. #define OV7725_ADoff_Gr  0x38  
  60. #define OV7725_Off_B     0x39  
  61. #define OV7725_Off_R     0x3A  
  62. #define OV7725_Off_Gb    0x3B  
  63. #define OV7725_Off_Gr    0x3C  
  64. #define OV7725_COM12     0x3D  
  65. #define OV7725_COM13     0x3E  
  66. #define OV7725_COM14     0x3F  
  67. #define OV7725_COM16     0x41  
  68. #define OV7725_TGT_B     0x42  
  69. #define OV7725_TGT_R     0x43  
  70. #define OV7725_TGT_Gb    0x44  
  71. #define OV7725_TGT_Gr    0x45  
  72. #define OV7725_LC_CTR    0x46  
  73. #define OV7725_LC_XC     0x47  
  74. #define OV7725_LC_YC     0x48  
  75. #define OV7725_LC_COEF   0x49  
  76. #define OV7725_LC_RADI   0x4A  
  77. #define OV7725_LC_COEFB  0x4B  
  78. #define OV7725_LC_COEFR  0x4C  
  79. #define OV7725_FixGain   0x4D  
  80. #define OV7725_AREF1     0x4F  
  81. #define OV7725_AREF6     0x54  
  82. #define OV7725_UFix      0x60  
  83. #define OV7725_VFix      0x61  
  84. #define OV7725_AWBb_blk  0x62  
  85. #define OV7725_AWB_Ctrl0 0x63  
  86. #define OV7725_DSP_Ctrl1 0x64  
  87. #define OV7725_DSP_Ctrl2 0x65  
  88. #define OV7725_DSP_Ctrl3 0x66  
  89. #define OV7725_DSP_Ctrl4 0x67  
  90. #define OV7725_AWB_bias  0x68  
  91. #define OV7725_AWBCtrl1  0x69  
  92. #define OV7725_AWBCtrl2  0x6A  
  93. #define OV7725_AWBCtrl3  0x6B  
  94. #define OV7725_AWBCtrl4  0x6C  
  95. #define OV7725_AWBCtrl5  0x6D  
  96. #define OV7725_AWBCtrl6  0x6E  
  97. #define OV7725_AWBCtrl7  0x6F  
  98. #define OV7725_AWBCtrl8  0x70  
  99. #define OV7725_AWBCtrl9  0x71  
  100. #define OV7725_AWBCtrl10 0x72  
  101. #define OV7725_AWBCtrl11 0x73  
  102. #define OV7725_AWBCtrl12 0x74  
  103. #define OV7725_AWBCtrl13 0x75  
  104. #define OV7725_AWBCtrl14 0x76  
  105. #define OV7725_AWBCtrl15 0x77  
  106. #define OV7725_AWBCtrl16 0x78  
  107. #define OV7725_AWBCtrl17 0x79  
  108. #define OV7725_AWBCtrl18 0x7A  
  109. #define OV7725_AWBCtrl19 0x7B  
  110. #define OV7725_AWBCtrl20 0x7C  
  111. #define OV7725_AWBCtrl21 0x7D  
  112. #define OV7725_GAM1      0x7E  
  113. #define OV7725_GAM2      0x7F  
  114. #define OV7725_GAM3      0x80  
  115. #define OV7725_GAM4      0x81  
  116. #define OV7725_GAM5      0x82  
  117. #define OV7725_GAM6      0x83  
  118. #define OV7725_GAM7      0x84  
  119. #define OV7725_GAM8      0x85  
  120. #define OV7725_GAM9      0x86  
  121. #define OV7725_GAM10     0x87  
  122. #define OV7725_GAM11     0x88  
  123. #define OV7725_GAM12     0x89  
  124. #define OV7725_GAM13     0x8A  
  125. #define OV7725_GAM14     0x8B  
  126. #define OV7725_GAM15     0x8C  
  127. #define OV7725_SLOP      0x8D  
  128. #define OV7725_DNSTh     0x8E  
  129. #define OV7725_EDGE0     0x8F  
  130. #define OV7725_EDGE1     0x90  
  131. #define OV7725_DNSOff    0x91  
  132. #define OV7725_EDGE2     0x92  
  133. #define OV7725_EDGE3     0x93  
  134. #define OV7725_MTX1      0x94  
  135. #define OV7725_MTX2      0x95  
  136. #define OV7725_MTX3      0x96  
  137. #define OV7725_MTX4      0x97  
  138. #define OV7725_MTX5      0x98  
  139. #define OV7725_MTX6      0x99  
  140. #define OV7725_MTX_Ctrl  0x9A  
  141. #define OV7725_BRIGHT    0x9B  
  142. #define OV7725_CNST      0x9C  
  143. #define OV7725_UVADJ0    0x9E  
  144. #define OV7725_UVADJ1    0x9F  
  145. #define OV7725_SCAL0     0xA0  
  146. #define OV7725_SCAL1     0xA1  
  147. #define OV7725_SCAL2     0xA2  
  148. #define OV7725_SDE       0xA6  
  149. #define OV7725_USAT      0xA7  
  150. #define OV7725_VSAT      0xA8  
  151. #define OV7725_HUECOS    0xA9  
  152. #define OV7725_HUESIN    0xAA  
  153. #define OV7725_SIGN      0xAB  
  154. #define OV7725_DSPAuto   0xAC  
  155.   
  156. #endif //_OV7725_REG_H_  


接着,对一些驱动OV7725时需要用到的值进行宏定义。

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. #ifndef _OV7725_EAGLE_H_  
  2. #define _OV7725_EAGLE_H_  
  3.   
  4. #include "OV7725_REG.h"  
  5. #define uint8 unsigned char  
  6. #define uint16 unsigned short   
  7.   
  8. //行中断  
  9. #define OV7725_HREF_PORT  PTA  
  10. #define OV7725_HREF_PIN   14  
  11. //场中断  
  12. #define OV7725_VSYNC_PORT PTB  
  13. #define OV7725_VSYNC_PIN  10  
  14. //像素中断  
  15. #define OV7725_PCLK_PORT  PTE  
  16. #define OV7725_PCLK_PIN  3  
  17. //配置摄像头 属性?  
  18. #define MAX_ROW            20                                    //定义摄像头图像宽度  
  19. #define MAX_COL            200                                    //定义摄像头图像高度  
  20.   
  21. typedef struct  
  22. {  
  23.     uint8 addr;                 /*寄存器地址*/  
  24.     uint8 val;                   /*寄存器值*/  
  25. } reg_s;  
  26.   
  27. /*返回数组元素的个数*/  
  28. #define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( ((a)[0]) ) )  
  29.   
  30. extern  uint8   ov7725_eagle_init(uint8 *imgaddr);  
  31. extern  void    ov7725_eagle_get_img(void);  
  32.   
  33.   
  34. #endif  //_OV7725_EAGLE_H_  

然后,撰写关于鹰眼摄像头的函数:

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. #include "sys.h"  
  2. #include "gpio.h"  
  3. #include "delay.h"  
  4. #include "dma.h"  
  5. #include "ftm.h"  
  6. #include "lptm.h"  
  7. #include "flash.h"  
  8. #include "stdio.h"  
  9. #include "uart.h"  
  10. #include "OV7725_REG.h"  
  11. #include "OV7725_Eagle.h"  
  12. #include "sccb.h"  
  13.   
  14. #define OV7725_EAGLE_Delay_ms(time)  DelayMs(time)  
  15.   
  16. volatile extern unsigned int        Col_Num,Col;//行计数  
  17. volatile extern unsigned char     Image[MAX_COL][MAX_ROW];  
  18. volatile extern unsigned char Flag;  
  19.   
  20. uint8   *ov7725_eagle_img_buff;  
  21.   
  22. //内部函数声明  
  23. static uint8 ov7725_eagle_reg_init(void);   //鹰眼 寄存器 初始化  
  24. static void ov7725_eagle_port_init();           //鹰眼 引脚 初始化  
  25.   
  26. void OV7725_Init()  
  27. {  
  28.     while(ov7725_eagle_reg_init() == 0);  
  29.     ov7725_eagle_port_init();  
  30. }  
  31.   
  32. /*! 
  33.  *  @brief      鹰眼ov7725管脚初始化(内部调用) 
  34.  *  @since      v5.0 
  35.  */  
  36. void ov7725_eagle_port_init()  
  37. {  
  38.     unsigned int i;  
  39.     GPIO_InitTypeDef GPIO_InitStruct1;  
  40.     DMA_InitTypeDef DMA_InitStruct1;  
  41.     //数据IO口初始化  
  42.     for(i=0;i<8;i++)  
  43.     {  
  44.         GPIO_InitStruct1.GPIO_Pin = i;  
  45.         GPIO_InitStruct1.GPIO_InitState = Bit_SET;  
  46.         GPIO_InitStruct1.GPIO_IRQMode = GPIO_IT_DISABLE;  
  47.         GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
  48.         GPIO_InitStruct1.GPIOx = PTD;  
  49.         GPIO_Init(&GPIO_InitStruct1);  
  50.     }  
  51.     //像素中断 PCLK 初始化  
  52.     GPIO_InitStruct1.GPIO_Pin = OV7725_PCLK_PIN;  
  53.     GPIO_InitStruct1.GPIO_InitState = Bit_SET;  
  54.     GPIO_InitStruct1.GPIO_IRQMode = GPIO_IT_DMA_RISING;  
  55.     GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_IPD;  
  56.     GPIO_InitStruct1.GPIOx = OV7725_PCLK_PORT;  
  57.     GPIO_Init(&GPIO_InitStruct1);  
  58.   
  59.     //行中断 HREF 初始化  
  60.     GPIO_InitStruct1.GPIO_Pin = OV7725_HREF_PIN;  
  61.     GPIO_InitStruct1.GPIO_InitState = Bit_SET;  
  62.     GPIO_InitStruct1.GPIO_IRQMode = GPIO_IT_RISING;  
  63.     GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_IPD;  
  64.     GPIO_InitStruct1.GPIOx = OV7725_HREF_PORT;  
  65.     GPIO_Init(&GPIO_InitStruct1);  
  66.   
  67.     // 场中断 VSYNC 初始化  
  68.     GPIO_InitStruct1.GPIO_Pin = OV7725_VSYNC_PIN;  
  69.     GPIO_InitStruct1.GPIO_InitState = Bit_SET;  
  70.     GPIO_InitStruct1.GPIO_IRQMode = GPIO_IT_RISING;   //GPIO_IT_RISING  
  71.     GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_IPD;   //GPIO_Mode_IPD  
  72.     GPIO_InitStruct1.GPIOx = OV7725_VSYNC_PORT;  
  73.     GPIO_Init(&GPIO_InitStruct1);  
  74.   
  75.   //配置DMA  
  76. //   DMA_InitStruct1.Channelx          = DMA_CH1;         //DMA 1通道  
  77. //   DMA_InitStruct1.PeripheralDMAReq   =PORTE_DMAREQ;    //C端口(PCLK) 上升呀触发      
  78. //   DMA_InitStruct1.MinorLoopLength = 170;               //传输次数 超过摄像头每行像素数即可  
  79. //  DMA_InitStruct1.TransferBytes = 1;                   //每次传输1个字节         
  80. //  DMA_InitStruct1.DMAAutoClose  = ENABLE;              //连续采集  
  81. //  DMA_InitStruct1.EnableState = ENABLE;                //初始化后立即采集  
  82. //     
  83. //   DMA_InitStruct1.SourceBaseAddr =(uint32_t)&PTD->PDIR;//摄像头端口接D0-D7  
  84. //  DMA_InitStruct1.SourceMajorInc = 0;                  //地址不增加  
  85. //  DMA_InitStruct1.SourceDataSize = DMA_SRC_8BIT;       //8BIT数据  
  86. //  DMA_InitStruct1.SourceMinorInc = 0;  
  87.   
  88. //  //目前修改到22点37     
  89. //   DMA_InitStruct1.DestBaseAddr =(uint32_t)ov7725_eagle_img_buff;     //(uint32_t)ov7725_eagle_img_buff;  //DMA 内存  //uint8_t DMABuffer[400];   
  90. //  DMA_InitStruct1.DestMajorInc = 0;  
  91. //  DMA_InitStruct1.DestDataSize = DMA_DST_8BIT;  
  92. //  DMA_InitStruct1.DestMinorInc = 1;                   //每次传输 +1个字节  
  93. //  DMA_Init(&DMA_InitStruct1);  
  94.   
  95. }  
  96.   
  97. /*! 
  98.  *  @brief      鹰眼ov7725场中断服务函数 
  99.  *  @since      v5.0 
  100.  */  
  101. void PORTB_IRQHandler(void)//功  能:PORTB 外部中断服务 //V   
  102. {  
  103.     uint8 i=10;  
  104.       if((PORTB->ISFR>>i)==1)  
  105.         {  
  106.               
  107.             Flag = 0;  
  108.             PORTB->ISFR|=(1<<10);     
  109.             Col = 0;  
  110.             Col_Num = 0;  
  111.             DMA_SetEnableReq(DMA_CH1,DISABLE);      //close DMA ISr   
  112.             NVIC_EnableIRQ(PORTA_IRQn);//行  
  113.             NVIC_DisableIRQ(PORTB_IRQn);//场  
  114.         }  
  115. }   
  116. void PORTA_IRQHandler(void)//功  能:PORTA 外部中断服务//Herf  
  117. {  
  118.     unsigned int Send_Buffer;  
  119.     uint8 colour[2] = {2540};  
  120.     DMA_InitTypeDef DMA_InitStruct1;  
  121.    uint8 i=14,j,k;  
  122.               
  123.      if((PORTA->ISFR>>i)==1);  
  124.      {  
  125.          PORTA->ISFR|=(1<<14);     
  126.          if(Col_Num++ > 15)  //消隐区啦  
  127.          {  
  128.                 if(Col_Num%2)   //进入行采集  
  129.                 {  
  130.                     //配置DMA  
  131.                     DMA_InitStruct1.Channelx          = DMA_CH1;         //DMA 1通道  
  132.                     DMA_InitStruct1.PeripheralDMAReq   =PORTE_DMAREQ;    //E端口(PCLK) 上升呀触发      
  133.                     DMA_InitStruct1.MinorLoopLength = 24;       //170        //传输次数 超过摄像头每行像素数即可  
  134.                     DMA_InitStruct1.TransferBytes = 1;                   //每次传输1个字节         
  135.                     DMA_InitStruct1.DMAAutoClose  = ENABLE;              //连续采集  
  136.                     DMA_InitStruct1.EnableState = ENABLE;                //初始化后立即采集  
  137.                        
  138.                     DMA_InitStruct1.SourceBaseAddr =(uint32_t)&PTD->PDIR;//摄像头端口接D0-D7  
  139.                     DMA_InitStruct1.SourceMajorInc = 0;                  //地址不增加  
  140.                     DMA_InitStruct1.SourceDataSize = DMA_SRC_8BIT;       //8BIT数据  
  141.                     DMA_InitStruct1.SourceMinorInc = 0;  
  142.   
  143.                     DMA_InitStruct1.DestBaseAddr =(uint32_t)Image[Col];  //DMA 内存  //uint8_t DMABuffer[400];   
  144.                     DMA_InitStruct1.DestMajorInc = 0;  
  145.                     DMA_InitStruct1.DestDataSize = DMA_DST_8BIT;  
  146.                     DMA_InitStruct1.DestMinorInc = 1;                   //每次传输 +1个字节  
  147.                     DMA_Init(&DMA_InitStruct1);  
  148.         ///////////////////////////////////////////////////////  
  149.                       
  150.         ///////////////////////////////////////////////////////  
  151.                     Col ++;   
  152.                     if(Col==MAX_COL)   //暂时先取200行  
  153.                     {  
  154.                         Flag = 1;                  //一场采集完成       
  155.                         DMA_SetEnableReq(DMA_CH1,DISABLE);    /////////  
  156.                         NVIC_DisableIRQ(PORTA_IRQn);//行                       
  157.                           
  158.                         UART_SendData(UART4,0XFF); //////调试用  
  159.                         for(j=0;j<80;j++)      
  160.                             for(k=0;k<23;k++)  
  161.                             {  
  162.                                 Send_Buffer = colour[ (Image[j][k] >> 7 ) & 0x01 ];  
  163.                                 UART_SendData(UART4,Send_Buffer);  
  164.                                 Send_Buffer = colour[ (Image[j][k] >> 6 ) & 0x01 ];  
  165.                                 UART_SendData(UART4,Send_Buffer);  
  166.                                 Send_Buffer = colour[ (Image[j][k] >> 5 ) & 0x01 ];  
  167.                                 UART_SendData(UART4,Send_Buffer);  
  168.                                 Send_Buffer = colour[ (Image[j][k] >> 4 ) & 0x01 ];  
  169.                                 UART_SendData(UART4,Send_Buffer);  
  170.                                 Send_Buffer = colour[ (Image[j][k] >> 3 ) & 0x01 ];  
  171.                                 UART_SendData(UART4,Send_Buffer);  
  172.                                 Send_Buffer = colour[ (Image[j][k] >> 2 ) & 0x01 ];  
  173.                                 UART_SendData(UART4,Send_Buffer);  
  174.                                 Send_Buffer = colour[ (Image[j][k] >> 1 ) & 0x01 ];  
  175.                                 UART_SendData(UART4,Send_Buffer);  
  176.                                 Send_Buffer = colour[ (Image[j][k] >> 0 ) & 0x01 ];  
  177.                                 UART_SendData(UART4,Send_Buffer);  
  178.                             }  
  179.                           
  180.                         NVIC_EnableIRQ(PORTB_IRQn);//场  
  181.                     }  
  182.                 }  
  183.             }   
  184.      }         
  185. }  
  186.   
  187. /*OV7725初始化配置表*/  
  188. reg_s ov7725_eagle_reg[] =  
  189. {  
  190.     //寄存器,寄存器值次  
  191.     {OV7725_COM4         , 0xC1},  
  192.     {OV7725_CLKRC        , 0x00},  
  193.     {OV7725_COM2         , 0x03},  
  194.     {OV7725_COM3         , 0xD0},  
  195.     {OV7725_COM7         , 0x40},  
  196.     {OV7725_HSTART       , 0x3F},  
  197.     {OV7725_HSIZE        , 0x50},  
  198.     {OV7725_VSTRT        , 0x03},  
  199.     {OV7725_VSIZE        , 0x78},  
  200.     {OV7725_HREF         , 0x00},  
  201.     {OV7725_SCAL0        , 0x0A},  
  202.     {OV7725_AWB_Ctrl0    , 0xE0},  
  203.     {OV7725_DSPAuto      , 0xff},  
  204.     {OV7725_DSP_Ctrl2    , 0x0C},  
  205.     {OV7725_DSP_Ctrl3    , 0x00},  
  206.     {OV7725_DSP_Ctrl4    , 0x00},  
  207.   
  208. #if (OV7725_EAGLE_W == 80)  
  209.     {OV7725_HOutSize     , 0x14},  
  210. #elif (OV7725_EAGLE_W == 160)  
  211.     {OV7725_HOutSize     , 0x28},  
  212. #elif (OV7725_EAGLE_W == 240)  
  213.     {OV7725_HOutSize     , 0x3c},  
  214. #elif (OV7725_EAGLE_W == 320)  
  215.     {OV7725_HOutSize     , 0x50},  
  216. #else  
  217.   
  218. #endif  
  219.   
  220. #if (OV7725_EAGLE_H == 60 )  
  221.     {OV7725_VOutSize     , 0x1E},  
  222. #elif (OV7725_EAGLE_H == 120 )  
  223.     {OV7725_VOutSize     , 0x3c},  
  224. #elif (OV7725_EAGLE_H == 180 )  
  225.     {OV7725_VOutSize     , 0x5a},  
  226. #elif (OV7725_EAGLE_H == 240 )  
  227.     {OV7725_VOutSize     , 0x78},  
  228. #else  
  229.   
  230. #endif  
  231.   
  232.     {OV7725_EXHCH        , 0x00},  
  233.     {OV7725_GAM1         , 0x0c},  
  234.     {OV7725_GAM2         , 0x16},  
  235.     {OV7725_GAM3         , 0x2a},  
  236.     {OV7725_GAM4         , 0x4e},  
  237.     {OV7725_GAM5         , 0x61},  
  238.     {OV7725_GAM6         , 0x6f},  
  239.     {OV7725_GAM7         , 0x7b},  
  240.     {OV7725_GAM8         , 0x86},  
  241.     {OV7725_GAM9         , 0x8e},  
  242.     {OV7725_GAM10        , 0x97},  
  243.     {OV7725_GAM11        , 0xa4},  
  244.     {OV7725_GAM12        , 0xaf},  
  245.     {OV7725_GAM13        , 0xc5},  
  246.     {OV7725_GAM14        , 0xd7},  
  247.     {OV7725_GAM15        , 0xe8},  
  248.     {OV7725_SLOP         , 0x20},  
  249.     {OV7725_LC_RADI      , 0x00},  
  250.     {OV7725_LC_COEF      , 0x13},  
  251.     {OV7725_LC_XC        , 0x08},  
  252.     {OV7725_LC_COEFB     , 0x14},  
  253.     {OV7725_LC_COEFR     , 0x17},  
  254.     {OV7725_LC_CTR       , 0x05},  
  255.     {OV7725_BDBase       , 0x99},  
  256.     {OV7725_BDMStep      , 0x03},  
  257.     {OV7725_SDE          , 0x04},  
  258.     {OV7725_BRIGHT       , 0x00},  
  259.     {OV7725_CNST         , 0xFF},  
  260.     {OV7725_SIGN         , 0x06},  
  261.     {OV7725_UVADJ0       , 0x11},  
  262.     {OV7725_UVADJ1       , 0x02},  
  263.   
  264. };  
  265.   
  266. uint8 ov7725_eagle_cfgnum = ARR_SIZE( ov7725_eagle_reg ) ; /*结构体数组成员数目*/  
  267.   
  268.   
  269. /*! 
  270.  *  @brief      鹰眼ov7725寄存器 初始化 
  271.  *  @return     初始化结果(0表示失败,1表示成功) 
  272.  *  @since      v5.0 
  273.  */  
  274. uint8 ov7725_eagle_reg_init(void)  
  275. {  
  276.     uint16 i = 0;  
  277.     uint8 Sensor_IDCode = 0;  
  278.     SCCB_GPIO_init();  
  279.   
  280.     //OV7725_Delay_ms(50);  
  281.     if0 == SCCB_WriteByte ( OV7725_COM70x80 ) ) /*复位sensor */  
  282.     {  
  283.   //      DEBUG_PRINTF("\n警告:SCCB写数据错误");  
  284.         return 0 ;  
  285.     }  
  286.   
  287.     OV7725_EAGLE_Delay_ms(50);  
  288.   
  289.     if0 == SCCB_ReadByte( &Sensor_IDCode, 1, OV7725_VER ) )    /* 读取sensor ID号*/  
  290.     {  
  291.    //     DEBUG_PRINTF("\n警告:读取ID失败");  
  292.         return 0;  
  293.     }  
  294.    // DEBUG_PRINTF("\nGet ID success,SENSOR ID is 0x%x", Sensor_IDCode);  
  295.   //  DEBUG_PRINTF("\nConfig Register Number is %d ", ov7725_eagle_cfgnum);  
  296.     if(Sensor_IDCode == OV7725_ID)  
  297.     {  
  298.         for( i = 0 ; i < ov7725_eagle_cfgnum ; i++ )  
  299.         {  
  300.             if0 == SCCB_WriteByte(ov7725_eagle_reg[i].addr, ov7725_eagle_reg[i].val) )  
  301.             {  
  302.    //             DEBUG_PRINTF("\n警告:写寄存器0x%x失败", ov7725_eagle_reg[i].addr);  
  303.                 return 0;  
  304.             }  
  305.         }  
  306.     }  
  307.     else  
  308.     {  
  309.         return 0;  
  310.     }  
  311.    // DEBUG_PRINTF("\nOV7725 Register Config Success!");  
  312.     return 1;  
  313. }  




由于鹰眼摄像头的特色,直接导致了图像发送给上位机的时候需要进行一些细操作,才能在上位机上看到相应图像。如:

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. for(i=0;i<80;i++)  //本来应该是278  
  2.     for(j=0;j<20;j++)  //320 may be too large;   //暂时为了提高上位机刷图速度降低两边宽度  
  3.         {  
  4.         Send_Buffer = colour[ (Image[i][j] >> 7 ) & 0x01 ];  
  5.         UART_SendData(UART4,Send_Buffer);  
  6.         Send_Buffer = colour[ (Image[i][j] >> 6 ) & 0x01 ];  
  7.         UART_SendData(UART4,Send_Buffer);  
  8.         Send_Buffer = colour[ (Image[i][j] >> 5 ) & 0x01 ];  
  9.         UART_SendData(UART4,Send_Buffer);  
  10.         Send_Buffer = colour[ (Image[i][j] >> 4 ) & 0x01 ];  
  11.         UART_SendData(UART4,Send_Buffer);  
  12.         Send_Buffer = colour[ (Image[i][j] >> 3 ) & 0x01 ];  
  13.         UART_SendData(UART4,Send_Buffer);  
  14.         Send_Buffer = colour[ (Image[i][j] >> 2 ) & 0x01 ];  
  15.         UART_SendData(UART4,Send_Buffer);  
  16.         Send_Buffer = colour[ (Image[i][j] >> 1 ) & 0x01 ];  
  17.         UART_SendData(UART4,Send_Buffer);  
  18.         Send_Buffer = colour[ (Image[i][j] >> 0 ) & 0x01 ];  
  19.         UART_SendData(UART4,Send_Buffer);  
  20.     }         

接下来就能成功的在上位机上看到相应的图像了。




大概总结:对于每一款摄像头的操作,先对它进行SCCB的写操作,初始化成自己需要的分辨率、模式,等等。

                    SCCB初始化之后,再进行场中断、行中断、像素中断的函数处理编辑。

最后发送到上位机上,进行显示和处理。很多上位机都可以让用户自己在Visual Stdio上编写自己的算法,直接在上位机上处理,很赞。

1 0
原创粉丝点击