智能车制作

标题: 摄像头采集黑线和白线得到的数据没什么区别??、求指教 [打印本页]

作者: 夏天C的微笑    时间: 2012-3-15 19:28
标题: 摄像头采集黑线和白线得到的数据没什么区别??、求指教
硬件方面经过检查没有问题,应该是程序错了,我用的是内部AD(具体是AD1引脚,8位精度)现在能采集数据,就是数据不对,估计是初始化,或者端口哪边错了,求指导。。。。

#include <MC9S12XS128.h> #include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#include "CRP.h"

    int column;
   int row;
   unsigned int str[columnnum][row_max];
  
   void ATD0Init(void){ ATD0CTL1=0x01;   //AD 转换控制器1 初始设定,具体功能查表(比如 采样前不放电)                        ATD0CTL2=0x00;  
ATD0CTL3=0x80;                     
ATD0CTL4=0x80;  
ATD0CTL5=0x21;    //连续转         换,1通道转换,             }
                                
   void PLL_Init(void)       //初始化  
    {                                  //BUS-CLOCK=PLL-CLOCK/2=32M   
     REFDV = 31;  // set the REFDV register 16M*2*(3+1)/(1+1)=64M   
     SYNR = 63;    // set the SYNR register to give us a 64 MHz PLL-clock.            
     asm nop    // nops required for PLL stability.   
     asm nop     
     asm nop   
    asm nop   
     while ((CRGFLG&0x08)==0); // wait here till the PLL is locked.   
      CLKSEL|=0x80;             // switch the bus clock to the PLL.}

       void SCI_Init(void)
      {
         SCI0CR1=0x04;     //允许快速检测
         SCI0CR2=0x2C;    //允许RDRF或者 OR置1 产生SCI中断请求,允许发送,接收
         SCI0BDH=0x00;    //波特率控制寄存器 SCI0BDL=0xd0;
      }



        void Init(void)
         {
             PLL_Init();                     
             SCI_Init();  
             ATD0Init();
         }


    void main(void)      //主函数
{  

PPSH=0x00;    //H口对应的下降沿信号将使PIFH寄存器相应位置1
PIEH=0x01;    //H口引脚0中断使能
PIEJ=0x00;    //J口中断关闭  原来是关闭0口的

Init();
EnableInterrupts;
for(;;);
}




extern int column;      
extern int row;
extern unsigned int str[columnnum][row_max];   //定义一个36行,24列的数组

#pragma CODE_SEG NON_BANKED    //中断入口
void interrupt 24 PJI(void)
{                                 //行中断
  int i,j;

  PIFJ=0x01;                  //PIFJ为J口中断标志位寄存器,为1清除标志位,为0无效   
for(i=0; i<16; i++)
   {
    asm nop;
    }


  if (column%6==0&&column<276&&column>=60)   //行循环
  {
  for(row=0; row<24 ;row++)             //列循环
    {
    while (!ATD0STAT0_SCF);    //SCF ---转换序列完成标志,0 表示转换序列没有完成,1 转换序列完成
    str[(column-60)/6][row]=ATD0DR1;// AD转换结果寄存器
    ATD0STAT0_SCF=1;                //图像采集完成

    }


  }

  column++;
  if(column>=275)
{
  PIEJ=0x00;

  for(i=0; i<36; i++)
  {
   for(j=0; j<24 ;j++)
    {
      while(!(SCI0SR1&0x40));
      SCI0DRL= (unsigned char)str[j];
    }
  }
  PIEH=0x01;            //H口中断使能寄存器,为0关中断
}  
}

void interrupt 25 PHI(void)  //场中断入口
{
PIFH=0x01;            //H口标志位清除
EnableInterrupts;
PIEJ=0x01;            //允许行中断
PPSJ=0x00;            //J口极性选择寄存器某一位为零时j口对应引脚
                       //下降沿将使PIFJ寄存器相应位置1
column=0;
}                                                         








作者: sonwendi    时间: 2012-3-15 20:25
示波器看看摄像头信号对不对,会不会连接线有短路
或者你测试一下AD对不对,给个模拟电压转换一下试一试
每一行前面有一点点是行消隐,要考虑延时消掉,场消隐也是要通过判断采样行搞掉
作者: 夏天C的微笑    时间: 2012-3-15 20:59
sonwendi 发表于 2012-3-15 20:25
示波器看看摄像头信号对不对,会不会连接线有短路
或者你测试一下AD对不对,给个模拟电压转换一下试一试
...

今天特地用电位器试了一下AD,转换过来没问题,数据出了点误差之外没问题。行消隐和场消隐虽然会影响数据了,但是对于黑白线转换过来的数据影响不大啊。现在感觉黑白没区别。。真郁闷。。

作者: 新手学做车    时间: 2012-3-26 22:24
这个问题解决了吗???我也出现这个问题了
作者: 夏天C的微笑    时间: 2012-3-27 11:29
新手学做车 发表于 2012-3-26 22:24
这个问题解决了吗???我也出现这个问题了

描述一下你的问题

作者: 新手学做车    时间: 2012-3-27 16:27
夏天C的微笑 发表于 2012-3-27 11:29
描述一下你的问题

用串口软件看到的图像一场内都是一个值,用的是CCD摄像头,用5110做外部AD转换
作者: 夏天C的微笑    时间: 2012-3-27 16:48
新手学做车 发表于 2012-3-27 16:27
用串口软件看到的图像一场内都是一个值,用的是CCD摄像头,用5110做外部AD转换

你把行和列的值改小点,比如说 就采5行10列。。数据少了容易分析。我们也遇到过出来一系列一样的值






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