OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10890|回复: 3
打印 上一主题 下一主题

[F4开发板通用] 阿波罗STM32F4/F7开发板如何使用延长线接OV5640拍JPEG照片?例程拍照出错(撕裂/断层)解决办法

[复制链接]

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
跳转到指定楼层
楼主
发表于 2017-3-8 20:57:02 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
有不少朋友买了阿波罗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)
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
201
金钱
201
注册时间
2013-5-10
在线时间
49 小时
推荐
发表于 2017-5-10 14:14:39 | 只看该作者
原子哥!我现在用ov5640读取了rgb565的数据,我想已bmp格式进行存储!求指教。没有思路啊
回复 支持 1 反对 0

使用道具 举报

0

主题

0

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-1-26
在线时间
6 小时
2#
发表于 2017-3-8 21:36:19 | 只看该作者
把排线裹一层接地铝箔不知道行不行
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
3#
 楼主| 发表于 2017-3-9 00:55:47 | 只看该作者
曳炷人 发表于 2017-3-8 21:36
把排线裹一层接地铝箔不知道行不行

你可以试试
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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