找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3354|回复: 0
收起左侧

OV5116摄像头图像采集步骤与xs128单片机源程序

[复制链接]
ID:341725 发表于 2018-5-30 21:09 | 显示全部楼层 |阅读模式
  一般而言,摄像头可分为CCD与CMOS两种类型。都是现在被广泛用到的两种图像传感器,两者的共同之处就是都通过感光二极管将光信号转换为电信号,将模拟电压值转化为具体的数字值,而二者的主要差异在于数字值的传送方式不同。 CCD传感器中每一行的每一个象素的电荷数据都会依次传送到下一个象素中,由最底端部分输出,再经由传感器边缘的放大器进行放大输出;而在CMOS传感器中,每个象素都会邻接一个放大器及A/D转换电路,用类似内存电路的方式将数据输出。造成这种差异的原因在于:CCD的特殊工艺可保证数据在传送时不会失真,因此各个象素的数据可汇聚至边缘再进行放大处理;而CMOS工艺的数据在传送距离较长时会产生噪声,因此,必须先放大,再整合各个象素的数据。本着摄像头优越性与可用性的原则,这里采用了SONY CCD模拟摄像头。

这是我前几天做的智能小车的稳压电路,在科学技术发达的今天,电子电路设计已经非常普遍与常见,种类更是五花八门,各式各样。但是有句话叫“万变不离其宗”因此不管何种电路,它是为哪个特定的系统而设计,在设计的过程中大体都要遵从以下几个大的设计原则:
a:可靠性。从大到宇宙飞船、人造卫星,小到在用电器、数码设备。任何电路的设计都要保证其可靠性,就是要经得起时间检验,让用户、使用者完全信赖。不能出任何大的故障,造成生命财产的损失。影响电路可靠性的因素有很多,比如各元器件间的电磁干扰、电感耦合等等。
b:稳定性。与可靠性同样重要,稳定性要求所设计电路在较长时间段里要稳定的按照预设流程去工作,达到本该达到的目的或完成本该完成的任务而不出现任何故障,不需要经常去检查与维修,不给用户或使用者带来不必要的麻烦与不便。
c:逻辑性。我们知道,任何一个大的电路系统都可以拆分成若干个小的子电路系统。所以一一设计子电路系统,然后合理的把这些子电路系统连接起来组成一个大的电路系统,这有利于电路的检修与调试。
d:优化性。任何产品,物美价廉一直是人们所追求的。所以美观漂亮、低价格、简洁高效、低功耗等都是电路设计时不得不考虑的原则。


  OV5116摄像头程序采集步骤


本采集程序基于k60芯片与拉普兰德开源函数驱动库,利用DMA功能直接采集ov5116二值化图像,利用pwm模拟pclk信号作为DMA触发源,可根据实际比赛需求在不缩小摄像头视野的前提下修改图像宽度,利用dma方式采集图像可实现程序的并行处理,极大的提高程序处理效率。例程中图像大小为80*120。注:修改图像宽度时应同时修改pwm频率。


接口说明:VS-------pta5

          HS-------ptb3

          D1-------ptd0

          注:单片机 pte6口与单片机ptb18口相连接(pwm模拟pclk信号触发dma采集)

串口波特率:256000

            rx---ptc15

            tx---ptc14



下图为80*120大小时采集到的二值化图像:

下图为60*160大小时采集到的二值化图像:



