智能车制作

标题: 新手入门摄像头-第五篇:如何用XS128驱动OV7620 [打印本页]

作者: DEMOK    时间: 2012-12-30 00:20
标题: 新手入门摄像头-第五篇:如何用XS128驱动OV7620
本帖最后由 DEMOK 于 2013-11-4 17:27 编辑

原文附件及程序附件:[attach]38120[/attach]
[attach]38121[/attach]
[attach]38126[/attach]
更新说明:程序主频部分注释有误,已经更正
在《新手入门摄像头系列》的前几篇中,我们介绍到了OV7620数字摄像头的一些要点和图像处理的基础知识,在这一篇中,DEMOK教您如何用XS128OV7620的驱动程序,现在开讲。
第一节:XS128如何处理像素中断信号PCLK
我们已经知道,对于OV7620来说,行信号HREF与场信号VSYN的时间比较长,XS12的单片机足以捕捉到;但是OV7620的像素同步信号PCLK只有73ns,而XS12单片机的稳定总线时钟只有25M,很难捕捉到PCLK这个像素同步信号;即使单片机主频倍频到60M以上能够捕捉到73ns的信号,而这其间还有采集这一步,很难做到既采集也判断是否有像素同步。
在以上方案不通的情况下,我们进行了一下论证。然而,我们是否真正的必须捕捉PCLK的信号,读回来的信号才是正确的呢?显然是否定的,对于XS12单片机,即使不用PCLK读回来图像也是正确的。为什么呢?原因是S12单片机的读取速度是有限的,曾经做过实验,在48M主频下,即使当行信号HERF到来的时候,单片机什么也不做,就去读取图像,程序用纯汇编写,而且不用循环判断语句,牺牲空间换取时间来采集,即使是这样,读到有效点数一行也只在450多左右,而OV7620的每行像素输出是640点,这说明单机的读取速度比CMOS的图像输出慢,但是已经可以读取到整行图像数据的大部分数据了。
那么,如果我们一行要读取120点,我们如何来确保隔像素采集平分640个点呢?方法很简单,就是延时,采集一点,延时一会,再采集,平均分为120点,如何去控制延时就得进行实验了,最好借助于示波器。有人会问,采集的这120点之中,难道就没有无效点吗,难道不会采集到PCLK的消隐区吗?不排除这种可能性,但是就算是无效,它能差很多吗?打个比方,采集到的这个点的前一个像素值为70,后一个像素值为78,那么即使采集此点的时候PCLK不是高电平,采集到的值也是在70-78之间;或许大家还有疑问,在黑线的边沿处,如果发生这种情况如何呢?请大家记住,即使在黑线的边沿,COMS的图像输出也不会少于5点,所以这个问题,也不用考虑了。
对于PCLK的具体用处,在用K60K10采集的时候,就会显现出它的作用,在《新手入门摄像头系列》的后续篇章中,会介绍到。
另外,对于S12单片机,如果真的想捕捉到TCLK信号,也是可以的,必需地PCLK作一定的处理。通过写SCCBPCLK分频,将PCLK降为微秒级就可以,基于SCCB的分频,DEMOK也做了实验,后续会在论坛逐一发布。
第二节:XS128如何采集每一行的图像像素
       在第一节已经提到一个实验,就是不通过PCLK的同步,在行中断来临以后IO口不停地去读图像数据,这里有很多种实现方法。
       第一种就是大家习惯用到的for循环,示例伪代码如下:

  1. interrupt 8 void HREF_Count(void)     //行中断函数
  2. {
  3.   TFLG1_C0F = 1;                  //清除中断标志
  4.   for( i=0; i<列数; i++)
  5.         ImageData[当前行数][i] = PORTA;  //PORTA接摄像头数据口
  6.   当前行数++;
  7. }
复制代码

