智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 11406|回复: 32
打印 上一主题 下一主题

[采集类] 怎样计算ccd摄像头的采集点数

  [复制链接]

0

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
威望
187
贡献
22
兑换币
0
注册时间
2009-3-10
在线时间
17 小时
跳转到指定楼层
1#
发表于 2009-3-11 08:54:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1贡献

9

主题

358

帖子

42

精华

金牌会员

Rank: 6Rank: 6

积分
1296
威望
80
贡献
506
兑换币
206
注册时间
2008-9-18
在线时间
355 小时
2#
发表于 2009-3-11 17:54:02 | 只看该作者
计算采集点数?
你要怎么计算啊???
估计你可能还没有搞清楚摄像头的时序问题!
点数在你采集的时候是要用你的程序来试的,这和你的程序的效率有很大关系。c估计无法计算。只有用实际的采集来的看了。汇编估计可以,你好好在看看摄像头的时序吧。我刚开始的时候也想到过你的这个问题。
cys179@gmail.com 可以练习我。

补充内容 (2015-4-23 09:36):
真人游戏|足球篮球|时时彩| 六合投注| 网络赚钱去SO娱乐城:顶级信用,提现百分百即时到账SO.CC


回复

使用道具 举报

14

主题

929

帖子

1

精华

功勋会员

WJ

Rank: 10Rank: 10Rank: 10

积分
6304

特殊贡献奖章

威望
1456
贡献
4674
兑换币
17
注册时间
2008-4-6
在线时间
87 小时
3#
发表于 2009-3-11 19:28:30 | 只看该作者
配合示波器看,
回复

使用道具 举报

0

主题

12

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
威望
182
贡献
22
兑换币
0
注册时间
2009-1-11
在线时间
3 小时
4#
发表于 2009-3-11 20:47:14 | 只看该作者
C:\Documents and Settings\You chuanjiang\桌面\test0.7.25
回复

使用道具 举报

0

主题