单片机源程序如下:

  1. #include <hidef.h>      
  2. #include <MC9S12XS128.h>
  3. #pragma LINK_INFO DERIVATIVE "mc9s12xs128"


  4. int ii,jj;
  5. unsigned  int  t,t1;
  6. unsigned  char sdata;
  7. //------------------------------------------------
  8.   
  9.   #define lie_end  260
  10.   #define hang_end  91
  11.   #define lie  52   
  12.   unsigned  char ab[lie+1];


  13.   #define delay(num)   \
  14.   { \
  15.      unsigned int i,j; \
  16.     for(i=0;i<num;i++) \
  17.        for(j=0;j<58;j++); \
  18.   }

  19.   unsigned char c_lie=0,g_lie=0;
  20.   unsigned int lie_count=0,hang_count=0,am;  
  21.    
  22.   unsigned char ta[lie][hang_end];
  23.   
  24.   unsigned int get_n[]={  16,29,41,52,62,71,79,86,92,98,     //图像定距采集对应的摄像头行数
  25.                          103,108,112,116,120,124,128,132,135,138,
  26.                          141,144,147,150,153,156,159,162,165,168,
  27.                          170,172,174,176,178,180,182,184,186,188,
  28.                          190,192,194,196,198,200,202,204,206,208,
  29.                          210,211,212,242,243,245,246,247,248,249,250};


  30. unsigned char ts1,ts2, ge,shi;

  31. void SciTx(unsigned char text);


  32.         

  33. void chuankou(){
  34.      
  35.       delay(1700);
  36.       ge=37%10;
  37.      shi=37/10;
  38.      
  39.         //sdata=shi*16+ge;  
  40.      //SciTx(sdata);
  41.      
  42.      for(ii=1;ii<40;ii++){///第一次的调试的时候把40修改为2,校对调试助手的屏幕大小,当出现的数据刚刚一行时,说明串口调试助手的屏幕大小适合。
  43.                           //当完成上面的操作后,把2修改为40,这时候就能够看到一幅图像的数据了。
  44.         for(jj=1;jj<90;jj++){
  45.         
  46.            ts1=0;ts2=0;
  47.                
  48.            if(ta[ii][jj]==1&&ta[ii][jj+1]==1) ts1=16;//&&ta[ii][jj]>20
  49.              jj++;
  50.            if(ta[ii][jj]==1&&ta[ii][jj+1]==1) ts2=1;//&&ta[ii][jj]>20
  51.      
  52.            sdata=ts1+ts2;
  53.            SciTx(sdata);  
  54.         }
  55.      }  for(;;) {}      

  56. }

  57. void SciInit()
  58. {
  59.   DDRM=0x01;
  60.   SCI0BDH=0x00|0x01;
  61. SCI0BDL =0xA0;        
  62. SCI0CR2=0X2C;      
  63. SCI0CR1=0;     

  64. }

  65. /*-------发射端程序----------------------*/
  66. void SciTx(unsigned char text)
  67. {
  68.       
  69. while (!(SCI0SR1&0x80));   
  70. SCI0DRH=0;
  71. SCI0DRL=text;
  72.   
  73. }


  74. void chaopin(void)
  75. {  
  76.     CLKSEL=0X00;   
  77.     PLLCTL_PLLON=1;   
  78.     SYNR =0xc0 | 0x07;                        
  79.     REFDV=0xc0 | 0x01;
  80.     POSTDIV=0x00;      
  81.     _asm(nop);         
  82.     _asm(nop);
  83.     _asm(nop);
  84.     _asm(nop);
  85.     while(!(CRGFLG_LOCK==1));   
  86.     CLKSEL_PLLSEL =1;                    
  87. }

  88. void TIM_init(void)
  89. {   
  90.   PACTL=0X50;
  91.   PACNT=0X0000;
  92.   
  93.     TIOS =0x00;
  94.     TSCR1=0x80;
  95.     TCTL4=0x18;
  96.     TIE=0x06;  
  97.     TFLG1=0xFF;
  98.       
  99. }
  100. void shijian(void) {
  101.    PITCFLMT_PITE=0;      
  102.    PITCE_PCE0=1;         
  103.    PITLD0=9999;
  104.    PITMTLD0=5;      
  105.    PITMUX=0X00;
  106.    PITINTE_PINTE0=1;     
  107.    PITCFLMT_PITE=1;

  108.       
  109.          
  110. }




  111.            
  112. //===========================================================================================
  113. void main(void)
  114. {     
  115.    
  116. DDRA=0Xff;
  117. DDRJ=0X02;
  118. DDRK=0X30;


  119.    
  120.    DisableInterrupts;                 
  121.    {
  122.    
  123.      DDRB=0X01;


  124.      DDRM=0X00;
  125.      
  126.      DDRJ=0XBF;
  127.      PTJ_PTJ6=1;
  128.    
  129.     DDRS=0XEE;
  130.     PPSS=0X11;
  131.     PPSJ=0XFF;

  132.         
  133.     }
  134.                  
  135.     chaopin();            
  136.                
  137.     TIM_init();
  138.     shijian();
  139.    
  140.   SciInit();                     
  141.       EnableInterrupts;
  142.    
  143.      {
  144.       unsigned  int e,w;
  145.        for(e=1;e<6;e++)
  146.         for(w=0;w<10;w++);
  147.         
  148.             
  149.     }
  150.   
  151. DDRS=0XFF;
  152. PPSS=0X11;
  153. PPSJ=0XFF;
  154. DDRB=0XFF;
  155. DDRJ=0XfF;


  156. DDRA=0Xf0;

  157.   
  158. for(;;)
  159.   {
  160.    
  161. chuankou();
  162. /*这个函数一定要开启,串口调试方法
  163. 首先链接好线:通过USB转串口或者是MAX232,把芯片的S0与TXD接通,S1与RXD接通,共地线。
  164. 接着把接通芯片的电源,和摄像头的电源,同时保证摄像头和芯片的线连接正确,并保证摄像头看到完整的赛道。
  165. 把本程序拷入芯片里。打开串口调试助手,校对对应的串口端口,并选择十六进制显示。接下来的操作看上面的注释。

  166.   */
  167.   }
  168. }

  169.             
  170. //---------------------------------  
  171. #pragma CODE_SEG NON_BANKED
  172. void interrupt 10 IC2ISR(void) {
  173.    
  174.      TFLG1_C2F=1;

  175.   if(lie_count==get_n[c_lie]) {
  176.     delay(1);
  177.      
  178.      
  179.     for(hang_count=0;hang_count<=hang_end;hang_count++){
  180.      
  181.      
  182.       ta[c_lie][hang_count]=PORTA_PA0;//ATD0DR0L;

  183.       
  184.     }

  185.    c_lie++;
  186.   }
  187.   lie_count++;
  188.   
  189. }


  190. void interrupt 9 IC1ISR(void){              
  191.    TFLG1_C1F=1;
  192.    hang_count=0;
  193.    lie_count=0;
  194.    c_lie=0;   
  195.    }  

  196. void interrupt 66 PIT0Interrupt(void)
  197. {
  198.    //chesudu=PACNT;
  199.    
  200. ……………………

  201. …………限于本文篇幅 余下代码请从51黑下载附件…………
  202. </font></font>
复制代码


0.png

全部资料51hei下载地址:

手创科技OV5116采集和串口调试程序.rar (1.36 MB, 下载次数: 14)

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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