以上程序,在触发一个行中断信号以后,用for循环采集IO口的数据,从逻辑角度讲,实现了将此时IO口上的图像数据保存在图像数组的作用;但是从应用角度讲,这种方法是不可取的。
其实大家可以分析上面的程序,可以去掉不少东西,上面至少执行了以下代码,i的自加,i的比较,Image的寻址,还有每次一个for循环的程序指针的跳转等,这些都是需要时间去完成的,事实上在48M主频下,用for循环去读取一行的像素数据,只能读取几十个点,远远不能达到要求。或许大家会想到提到系统总线频率,以此来增大采集的点数,然后系统的总线频率经过倍频以后,会大大降低系统的稳定性,此法也是不可取的。
通过上面的分析,我们知道用for循环的方法,不可能提高采集的点数,提高CPU的频率将使系统变得不稳定,下面就用空间换取时间的做法去采集通过实验发现,在24M总线频率的前提下,我们用以下方法去采集,每行采集120个点足以将全行像素平分。
  1. interrupt 8 void HREF_Count(void) //行中断函数
  2. {
  3. TFLG1_C0F = 1; //清除中断标志
  4. Image_Data[Line_C][0] = PORTA;
  5. Image_Data[Line_C][1] = PORTA;
  6. Image_Data[Line_C][2] = PORTA;
  7. Image_Data[Line_C][3] = PORTA;
  8. Image_Data[Line_C][4] = PORTA;
  9. Image_Data[Line_C][5] = PORTA;
  10. Image_Data[Line_C][6] = PORTA;
  11. Image_Data[Line_C][7] = PORTA;
  12. Image_Data[Line_C][8] = PORTA;
  13. Image_Data[Line_C][9] = PORTA;
  14. Image_Data[Line_C][10] = PORTA;
  15. …….
  16. …….
  17. Image_Data[Line_C][110] = PORTA;
  18. Image_Data[Line_C][111] = PORTA;
  19. Image_Data[Line_C][112] = PORTA;
  20. Image_Data[Line_C][113] = PORTA;
  21. Image_Data[Line_C][114] = PORTA;
  22. Image_Data[Line_C][115] = PORTA;
  23. Image_Data[Line_C][116] = PORTA;
  24. Image_Data[Line_C][117] = PORTA;
  25. Image_Data[Line_C][118] = PORTA;
  26. Image_Data[Line_C][119] = PORTA; = PORTA;
  27. 当前行数++;
  28. }
复制代码


第三节:XS128如何驱动OV7620
XS128驱动OV7620的流程图非常简单,大家可以直接参考附件中的程序,自行进行研究分析。
OV7620图像采集程序_XS128_v1.3(见附件)
效果图:
[attach]38119[/attach]

[attach]38118[/attach]


第九届智能车摄像头技术交流群  群号:108190422(验证消息:智能车
第九届智能车光电技术交流群    群号:1132879827(验证消息:智能车
第九届智能车电磁技术交流群      群号:118404899(验证消息:智能车)
对号入座,欢迎加入!

10.29   新手入门摄像头-第一篇:智能车摄像头上位机的用法
http://www.znczz.com/thread-110783-1-1.html
11.14   新手入门摄像头-第二篇:OV7620与OV7670的区别与比较
http://www.znczz.com/thread-109673-1-1.html
11.21   新手入门摄像头-第三篇:智能车摄像头基础知识扫盲
http://www.znczz.com/thread-211180-1-1.html
11.30   新手入门摄像头-第四篇:OV7620数字摄像头时序剖析
http://www.znczz.com/thread-111728-1-1.html
12.30   新手入门摄像头-第五篇:如何使用XS128驱动OV7620
http://www.znczz.com/thread-114057-1-1.html
5.08    新手入门摄像头-第六篇:数字摄像头使用常见问题说明-FAQ
http://www.znczz.com/thread-124545-1-1.html
5.28    新手入门摄像头-第七篇:智能车循迹程序及手册
http://www.znczz.com/thread-124545-1-1.html



作者: 451506709    时间: 2012-12-30 00:36
沙发
作者: Payne    时间: 2012-12-30 00:39

作者: 叶子一哥    时间: 2012-12-30 00:50
{:soso_e179:}
作者: 黎明sunshine    时间: 2012-12-30 06:37
支持下~~~
作者: 可欣    时间: 2012-12-30 09:08
太给力啦
作者: Soran    时间: 2012-12-30 10:41
前排支持,很有用的资料
作者: 简单丹    时间: 2012-12-30 10:41
有给我解惑了
作者: xxyz987    时间: 2012-12-30 11:00
128可以用ov7725吗?
作者: 青龙00    时间: 2012-12-30 11:15
{:soso_e179:}
作者: ganlei    时间: 2012-12-30 11:52

作者: puyangang    时间: 2012-12-30 12:15

作者: nxdliuquan    时间: 2012-12-30 12:24
前几篇在哪里啊?
作者: DEMOK    时间: 2012-12-30 12:33
nxdliuquan 发表于 2012-12-30 12:24
前几篇在哪里啊?

论坛搜索DEMOK可以找的到
作者: DEMOK    时间: 2012-12-30 12:37
nxdliuquan 发表于 2012-12-30 12:24
前几篇在哪里啊?

10.29   新手入门摄像头-第一篇:智能车摄像头上位机的使用http://www.znczz.com/thread-110783-1-1.html
11.14   新手入门摄像头-第二篇:OV7620与OV7670的区别与比较
http://www.znczz.com/thread-109673-1-1.html
11.21   新手入门摄像头-第三篇:智能车摄像头基础知识扫盲http://www.znczz.com/thread-111158-1-1.html
11.30   新手入门摄像头-第四篇:OV7620数字摄像头时序分析
http://www.znczz.com/thread-111728-1-1.html



作者: liuyuliuyu1216    时间: 2012-12-30 13:02
非常感谢
作者: doye    时间: 2012-12-30 13:15
细心的demok~~
作者: 夏唯夕    时间: 2012-12-30 15:52

作者: 1228463834    时间: 2012-12-30 17:21

作者: xiaoxinyan    时间: 2012-12-30 18:44

作者: 赵宇    时间: 2012-12-30 20:16

作者: zhehong    时间: 2012-12-31 10:22
楼主给力!
作者: 倘若初见    时间: 2012-12-31 17:03
还不知道怎么做啊
作者: cxn5127111    时间: 2013-1-1 08:27
不错,虽然用的是K60,但是还要赞一下。
作者: DEMOK    时间: 2013-1-1 12:36
cxn5127111 发表于 2013-1-1 08:27
不错,虽然用的是K60,但是还要赞一下。

后续会有K60的相关驱动程序发布,敬请关注!

作者: cxn5127111    时间: 2013-1-1 14:51
DEMOK 发表于 2013-1-1 12:36
后续会有K60的相关驱动程序发布,敬请关注!

那就翘首以待了。

作者: Busifly    时间: 2013-1-1 15:09
吸收了
作者: zcc1992    时间: 2013-1-1 17:02

作者: mxj1005071012    时间: 2013-1-1 21:02

作者: lianghuihao    时间: 2013-1-2 10:02
:victory:
作者: mxj1005071012    时间: 2013-1-6 15:42

作者: melon_1    时间: 2013-1-8 18:06
挺不错的
作者: 涂文俊    时间: 2013-1-8 20:50
很喜欢你的资料,期待更好的帖子{:soso_e179:}
作者: dlyt03    时间: 2013-1-8 20:54
谢谢
作者: Leven    时间: 2013-1-13 21:37
非常感谢,菜鸟学到了不少:lol:lol:lol
作者: dlyt03    时间: 2013-1-14 12:28
谢谢
作者: Lee.C    时间: 2013-1-14 22:26
新手 第一次做,,如获至宝
作者: 飞思卡尔。。    时间: 2013-1-16 22:32
:):)
作者: 秋&心    时间: 2013-1-19 20:00

