智能车制作

标题: 求解线性ccd图像采集问题 [打印本页]

作者: yingsuhua    时间: 2015-1-24 11:26
标题: 求解线性ccd图像采集问题


本人用的主控板是kl26,蓝宙提供的k60线性ccd自适应曝光测试程序不能直接使用,修改程序后采集回来的图像貌似出现严重锯齿,实在不知道问题出在哪????????   急急急急急

以下是自己修改的程序
/*********************************************  main.c  ************************************/
#include "common.h"
#include "include.h"
#include "calculation.h"

uint8 send_data_cnt = 0;
uint8 TIME1flag_10ms=0;
uint8 Pixel[128];
uint8 i=0;

/**************************************  calculation.c  ***************************************/
#include "common.h"
#include "include.h"
#include "calculation.h"
//#include "isr.c"

uint8 *ImageData=0;
extern uint8 Pixel[128];
      uint8 PixelAverageValue=0;     //CCD1阈值
      uint8 PixelAverageValue_old=0;
      uint8 value1_max=0;
      uint8 value1_min=0;

/*****************************************************

*函数名                    :CCD_init
*函数功能                  :CCD初始化
*时间                      :2015_1_20


******************************************************/
void CCD_init()
{
  gpio_init(PTA15,GPO,1);
  gpio_init(PTA6, GPO,1);
  adc_init(ADC0_SE11);
}










/*****************************************************

*函数名                     :SartIntegration
*函数功能                   :启动程序__时序操作
*实验模块                   :蓝宙线性ccd三代
*时间                       :2015_1_20

*******************************************************/
void StartIntegration()
{

  SI_SetVal();
  SampLingDelay();
  CLK_SetVal();
  SampLingDelay();
  SI_ClrVal();
  SampLingDelay();
  CLK_ClrVal();

  for(uint8 i=0;i<128;i++)
  {
    SampLingDelay();
    SampLingDelay();
    CLK_SetVal();
    SampLingDelay();
    SampLingDelay();
    CLK_ClrVal();
  }
  SampLingDelay();
  SampLingDelay();
  CLK_SetVal();
  SampLingDelay();
  SampLingDelay();
  CLK_ClrVal();
  }

/*****************************************************

*函数名                    :ImageCapture
*函数功能                  :CCD采样程序
*参数说明                  :*ImageData 采样数组
*时间                      :2015_1_19

******************************************************/
void ImageCapture(uint8 *ImageData)
{

  SI_SetVal();
  SampLingDelay();
  CLK_SetVal();
SampLingDelay();
  SI_ClrVal();
  SampLingDelay();

  //Delay for the first pixel
  for(uint8 i=0;i<20;i++)
  {
    SampLingDelay();

  }
  //SampLinging pixel 1
  *ImageData=adc_once(ADC0_SE11,ADC_8bit);
  ImageData++;
  SampLingDelay();
  CLK_ClrVal();

  for(uint8 i=0;i<127;i++)
  {
    SampLingDelay();
    CLK_SetVal();
    SampLingDelay();

    //SampLingDelay pixel 2-128
    *ImageData = adc_once(ADC0_SE11,ADC_8bit);
    ImageData++;
    CLK_ClrVal();
   }

  SampLingDelay();
  CLK_SetVal();
  SampLingDelay();
  CLK_ClrVal();
}



/***************************************************
*函数名                      :Get_Dyn_Th
*函数功能                    :计算动态阈值
*时间                        :2015_1_20


*****************************************************/
void Get_Dyn_Th(void)
{



     PixelAverageValue_old=PixelAverageValue;


     //计算CCD1像素点最大值
     value1_max=Pixel[0];
     for(uint8 i=1;i<128;i++)
     {
        if(value1_max<=Pixel)
        value1_max=Pixel;
     }
     //计算CCD1像素点最小值
     value1_min=Pixel[0];
     for(uint8 i=1;i<128;i++)
     {
        if(value1_min>=Pixel)
        value1_min=Pixel;
     }
     //计算CCD1阈值
     PixelAverageValue=(value1_max+value1_min)/2+40;

     if(abs(value1_max-value1_min)<=110)
     {
        PixelAverageValue=PixelAverageValue_old;   
     }
}   

