智能车制作

标题: 线性ccd采集到图像是这个样子 不知道怎样处理了? [打印本页]

作者: 飞叶123    时间: 2014-4-9 22:33
标题: 线性ccd采集到图像是这个样子 不知道怎样处理了?
新手 :刚刚才把采集到的图像搞出来 请知道接下来怎样处理的或者有什么需要修改的指导一下
其实图像是这个样子不知道对不对?
非常感谢!

[attach]58233[/attach]
*                     
* 引脚连接:
*                      PORTA_PA0   --SI
*                      PORTA_PA1   --CLK
*                      AN00        --AO
*
* 串口显示:利用MC9S12XS128的SCI0作为串口
*                      PS1        --TXD
*                      PS0        --RXD
*
* 参数设置:
*                      PRINT_AD    --设置串口打印数据的类型,二值量或模拟量   
*                      THRESHOLD   --设置模拟量转二值量的阈值   
*                      WINDOW_WIDTH--设置串口打印采集数据的宽度   
*
*/
#include <hidef.h>            /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

#define TSL1401_SI(x)   (PORTA_PA0=(x))
#define TSL1401_CLK(x)  (PORTA_PA1=(x))

#define PRINT_AD        (1)       //设置串口打印数据类型,0:打印二值化数据,1:打印AD值
#define THRESHOLD       (100)     //设置二值化阈值
#define WINDOW_WIDTH    (128)     //设置串口打印的像素个数,最大128,最小0

void IO_Init(void);
void ADC_Init(void);
void UART0_Init(void);
void SetBusClock(void);
uint ADCValue(uchar channel);
void TSL1401_GetLine(uchar *pixel);
void UART0_SendByte(byte ch);
void UART0_SendPacket(byte *pBuf,int pBuf_Length);
void delay();
void DelayMs(int time);

//全局变量声明
uchar gPixel[128] = {0};

void main(void)
{

  uchar i;

        EnableInterrupts;
        //初始化系统时钟,使其配置在32Mhz
  SetBusClock();
  //初始化IO
  IO_Init();
  //初始化ADC
  ADC_Init();
  //初始化UART
  UART0_Init();

  for(;;)
  {

    _FEED_COP(); /* feeds the dog */

    //获得像素值
    TSL1401_GetLine(gPixel);

    //打印输出
    for(i=(64-WINDOW_WIDTH/2); i<(64+WINDOW_WIDTH/2); i++)
    {
#if(PRINT_AD==1)          //串口发送AD值,可用于线性CCD调试助手
      if(gPixel==0xFF)
        gPixel = 0xFE; //遇到FF用FE替换即可
      UART0_SendByte(gPixel);
#else                     //串口发送而值量,方便用串口调试
      if(gPixel>THRESHOLD)
        UART0_SendByte(1);
      else
        UART0_SendByte(0);
#endif     
    }
    UART0_SendByte(0xFF);
    DelayMs(100);
  }

}


//---------------------------------------------------------------------
// 函数功能:配置单片机锁相环,使其工作在32Mhz
// 形式参数:  无
// 函数返回值:无   
//---------------------------------------------------------------------
void SetBusClock(void)
{   
  CLKSEL=0x00;        //disengage PLL to system
  PLLCTL_PLLON=1;     //turn on PLL
  SYNR =0x40 | 0x03;  //VCOFRQ[7:6];SYNDIV[5:0];
  REFDV=0x80 | 0x01;  //REFFRQ[7:6];REFDIV[5:0]
  POSTDIV=0x00;
                      //fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1);fPLL= fVCO/(2 × POSTDIV);BUS= fPLL/2
                      //if POSTDIV=0, fPLL= fVCO
  _asm(nop);          //BUS CLOCK=32M
  _asm(nop);
  while(!(CRGFLG_LOCK==1));  //when pll is steady ,then use it;
  CLKSEL_PLLSEL =1;          //engage PLL to system;
}

//---------------------------------------------------------------------
// 函数功能:控制
// 形式参数:  无
// 函数返回值:无   
//---------------------------------------------------------------------
void IO_Init(void)
{

  DDRA_DDRA0 = 1; //配置IO为输出
  DDRA_DDRA1 = 1; //配置IO为输出
  PORTA_PA0  = 0; //配置IO的数据为0
  PORTA_PA1  = 0; //配置IO的数据为0
}

//---------------------------------------------------------------------
// 函数功能:UART0_Init初始化
// 形式参数:  无
// 函数返回值:无   
//---------------------------------------------------------------------
void UART0_Init(void)
{
  SCI0CR1 = 0x00;
  SCI0CR2 = 0x2C;     //接收中断使能,发送接收使能
  SCI0BD  = 0x34;     //波特率配置成38400
                      //When IREN = 0 then
                      //SCI baud rate = SCI bus clock / (16 x SBR[12:0])
}

//---------------------------------------------------------------------
// 函数功能:SCI0发送一个字节数据
// 形式参数:  byte ch:发送的一个字节数据
// 函数返回值:无   
//---------------------------------------------------------------------
void UART0_SendByte(byte ch)
{
  while(!(SCI0SR1&0x80));
  SCI0DRL = ch;
}