作者: Dogefly    时间: 2013-1-21 09:49
好帖  业界良心
作者: 飞思卡尔。。    时间: 2013-1-22 13:42
PLL是不是错了,不是48M
作者: 飞思卡尔。。    时间: 2013-1-22 13:45
void PLL_Init(void)
{                                             
  CLKSEL=0x00; //48mhz
  SYNR=0XC0 | 0X05;
  REFDV=0XC0 | 0X03;                         // 这里改为REFDV=0X80 | 0X01才是48M吧?????
  PLLCTL_PLLON=1;
  POSTDIV=0X00;
  asm(nop);
  asm(nop);
  while(0==CRGFLG_LOCK); //锁相环锁定
  CLKSEL_PLLSEL=1; //选定PLL时钟
}
作者: xiaojuren    时间: 2013-1-23 23:15
谢谢分享

作者: DEMOK    时间: 2013-1-24 19:30
飞思卡尔。。 发表于 2013-1-22 13:45
void PLL_Init(void)
{                                             
  CLKSEL=0x00; //48mhz

嗯 是的  谢谢提醒 注释有误  已经更新文件了
作者: WachtAmRhein    时间: 2013-1-28 03:46

作者: 有思想的车    时间: 2013-1-28 09:36
顶一个
作者: whitegger    时间: 2013-2-3 21:50
把前边的都看了 期待最新一期的
作者: 最後只剩我了    时间: 2013-2-4 17:53
{:soso_e179:}
作者: yejiaan    时间: 2013-2-15 16:29
{:soso_e179:}
作者: 小剑听箫    时间: 2013-2-16 22:59
很强大
作者: dlyt03    时间: 2013-2-17 11:07
学习!!
作者: zhangjia    时间: 2013-2-18 15:28
谢谢
作者: 黄美纯    时间: 2013-2-19 17:09
楼主会出第六篇吗?
作者: tianyi1729    时间: 2013-2-21 21:45
好东西
作者: DEMOK    时间: 2013-2-27 09:50
黄美纯 发表于 2013-2-19 17:09
楼主会出第六篇吗?

马上会出的
作者: 黄美纯    时间: 2013-2-28 22:20
DEMOK 发表于 2013-2-27 09:50
马上会出的

期待。。

作者: wenzailqq    时间: 2013-3-1 23:52
用了楼主的程序,可是怎么不见图像啊
作者: 飞尘    时间: 2013-3-2 19:47

作者: HOPEver    时间: 2013-3-4 20:45
为什么用这个程序采集不到图像???采集到的图像都是255.。。。。。。
作者: Robins    时间: 2013-3-4 23:10
多谢,已学习!!
作者: 时空幻影    时间: 2013-3-18 16:31
刚好遇到这样的问题!!!
作者: 453893145    时间: 2013-4-9 15:12
谢谢
作者: 905185041    时间: 2013-4-15 13:47
摄像头不是每秒采集25场奇场图像吗,那摄像头怎么设置频率,是不是ETC里面的输入捕捉场中断端口的频率。
作者: 3009    时间: 2013-4-15 22:35

作者: jaylsh    时间: 2013-4-20 23:04

作者: L.RJ    时间: 2013-4-22 17:36
谢谢
作者: 一个好青年    时间: 2013-4-24 20:55

作者: donsbin    时间: 2013-4-27 11:41

作者: clan    时间: 2013-5-15 16:10
好东西
作者: clan    时间: 2013-5-15 16:12
本帖最后由 clan 于 2013-5-15 16:14 编辑

demok真好,谢谢
作者: Fortware    时间: 2013-5-20 21:27

支持下~~~
作者: 野火勾乐    时间: 2013-5-30 14:42
谢谢,非常有用
作者: zy52588    时间: 2013-6-3 12:37
灰常感谢楼主
作者: xiaobai727    时间: 2013-6-11 02:28
为什么第三篇下载不了呢?是我的网络问题吗?
作者: 曲终人亦散    时间: 2013-7-11 09:38
真的很好,我打印出来一点点看的。。。可是楼主,第三篇怎么提示不存在啊,最近在学,急用。。。
作者: 425210529    时间: 2013-8-3 15:38

作者: 浮生若尘    时间: 2013-8-5 15:14
赞一个
作者: neuq-xu    时间: 2013-10-25 21:32
相见恨晚!
作者: 姑娘放开那黄瓜    时间: 2014-2-16 16:37

作者: shuixiaoer    时间: 2014-2-18 16:11
是直接把摄像头连接好,然后下载好上面给的程序,打开DemokTool Build 1114就可以显示出来吗,为什么我的是这个样子,什么情况啊,晕了……求解啊!!!
作者: 残忆视觉    时间: 2014-2-18 21:30
楼主好啊,谢谢
作者: 穗月斋星辰    时间: 2014-2-20 11:03

作者: 胡宏宇    时间: 2014-2-28 18:15
非常感谢楼主
作者: 葱葱哥    时间: 2014-3-2 20:39

[/url]
作者: 602王帅    时间: 2014-3-20 20:02
用MPC5604B的飘过!!!
作者: 开明    时间: 2014-3-31 20:39
给力…………………………

作者: 牛欲翔    时间: 2014-4-4 20:04
弱弱的问一下,我怎么找不到行/场中断对应的端口啊!我想看一下程序的效果可是找不着所以接不了!
作者: wujiu913    时间: 2014-4-8 21:26
谢谢
作者: 殇夜    时间: 2014-4-16 15:12
楼主,我想问一下,我能用这个摄像头拍到赛道以后(直接用的你们给摄像头ov7620配套的程序),怎么提取数据进行二值化呀?
作者: 简简单单﹌    时间: 2014-8-9 11:25
430可以做不
作者: 天天好心情亲    时间: 2014-10-17 20:06
果断顶 楼主 谢谢分享!!!
作者: swRiltHab    时间: 2014-11-16 19:56
怎么把程序从A0-A7改成B0-B7啊???
作者: 颉无忧    时间: 2014-11-22 09:03
谢谢。。。很有帮助
作者: 夜☆眼    时间: 2014-12-12 20:01
出了Y口和电源口,其他口怎么和128接?

作者: 黑夜主宰    时间: 2015-1-8 22:38
nice


作者: kingslanding    时间: 2015-9-25 13:53
ImageData[当前行数][i] = PORTA;  //PORTA接摄像头数据口
这里读到的数据是0或1吗
作者: 一个人的浮屠    时间: 2015-10-2 13:47
支持一个
作者: buaa130324    时间: 2015-12-20 12:02
顶11111111111111111
作者: lxzmxl    时间: 2015-12-24 12:05
很好用的资料

作者: buaa130324    时间: 2015-12-24 21:57
:@:@:@




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2