/******************************************************

*函数名                  :Bi_conversion
*函数功能                :赛道路面信息处理_软件二值化
*时间                    :2015_1_20

*******************************************************/
void Bi_conversion(void)
{

     Get_Dyn_Th();
     for(uint8 i=0;i<128;i++)
     {
         if(Pixel>PixelAverageValue)      //PixelAverageValue即为阈值
         {
              Pixel=250;
         }
         else
         {
              Pixel=0;
         }

     }
  }


/*****************************************************

*函数名                       :sendsex
*函数功能                     :上位机识别语言
*时间                         :2015_1_20

*******************************************************/
void SendHex(unsigned char hex)
{
   unsigned char temp;
   temp = hex >> 4;
   if(temp < 10)
   {
     uart_putchar(UART0,temp + '0');
     }
   else
   {
     uart_putchar(UART0,temp - 10 + 'A');
    }
   temp = hex & 0x0F;
   if(temp < 10)
   {
     uart_putchar(UART0,temp + '0');
   }
   else
   {
     uart_putchar(UART0,temp - 10 + 'A');
   }
}

/**************************************************

*函数名                          :SendImageData
*函数功能                        :上位机通信协议
*时间                            :2015_1-20

****************************************************/

void SendImageData(unsigned char * ImageData)
{

    unsigned char i;
    unsigned char crc = 0;

    /* Send Data */
    uart_putchar(UART0,'*');
    uart_putchar(UART0,'L');
    uart_putchar(UART0,'D');

    SendHex(0);
    SendHex(0);
    SendHex(0);
    SendHex(0);

    for(i=0; i<128; i++)
    {
      SendHex(*ImageData++);
    }

    SendHex(crc);
    uart_putchar(UART0,'#');
  }


/*************************************************************************
*                           蓝宙电子工作室
*
*  函数名称:SamplingDelay
*  功能说明:CCD延时程序 200ns
*  参数说明:
*  函数返回:无
*  修改时间:2012-10-20
*  备    注:
*************************************************************************/
void SampLingDelay(void)
{
   volatile uint8 i ;
   for(i=0;i<1;i++)

   {
    asm("nop");
    asm("nop");
     asm("nop");
    }
  }







void PIT1_IRQHandler(void)
{  
   PIT_Flag_Clear(PIT1);                       //清中断标志位
    StartIntegration();                       //曝光函数
   static unsigned char TimerCnt10ms = 0;
   TimerCnt10ms++;
}



void main()
{
  uint8 *Pixel_pt;
  DisableInterrupts;                             //禁止总中断

  for(uint8 i=0;i<128;i++)
  {
    *Pixel_pt++=0;
  }
    Pixel_pt=Pixel;



  /********************   初始化  *************************/
  //uart_init(UART0,115200);
  //adc_init(ADC0_SE11);
  CCD_init();
   EnableInterrupts;                                            //开总中断


  while(1)
  {
    if(TIME1flag_10ms == 1)
      {
        TIME1flag_10ms = 0 ;
        ImageCapture(Pixel);                    // Sampling CCD data
        if(++send_data_cnt >= 5)                // Send data to CCDView every 100ms
        {   
          send_data_cnt = 0;
          SendImageData(Pixel);
        }
      }
    }


一下是上位机显示的图像:
}
[attach]73753[/attach]

作者: 孔令超    时间: 2015-1-24 12:26
:):):)
作者: 泰庆电子    时间: 2015-1-24 13:58
那可能是硬件问题,CCD看看有没有虚焊 或者 接口可插紧了。
作者: yingsuhua    时间: 2015-1-24 14:34
泰庆电子 发表于 2015-1-24 13:58
那可能是硬件问题,CCD看看有没有虚焊 或者 接口可插紧了。

程序............................................有木有问题????????
作者: make1573    时间: 2015-1-24 21:59
我是来看头像的




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