OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...

查看: 996|回复: 3

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

[复制链接]

  离线 

499

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
129707
金钱
129707
注册时间
2010-12-1
在线时间
1165 小时
发表于 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函数部分代码实现,修改后代码如下:
[C] 纯文本查看 复制代码
//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); 
        ....//省略部分代码(未做任何修改)


这里我们修改传感器开窗为1280*800,然后输出分辨率也是1280*800,这样拍照就是1280*800分辨率的了。
然后通过0X3035,0X3036和0X3824,修改输出帧率和PCLK的频率,降低帧率,和PCLK,以提高采集稳定性。


3,加大接收buf
例程默认的接收buf通过test.c里面的
[C] 纯文本查看 复制代码
#define jpeg_line_size        2*1024                        //定义DMA接收数据时,一行数据的最大值

定义,默认是2K,这里我们修改为8K,修改后代码如下:
[C] 纯文本查看 复制代码
#define jpeg_line_size        8*1024                        //定义DMA接收数据时,一行数据的最大值


这样,我们就完成了对例程的修改,设置输出分辨率为1280*800,降低帧率和PCLK,加大接收buf,实现使用
延长线,也可以正常拍照。

拍照效果如下:
杨钊.jpg

修改后的代码见附件:
实验44 照相机实验_延长线.rar (1.86 MB, 下载次数: 225)
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

曳炷人 该用户已被删除
发表于 2017-3-8 21:36:19 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

  离线 

499

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
129707
金钱
129707
注册时间
2010-12-1
在线时间
1165 小时
 楼主| 发表于 2017-3-9 00:55:47 | 显示全部楼层
曳炷人 发表于 2017-3-8 21:36
把排线裹一层接地铝箔不知道行不行

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

使用道具 举报

  离线 

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-5-10
在线时间
10 小时
发表于 2017-5-10 14:14:39 | 显示全部楼层
原子哥!我现在用ov5640读取了rgb565的数据,我想已bmp格式进行存储!求指教。没有思路啊
回复 支持 反对

使用道具 举报

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

本版积分规则




关闭

"原子哥”推荐上一条 /1 下一条

QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-7-18 03:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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