STM32 ZET6驱动OV7670摄像头采集图像,灰度输出大上位机问题

2019-07-20 15:14发布

本帖最后由 断桥残雪10086 于 2016-4-14 00:04 编辑

QQ截图20160413234301.png
这是上位机显示的效果

初始化寄存器序列及其对应的值
const u8 ov7670_init_reg_tbl_YUV[][2]=
{   
  /*以下为OV7670 QVGA RGB565参数  */
  //{0x3a, 0x04},//
        //{0x40, 0x10},
        //{0x12, 0x14},//QVGA,RGB输出
        
        {0x12, 0x10},
        {0x3a, 0x14},
        {0x3d, 0x80},
        //0         0       :      Y U Y V (3a:14 3d:80)
        //0         1       :      Y V Y U  (3a:14 3d:81)
        //1         0       :      U Y V Y (3a:18 3d:80)
        //1         1       :      V Y U Y (3a:18 3d:81)
        {0x67, 0x11},                //手工设置 U
        {0x68, 0xFF},                //手工设置 V
//                 {0x67, 0x22},                //手工设置 U
//                 {0x68, 0xEE},                //手工设置 V
        {0x40, 0xC0},                //YUV输出

        
        
        //输出窗口设置
        {0x32, 0x80}, //HREF
        {0x17, 0x16},  //HSTART      
        {0x18, 0x04},//HSTOP
        {0x19, 0x02},//VSTRT                                        //10
        {0x1a, 0x7a},//0x7a, VSTOP
         {0x03, 0x0a},//0x0a, VREF


        {0x0c, 0x0c},
        {0x15, 0x00},
        {0x3e, 0x00},//10
        {0x70, 0x00},
        {0x71, 0x01},
        {0x72, 0x11},
        {0x73, 0x09},//

        {0xa2, 0x02},//15                                                        //20
        {0x11, 0x00},//时钟分频设置,0,不分频.
        {0x7a, 0x20},
        {0x7b, 0x1c},
        {0x7c, 0x28},

        {0x7d, 0x3c},//20
        {0x7e, 0x55},
        {0x7f, 0x68},
        {0x80, 0x76},
        {0x81, 0x80},

        {0x82, 0x88},                                                                        //30
        {0x83, 0x8f},
        {0x84, 0x96},
        {0x85, 0xa3},
        {0x86, 0xaf},

        {0x87, 0xc4},//30
        {0x88, 0xd7},
        {0x89, 0xe8},
        {0x13, 0xe0},
        {0x00, 0x00},//AGC

        {0x10, 0x00},                                                                        //40
        {0x0d, 0x00},
        {0x14, 0x20},//0x38, limit the max gain
        {0xa5, 0x05},
        {0xab, 0x07},

        {0x24, 0x75},//40
        {0x25, 0x63},
        {0x26, 0xA5},
        {0x9f, 0x78},
        {0xa0, 0x68},

        {0xa1, 0x03},//0x0b,                                        //50
        {0xa6, 0xdf},//0xd8,
        {0xa7, 0xdf},//0xd8,
        {0xa8, 0xf0},
        {0xa9, 0x90},

        {0xaa, 0x94},//50
        {0x13, 0xe5},
        {0x0e, 0x61},
        {0x0f, 0x4b},
        {0x16, 0x02},

        {0x1e, 0x27},//图像输出镜像控制.0x07,                //60
        {0x21, 0x02},
        {0x22, 0x91},
        {0x29, 0x07},
        {0x33, 0x0b},

        {0x35, 0x0b},//60
        {0x37, 0x1d},
        {0x38, 0x71},
        {0x39, 0x2a},
        {0x3c, 0x78},

        {0x4d, 0x40},                                                                                                        //70
        {0x4e, 0x20},
        {0x69, 0x5d},
        {0x6b, 0x40},//PLL*4=48Mhz
        {0x74, 0x19},
        {0x8d, 0x4f},

        {0x8e, 0x00},//70
        {0x8f, 0x00},
        {0x90, 0x00},
        {0x91, 0x00},
        {0x92, 0x00},//0x19,//0x66                                                //80

        {0x96, 0x00},
        {0x9a, 0x80},
        {0xb0, 0x84},
        {0xb1, 0x0c},
        {0xb2, 0x0e},

        {0xb3, 0x82},//80
        {0xb8, 0x0a},
        {0x43, 0x14},
        {0x44, 0xf0},
        {0x45, 0x34},                                                                                                //90

        {0x46, 0x58},
        {0x47, 0x28},
        {0x48, 0x3a},
        {0x59, 0x88},
        {0x5a, 0x88},

        {0x5b, 0x44},//90
        {0x5c, 0x67},
        {0x5d, 0x49},
        {0x5e, 0x0e},
        {0x64, 0x04},                                                                                        //100
        {0x65, 0x20},

        {0x66, 0x05},
        {0x94, 0x04},
        {0x95, 0x08},
        {0x6c, 0x0a},
        {0x6d, 0x55},


        {0x4f, 0x80},
        {0x50, 0x80},
        {0x51, 0x00},
        {0x52, 0x22},                                                                                //110
        {0x53, 0x5e},
        {0x54, 0x80},

        //{0x54, 0x40},//110


        {0x09, 0x03},//驱动能力最大

        {0x6e, 0x11},//100
        {0x6f, 0x9f},//0x9e for advance AWB
  {0x55, 0x00},//亮度
  {0x56, 0x40},//对比度
  {0x57, 0x80},//0x40,  change according to Jim's request          //118
};
这是寄存器设置代码。