12

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
威望
182
贡献
22
兑换币
0
注册时间
2009-1-11
在线时间
3 小时
5#
发表于 2009-3-11 20:48:34 | 只看该作者
弄错了,呵呵
#include <hidef.h>      /* common defines and macros */
#include <mc9s12dg128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
unsigned char imagin[40][70];
unsigned char guiji[40];
unsigned int sd_z[4]={450,500,550,600},z_sd,w_sd;
unsigned int sd_w[4]={280,300,310,320};
unsigned char jsd_z[4]={30,20,15,5},z_jsd,w_jsd;
unsigned char jsd_w[2]={30,20};
char i=0,j=0,k=0,complete=2;
unsigned char go,speed,cnt,flag_j,cnt2=210,cnt3=0;
int pingjun;
unsigned char *p;
unsigned int *addr;
//*******************图像分析函数****************************
void fenxi(void) {
  unsigned char ii,jj,kk,buf2=0,buf3=3,sum=0;
  char buf;
  int sum1=0,sum2=0;
   //cnt2=0;
  /* for(ii=10;ii<60;ii++) {
    sum1=0;
    kk=0;
    for(jj=20;jj<40;jj++) {
      if((imagin[jj][ii]<55)&&(imagin[jj][ii-1]<55)){
        kk++;
        sum1+=jj;
      }
    }
    if(kk)
      hx[ii]=(char)(sum1/kk);
    else hx[ii]=0;
  }
  buf2=0;
  kk=0;
  for(ii=11;ii<60;ii++) {
    if(hx[ii]){
      //if(buf3>10)
        //buf3=0;
      buf=hx[ii]-hx[ii-1];
      if((buf<2)&&(buf>(-2))&&(buf3>2))
        kk++;
      else{
       if(kk>4) {
        buf3=0;
        kk=0;
        if(kk<20)
          buf2++;
        }
      }
      //else if(kk>8)
    }
    else {
      if(kk>4) {
        buf3=0;
          buf2++;
      }
      buf3++;
      kk=0;
    }
  }
  if(kk>4)
    buf2++;
  if(buf2==2){
    PORTK|=0x04;
    cnt3++;
    if(cnt3>0){
      cnt3=0;
      if((cnt2>200)&&go){
        cnt2=0;
        flag_q++;
      }
      if(flag_q>1){
        PWMDTY0=0;
        speed=0;
        go=0;
        PORTK&=0xfe;
        flag_q=0;
      }
    }
  }
  else {
    PORTK&=0xfb;
    cnt3=0;
  }*/
  jj=39;
  kk=0;
  there:p=&imagin[jj][0];
  for(ii=0;ii<70;ii++){
      if(*(p++)<50) {
        kk++;
      }
      else {
        if(kk>13) {
          pingjun=0;
          return;
        }
        else if(kk>3)break;
        else
         kk=0;
      }
    }
    if(kk<2){
      if(jj>35)jj--;
      else return;
      goto there;
    }
    guiji[jj]=ii-1;
    buf=ii-7;
    if(buf<0)buf=0;
    else if(buf>56)buf=56;
    kk=0;
    buf3=jj-2;
    jj--;  
  for(;jj>18;jj--){
    sum=0;
    p=&imagin[jj][buf];
    kk=0;
    buf2=0;
    for(ii=0;ii<14;ii++){
      if((*(p++)<60)&&(*p<60)) {
        kk++;
        sum+=ii;
      }
    }
    if(kk>0) {
      guiji[jj]=sum/kk+buf;
    }
    else {
      if(guiji[jj+1]>65){
        pingjun=140;
        flag_j=1;
        goto here2;
      }
      else if(guiji[jj+1]<10){
        pingjun=-140;
        flag_j=1;
        goto here2;
      }
      if(jj<38)
        guiji[jj]=2*guiji[jj+1]-guiji[jj+2];
      else guiji[jj]=guiji[jj+1];
    }
    //if(guiji[jj]>(guiji[jj+1]+1))
      buf=guiji[jj]-7;                 //
    //else if((guiji[jj]+1)<guiji[jj+1])
     // buf=guiji[jj]-13;
   // else buf=guiji[jj]-7;
    if(buf<0)buf=0;
    else if(buf>56)buf=56;
  }
  if(buf>50)buf=50;
  for(jj=18;jj>0;jj--){
    buf2=0;
    p=&imagin[jj][buf];
    kk=0;
    for(ii=0;ii<20;ii++){
      if(*p<65) {
        kk++;
      }
      else {
        if(kk>0)break;
        else{
          buf2=ii;
          kk=0;
        }
      }
      p++;
    }
    if(kk<1) {
      guiji[jj]=guiji[jj+1];
      continue;
    }
    else{
      buf2+=buf;
      buf+=ii;
      if(buf<guiji[jj+1])
        guiji[jj]=buf2;
      else
        guiji[jj]=buf;
    }
    buf=guiji[jj]-10;
    if(buf<0)buf=0;
    else if(buf>50)buf=50;
  }  
  //求平均偏移量//
  flag_j=0;
  for(jj=3;jj<7;jj++){
    if((guiji[jj]>60)||(guiji[jj]<10))
      flag_j=1;
  }
  for(jj=8;jj<12;jj++){
    sum1+=guiji[jj];
    if((guiji[jj]>60)||(guiji[jj]<10))
      flag_j=1;
  }
  sum1/=4;   
  for(jj=27;jj<30;jj++){
    sum2+=guiji[jj];
  }
  sum2/=3;
  pingjun=5*(sum1-35)-2*(sum1-sum2);
  //pingjun=(sum2-35)*4;
  if(pingjun>140)pingjun=140;
  if(pingjun<(-140))pingjun=-140;
  here2:
  if(flag_j)PORTK|=0x08;
  else PORTK&=0xf7;
}
//*****eeprom初始化*************************
void init_eeprom(void) {
  ECLKDIV=0x15;
  ECNFG=0;
  while(ECLKDIV_EDIVLD==0);  
}
//*****写eeprom*************************
char write_eeprom(unsigned int dat) {
  while(ESTAT_CBEIF==0);
  *addr=dat;
  ECMD=0x60;
  ESTAT=0x80;
  while(ESTAT_CCIF==0);
  if(ESTAT_ACCERR)return 0;
  return 1;
}
//*****PWM初始化*************************
void init_pwm(void) {
  PWME=0;
  PWMPRCLK=0x53;
  PWMSCLA=25;
  PWMSCLB=50;
  PWMCLK=0x03;
  PWMDTY0=0;
  PWMPER0=100;
  PWMDTY67=1503;
  PWMPER67=20000;
  PWMPOL=0x80;
  PWMCAE=0x00;
  PWMCTL=0x80;
  PWME=0x81;
}
//****************************************
void main(void) {
  char flag=0;
  int buf1;
  INITEE = 0x61;  /* lock EEPROM block to end at 0x0fff */
  CLKSEL &= 0x7F;  
  REFDV = 1;  
  SYNR = 3;  
  while(!(CRGFLG&0x08));
  CLKSEL |= 0x80;     
  init_eeprom();
  addr=(unsigned int *)0x6002;
  DDRK|=0x2f;       //portk的低四位做能为输出
  TSCR1=0x80;
  TSCR2=0x83;
  PACTL=0x40;
  TCNT=0x00;
  TIOS=0x00;
  TCTL4=0x55;
  TIE=0x06;
  DLYCT=0x00;
  INTCR=0xC0;    //VSYNC下降沿触发
  DDRH&=0xfe;
  PPSH=0x01;    //HREF上升沿触发
  PIEH=0x01;
  DDRA=0x00;
  SCI0CR2=0x0c;
  SCI0BDH=0x00;
  SCI0BDL=104;        //波特率=19200   208;
  DDRM=0x00;      //拨码开关设定为输入
  PERM=0xff;      //上下拉使能
  PPSM=0x00;      //上拉
  init_pwm();
  //if(*addr==1){
    go=1;
    PORTK|=0x01;
  //}
  buf1=PTM;
  z_sd=sd_z[buf1&0x03];
  buf1>>=2;
  z_jsd=jsd_z[buf1&0x03];
  buf1>>=2;
  w_sd=sd_w[buf1&0x03];
  buf1>>=1;
  w_jsd=jsd_w[buf1&0x01];
  //PLLCTL=0xf3;
  //COPCTL=0x05;
  EnableInterrupts;
for(;;) {
   //ARMCOP=0X55;
  if(complete==1) {
    DisableInterrupts;
    if(flag==1){      
     for(i=0;i<40;i++){                 //////
      while(!(SCI0SR1&0x80));         
      SCI0DRL=0;
      for(j=0;j<70;j++) {
        while(!(SCI0SR1&0x80));         
         SCI0DRL=imagin[i][j];
      }
    }
    while(!(SCI0SR1&0x80));         
    SCI0DRL=0;
    while(!(SCI0SR1&0x80));         
    SCI0DRL=0;
    }
    //ARMCOP=0XAA;  
    fenxi();
      buf1=1503-pingjun;
      PWMDTY67=buf1;
    EnableInterrupts;
    flag=0;
    complete=2;
  }
  if(SCI0SR1&0x20) {
    if(SCI0DRL==48) {
      flag=1;
      complete=2;
    }
  }
}
}

