管理员
- 积分
- 165309
- 金钱
- 165309
- 注册时间
- 2010-12-1
- 在线时间
- 2108 小时
|
有不少朋友买了阿波罗STM32F429/F767开发板,搭配OV5640,当使用照相机实验,通过延长线接OV5640拍照时,基本上全部会出错!
而把OV5640直接插开发板,则拍照正常。
另外,细心的朋友可能会知道我们的综合实验,网络摄像头功能,则支持JPEG传输,也可以通过延长线读取数据,并传输到电脑。为何照相机实验,就不行呢?
原因就是通过延长线连接,在高分辨率JPEG拍照时,由于数据传输较快,延长线容易受干扰,导致采集的 数据出错,从而出现图像撕裂/断层。
综合实验的网络摄像头功能,使用的是低分辨率(最高1280*800),而照相机实验,拍照默认都是最大分辨率(500W像素,2592*1944),而且和帧率也有关系
在发现断层/撕裂以后,降低帧率,可以显著提高拍照成功率。
提高拍照成功率的办法有:
1,降低拍照分辨率
2,降低帧率
3,加大接收buf(可以加大缓冲时间,写入SDRAM次数变少)
以阿波罗STM32F429的照相机实验(寄存器版本)为例(F7的代码,参考着修改即可),我们修改main函数部分代码,即可实现支持OV5640+延长线拍照。
1,降低拍照分辨率
2,降低帧率
这两步,通过修改ov5640_jpg_photo函数部分代码实现,修改后代码如下:
[mw_shl_code=c,true]//OV5640拍照jpg图片
//返回值:0,成功
// 其他,错误代码
u8 ov5640_jpg_photo(u8 *pname)
{
FIL* f_jpg;
u8 res=0,headok=0;
u32 bwr;
u32 i,jpgstart,jpglen;
u8* pbuf;
f_jpg=(FIL *)mymalloc(SRAMIN,sizeof(FIL)); //开辟FIL字节的内存区域
if(f_jpg==NULL)return 0XFF; //内存申请失败.
ovx_mode=1;
jpeg_data_ok=0;
sw_ov5640_mode(); //切换为OV5640模式
OV5640_JPEG_Mode(); //JPEG模式
//OV5640_OutSize_Set(16,4,2592,1944); //设置输出尺寸(500W)
OV5640_ImageWin_Set(0,0,1280,800);
OV5640_OutSize_Set(16,4,1280,800); //设置输出尺寸(1280*800)
OV5640_WR_Reg(0X3035,0X21);
OV5640_WR_Reg(0X3036,0X50);
OV5640_WR_Reg(0x3824,0X1F);
....//省略部分代码(未做任何修改)[/mw_shl_code]
这里我们修改传感器开窗为1280*800,然后输出分辨率也是1280*800,这样拍照就是1280*800分辨率的了。
然后通过0X3035,0X3036和0X3824,修改输出帧率和PCLK的频率,降低帧率,和PCLK,以提高采集稳定性。
3,加大接收buf
例程默认的接收buf通过test.c里面的
[mw_shl_code=c,true]#define jpeg_line_size 2*1024 //定义DMA接收数据时,一行数据的最大值
[/mw_shl_code]
定义,默认是2K,这里我们修改为8K,修改后代码如下:
[mw_shl_code=c,true]#define jpeg_line_size 8*1024 //定义DMA接收数据时,一行数据的最大值
[/mw_shl_code]
这样,我们就完成了对例程的修改,设置输出分辨率为1280*800,降低帧率和PCLK,加大接收buf,实现使用
延长线,也可以正常拍照。
拍照效果如下:
修改后的代码见附件:
实验44 照相机实验_延长线.rar
(1.86 MB, 下载次数: 479)
|
|