//更新OV7670显示
void camera_refresh()
{
        u32 i,j,k;
        u16 color;

        if(ov_sta==2)
        {        
                OV7670_RRST=0;                                //开始复位读指针
                OV7670_RCK_L;
                OV7670_RCK_H;
                OV7670_RCK_L;
                OV7670_RRST=1;                                //复位读指针结束
                OV7670_RCK_H;  

                for(k=0; k<5; k++)
                {
                        delay_ms(1000);
                }
                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
                USART_SendData(USART1,0x01);
                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
                USART_SendData(USART1,0xfe);                                              //发送的0x01,oxfe为上位机软件帧头格式
                  
                for(i=0; i<height; i++)
                {
                        for(j=0; j<width; j++)
                        {
                                OV7670_RCK_L;
                                color = GPIOC->IDR&0XFF;        //读数据
                                OV7670_RCK_H;
//                                 if(color==0x01)
//                                         color=0x02;
//                                 if(color==0xfe)
//                                         color=0xfd;
//                                 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
//                                 USART_SendData(USART1,color);                                
                                //color<<=8;
                                OV7670_RCK_L;//因为设置的是 YUYV输出,第二个字节没用,不需要读
                                //color = GPIOC->IDR&0XFF;        
                                OV7670_RCK_H;

                                if(color==0x01)
                                        color=0x02;
                                if(color==0xfe)
                                        color=0xfd;
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
                                USART_SendData(USART1,color);
                                //delay_ms(5);
                        }
                }
                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
                USART_SendData(USART1,0xfe);
                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
                USART_SendData(USART1,0x01);                                                     ////发送的0xfe,ox01为上位机软件帧尾格式        
                //EXTI_ClearITPendingBit(EXTI_Line8);  //清除LINE8上的中断标志位
                ov_sta=0;                                        //开始下一次采集
//                  ov_frame++;
                EXTI->IMR |=(1<<8);  //开中断
        }        
}
此部分为采集图像并上传到上位机代码。


for(i=0;i<sizeof(ov7670_init_reg_tbl_YUV)/sizeof(ov7670_init_reg_tbl_YUV[0]);i++)           //我把OV7670初始化部分的寄存器设置代码中的除以2删了,问题是没删时图像效果也不好
{
        SCCB_WR_Reg(ov7670_init_reg_tbl_YUV[0],ov7670_init_reg_tbl_YUV[1]);
        delay_ms(2);        
}
return 0x00;         //ok
}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。