//---------------------------------------------------------------------
// 函数功能:SCI0发送字符串数据
// 形式参数:   byte *pBuff     发送缓冲区
//              int Length 发送字节的长度
// 函数返回值:无   
//---------------------------------------------------------------------
void UART0_SendPacket(byte *pBuf,int pBuf_Length)
{
  int i;
  for(i=0;i<pBuf_Length;i++)
  {
    while(!(SCI0SR1&0x80));
    SCI0DRL=*(pBuf+i);
  }
}


//---------------------------------------------------------------------
//函 数 名:ADCInit                                                      
//功    能:A/D转换初始化,设置A/D转换时钟频率为1MHz                     
//参    数:无                                                           
//返    回:无                                                           
//---------------------------------------------------------------------
void ADC_Init(void)
{

  //ATD0CTL4: SMP2=1,SMP1=1,SMP0=1,PRS4=0,PRS3=1,PRS2=1,PRS1=1,PRS0=1
  ATD0CTL4 = 0b11101111; //设置采样时间和频率,fATDCLK=fBUS/(2 ×(PRS + 1))

  //ATD0CTL3: DJM=1,S8C=0,S4C=0,S2C=0,S1C=1,FIFO=0,FRZ1=0,FRZ0=0
  ATD0CTL3 = 0b10001000; //采样结果右对齐,每个序列的转换个数为1

  //ATD0CTL0: ??=0,??=0,??=0,??=0,WRAP3=1,WRAP2=1,WRAP1=1,WRAP0=1
  ATD0CTL0 = 0b00000001; //AD循环采集到AN1后即可  

  //ATD0CTL1: ETRIGSEL=0,SRES1=0,SRES0=0,SMP_DIS=0,ETRIGCH3=1,ETRIGCH2=1
  //,ETRIGCH1=1,ETRIGCH0=1
  ATD0CTL1 = 0b00001111; //8位分辨率,采样前不卸载内部采样电容!⑼獠看シ⑹保?≡裢ǖ?5   

  //ATD0CTL2: ??=0,AFFC=1,ICLKSTP=0,ETRIGLE=0,ETRIGP=0,ETRIGE=0,ASCIE=0,
  //ACMPIE=0
  ATD0CTL2 = 0b01000000; //下降沿触发,不接受外部信号,禁用ATD比较中断请求      

}


//---------------------------------------------------------------------
//函 数 名:ADCValue                                                     
//功    能:1路A/D转换函数,获取通道channel的A/D转换结果                  
//参    数:channel = 通道号                                             
//返    回:该通道的12位A/D转换结果                                      
//---------------------------------------------------------------------
uint ADCValue(uchar channel)
{
  //暂存A/D转换的结果
  uint temp;                        
        ATD0CTL5 = channel;
        //取A/D转换结果                                 
  while(!ATD0STAT0_SCF);
  temp = ATD0DR0;
        return  temp;
}


//----------------------------------------------------------------------
//函 数 名:延时函数 delay(), DelayMs()                                                     
//功    能:延时函数                                                              
//返    回:无                                                                                       
//----------------------------------------------------------------------
void delay()
{
  unsigned int i;
  for(i=0;i<10;i++)
  {
    asm("nop");
  }
}

void DelayMs(int time)
{
  short x,y;
  for(x=0;x<4106;x++){
    for(y=time;y>0;y--){
    }
  }
}

//----------------------------------------------------------------------
//函 数 名:TSL1401_GetLine                                                      
//功    能:获得AD采样像素                                       
//参    数:*pixel  获得的像素值                          
//返    回:无                                                                                       
//----------------------------------------------------------------------
void TSL1401_GetLine(uchar *pixel)
{
  uchar i;

  //开始SI
  TSL1401_SI(0) ;
  TSL1401_CLK(0);
  delay();
  TSL1401_SI(1);
  delay();
  TSL1401_CLK(1);
  delay();
  TSL1401_SI(0);
  delay();
  //采集第1个点
  //AD配置成为8位精度,所以这里获得的是一个字节数据
  pixel[0] = (uchar)ADCValue(0);
  TSL1401_CLK(0);

  //采集第2~128个点
  for(i=1; i<128; i++)
  {
    delay();
    TSL1401_CLK(1);
    delay();
    pixel = (uchar)ADCValue(0);
    TSL1401_CLK(0);
  }

  //发送第129个clk
   delay();
   TSL1401_CLK(1);
   delay();
   TSL1401_CLK(0);
   delay();
}


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



作者: 邵志伟    时间: 2014-4-9 22:45
红树伟业的例程,一看就知道了。
作者: Mr.Zombatar    时间: 2014-4-9 22:56
不是!
作者: zhou1994    时间: 2014-4-9 23:19
感觉见过
作者: stxhb    时间: 2014-4-10 01:16
波特率?
作者: shenxy0011    时间: 2014-4-10 15:58
这是谁家的上位机阿
作者: ☆轩☆少☆    时间: 2014-4-21 07:37
我的也是这样的,你解决了吗?
作者: Kyle_Lee    时间: 2014-4-22 10:46
上位机的波特率设置错了,应该是38400
作者: 鸿19901003    时间: 2014-5-3 11:28
拉普兰德
作者: 飞叶123    时间: 2014-5-5 21:15
是波特率的问题  已解决
作者: 白衣沽酒绮罗生    时间: 2014-5-5 21:28
呵呵
作者: 六步上篮    时间: 2014-6-4 16:10
这个上位机貌似比较强大的样子
作者: hcl857256004    时间: 2014-6-5 09:11
试一试二值化




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