//*********************************************
#pragma CODE_SEG NON_BANKED

void interrupt  VSYNC_ISR(void)   //场信号中断
{
DisableInterrupts;  //关中断
if(complete==2) {
  i=0;
  complete=0;
  k=0;
  p=&imagin[0][0];
  }
}   
void interrupt  HREF_PH0(void) {    //行信号中断
unsigned char jj;
DisableInterrupts;  //关中断
  if(complete==0) {
    if(k>6) {
      for(jj=0;jj<70;jj++){
        k=0;
        *(p++)= PORTA;        
      }
      i++;
      if(i>39) complete=1;
    }
    k++;
  }
   PIFH=0x01;

}
//******************************************************
void interrupt  Timer(void) {        //时间中断,调速
unsigned int buf;
int such;
  DisableInterrupts;  //关中断
  TCNT=0;
  buf=PACN32;
  PACN32=0;
  if(cnt2<210)cnt2++;  
  if(cnt)
    cnt--;
  else {
    PORTK^=0x02;
    if(go==1){
      if(flag_j==0){
        PORTK&=0xf7;
          such=buf-z_sd;
        if(such<0){
          such/=z_jsd;            
        }
        else such/=30;
      }
      else {
       PORTK|=0x08;
       if(buf>420){
        cnt=4;
        PORTK|=0x20;
        PWMDTY0=65;
        goto out;
       }
       if(buf>400){
        cnt=4;
        PORTK|=0x20;
        PWMDTY0=60;
        goto out;
       }
       if(buf>370){
        cnt=3;
        PORTK|=0x20;
        PWMDTY0=60;
        goto out;
       }
       such=buf-w_sd;
       if(such>0)
        such/=30;
       else{
        such/=w_jsd;
       }
      }
      PORTK&=0xdf;
      if(speed>such)speed-=such;
      else speed=0;
      if(speed>95)speed=95;
      PWMDTY0=speed;
    }
  }
  out: TFLG2=0x80;
}
//******************************************************
void interrupt IC1_ISR(void) {
DisableInterrupts;  //关中断       C
  TFLG1=0x02;
  PORTK|=0x01;
  go=1;
  while(write_eeprom(1)==0);
}
void interrupt IC2_ISR(void) {
DisableInterrupts;  //关中断       B
  TFLG1=0x04;
  PORTK&=0xfe;
  go=0;
  PWMDTY0=0;
  speed=0;
  while(write_eeprom(0)==0);
}试试这个程序
回复

使用道具 举报

9

主题

358

帖子

42

精华

金牌会员

Rank: 6Rank: 6

积分
1296
威望
80
贡献
506
兑换币
206
注册时间
2008-9-18
在线时间
355 小时
6#
发表于 2009-3-14 15:40:19 | 只看该作者
大哥也不给个注释。把人往死里看啊
回复

使用道具 举报

0

主题

57

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
威望
241
贡献
28
兑换币
0
注册时间
2008-12-19
在线时间
46 小时
7#
发表于 2009-3-15 18:09:58 | 只看该作者
好好了解ccd的工作原理后,你就会了,最直观的方法就是用示波器看时序图,强烈建议
回复

使用道具 举报

0

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
389
威望
276
贡献
71
兑换币
34
注册时间
2009-2-11
在线时间
21 小时
8#
发表于 2009-4-6 16:24:16 | 只看该作者
这程序可以直接仿真吧,看了一下,感觉有的循环太罗嗦,可以简练点的。
回复

使用道具 举报

0

主题

96

帖子

0

精华

高级会员

Rank: 4

积分
823
威望
296
贡献
479
兑换币
0
注册时间
2009-3-10
在线时间
24 小时
9#
发表于 2009-4-6 20:31:56 | 只看该作者
大哥也不给个注释。把人往死里看啊
cys179 发表于 2009-3-14 15:40
回复

使用道具 举报

0

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
威望
185
贡献
22
兑换币
0
注册时间
2009-5-13
在线时间
2 小时
10#
发表于 2009-5-15 10:23:54 | 只看该作者
太长了把。。。。。。。。。。
回复

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-29 16:02 , Processed in 0.069021 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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