智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2698|回复: 2
打印 上一主题 下一主题

求解线性ccd采集图像问题

[复制链接]

2

主题

3

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
威望
177
贡献
116
兑换币
111
注册时间
2014-11-1
在线时间
34 小时
毕业学校
湖北工业大学
跳转到指定楼层
1#
发表于 2015-1-24 10:24:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人用的主控板是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);
        }
      }
    }
}





































回复

使用道具 举报

14

主题

876

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5811
威望
3006
贡献
1961
兑换币
1991
注册时间
2013-2-28
在线时间
422 小时
2#
发表于 2015-1-24 15:04:39 | 只看该作者
问问题不是这么问的,这么长代码谁看?
回复 支持 反对

使用道具 举报

1

主题

20

帖子

0

精华

高级会员

Rank: 4

积分
619
威望
312
贡献
171
兑换币
195
注册时间
2014-6-20
在线时间
68 小时
毕业学校
齐鲁工业大学
3#
发表于 2015-2-1 10:26:52 | 只看该作者
你显示的是二值化的还是采集的波形?   用什么显示的         上位机?        很多东西都没说清楚别人也不好回答把
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-26 13:56 , Processed in 0.045911 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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