PCLK HREF HSYNC 像素值ov7725数字摄像头编程基本知识笔记 这里以ov7725为例,对数字摄像头的时序进行分析。其他数字摄像头的时序也大同小异。
像素输出顺序
数字摄像头输出图像时,一般都是从左到右,有上到下逐个输出(部分芯片可配置输出顺序): 有些摄像头有奇偶场,是采用隔行扫描方法,把一帧图象分为奇数场和偶数场两场。(ov7725没有奇偶场之分)
0 第一个输出像素 最后一个
输出像素 最后一个 像素 消隐区,如果不按照时序来采集,就有可能采集到消隐区,值为0,即黑。 行与行之间,场与场之间都
一行图像数据 第一个 像素 PCLK 上升沿时,MCU 采集图像;下降沿时,摄像头输出图像。
HREF 和HSYNC 都用于行中断信号,但时序有点区别。 HREF 上升沿就马上输出图像数据,而HSYNC 会等待一段时间再输出图像数据,如果行中断里需要处理事情再开始采集,则显然用HREF 的上升沿是很容易来不两个都是行中断信号,共用同一个管脚,由寄存器配置选择哪个信号输出。
场中断时序
采集图像思路
①使用for 循环延时采集
1. 需要采集图像时,开场中断
2. 场中断来了就开启行中断,关闭场中断
3. 行中断里用for 循环延时采集像素,可以在行中断里添加标志位,部分行不采集,
即可跨行采集。
4. 行中断次数等于图像行数时即可关闭行中断,标志图像采集完毕。
②使用场中断和行中断,DMA 传输 1. 需要采集图像时,开场中断
2. 场中断来了,开行中断和初始化DMA 传输
3. 行中断来了就设置DMA 地址,启动DMA 传输。如果先过滤部分行不采集,则设
置一个静态变量,每次行中断来了都自加1,根据值来选择采集或不采集某些行。
4. 每个PCLK 上升沿来了都触发DMA 传输,把摄像头输出的值读取到内存数组里。
当触发n 次(n=图像列数目)后就停止DMA 传输。
5. 行中断次数等于一幅图像的行数,或者等待下一个场中断来临 就结束图像采集,
关闭行中断和场中断。
③使用场中断,DMA 传输 VSYNC HREF HSYNC 像素值场中断信号 一帧图像数据。 如果没处理好场中断、行中断的关系,就很容易出现各种异常。 一行图像数据。 消隐区,值全为0,无效数据。
如果不用DMA 传输,则直接用for 循环加延时来采集就好,PCLK 也不需要用。不过延时值需要设置合适,不然要不就采集到消隐区,要不就只采集图像的左边部分。 不使用行中断信号,直接DMA 模块计数来完成一场结束的判断 场中断信号,信号来了,就开始采集每帧的数据。可以选择下降
沿或者上升沿触发中断。 这种方法是最简单,最多人用,但也是采集图像最不稳定的方法,经常出现消隐区等问题。 常见图像采集问题里有对应的伪代码。
1.需要采集图像时,开场中断
2.场中断来了,初始化DMA传输,并启动DMA传输
3.每个PCLK上升沿来了都触发DMA传输,把摄像头输出的值读取到内存数组里。
当触发n次(n=图像像素数目)后就停止DMA传输。
4.DMA停止传输时触发中断,中断里关闭场中断,图像采集完毕。
或者等待下一个场中断来临才关闭场中断,标记图像采集完毕
常见图像采集问题
1.图像分成上下两幅图图像
没处理好场中断信号: 不根据场中断信号来了才开始每帧的采集,就会出现采集到一幅图片里由上下两幅图片组成:上半幅图是前一帧图像的底部,下半幅图是这帧的顶部图像。
或者场中断来了后,先处理太多东西,然后才开始采集,导致跳过了开头的数据,后续采集的时候又根据采集的行数来判断是否停止采集,就好采集到下一幅图像的开头
是下一帧的顶部
图像。
论坛帖子:/forum.php?mod=viewthread&tid=98576
/forum.php?mod=viewthread&tid=24642
2.图像分成左右两半图像,左半幅图是右半幅图的右边图像。
没处理好行中断,可能行中断来了后处理太多东西才开始采集。
3.图像分成左右两半相同的图片,而且中间有消隐区
读取行的数目太多,或者中间延时太久,导致读取一行变成的读取两行
论坛帖子:/forum.php?mod=viewthread&tid=98767
/forum.php?mod=viewthread&tid=97071
4.图像采集没居中,图像中心偏左或偏右了。
排除摄像头镜头歪了,或者摄像头芯片焊接歪了的硬件问题外,一般情况下是出现在用for循环延时采集上。
这些先写一下for循环延时采集的伪代码:
1.//for循环延时采集,都是在行中断里采集一行数据
2.void Hisr()
3.{
4.static uint16 Hn=0; //正在采集的行数
5.
6.//行中断来了延时一下,跳过消隐区
7. DELAY_A();
8.
9.for(i=0;i<;每行元素数目;i++)
10. {
11.//采集图像值,并保存在对应的内存数组里
12. port2buff(Hn++,i);
13.
14.//单片机速度较快时,如果不加延时,那么很有可能同一个像素
15. //值采集多次,而且图像右边的像素没采集到,即会出现图像中心偏右。
16. DELAY_B();
17. }
18.
19. Hn++;
20.}
如果DELAY_A()延时值过大,图像左边的部分像素就没采集到,图像中心偏左。
如果DELAY_A()延时值过小,图像左边就会出现消隐区。HREF上升沿触发行中断就不需要添加添加DELAY_A()延时值。
如果DELAY_B()延时值过大,右边图像就会出现消隐区。当不添加DELAY_B()还是出现右边有消隐区时,说明单片机速度太慢,每行采集像素数目太多,可以减少每行采集的数目。
如果DELAY_B()延时值过小,右边图像没采集到,图像中心偏右
每行元素数目过大,即上面所说的出现右边有消隐区情况。
每行元素数目过小,显然采集图片太窄,影响路况识别。
偏左了:
论坛帖子:/forum.php?mod=viewthread&tid=98644
5.图像有四个角落有阴影
镜头与芯片没对正中心,或者芯片焊接歪了。
论坛帖子:/forum.php?mod=viewthread&tid=96179