智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 7998|回复: 12
打印 上一主题 下一主题

线性ccd采集到图像是这个样子 不知道怎样处理了?

  [复制链接]

1

主题

12

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
威望
192
贡献
131
兑换币
125
注册时间
2013-3-5
在线时间
38 小时
毕业学校
巢湖学院
跳转到指定楼层
1#
发表于 2014-4-9 22:33:05 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
新手 :刚刚才把采集到的图像搞出来 请知道接下来怎样处理的或者有什么需要修改的指导一下
其实图像是这个样子不知道对不对?
非常感谢!


*                     
* 引脚连接:
*                      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();
}


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


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

29

主题

117

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1697
威望
885
贡献
538
兑换币
546
注册时间
2014-5-10
在线时间
137 小时
毕业学校
。。
13#
发表于 2014-6-5 09:11:30 | 只看该作者
试一试二值化
回复 支持 反对

使用道具 举报

28

主题

2228

帖子

1

精华

杰出人士

Rank: 12Rank: 12Rank: 12

积分
15817

论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章资源大师奖章

QQ
威望
7430
贡献
4213
兑换币
5193
注册时间
2013-12-9
在线时间
2087 小时
12#
发表于 2014-6-4 16:10:56 | 只看该作者
这个上位机貌似比较强大的样子
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

注册会员

Rank: 2

积分
67
威望
45
贡献
16
兑换币
17
注册时间
2014-4-1
在线时间
4 小时
毕业学校
扬州大学
11#
发表于 2014-5-5 21:28:23 | 只看该作者
呵呵
回复 支持 反对

使用道具 举报

1

主题

12

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
威望
192
贡献
131
兑换币
125
注册时间
2013-3-5
在线时间
38 小时
毕业学校
巢湖学院
10#
 楼主| 发表于 2014-5-5 21:15:29 | 只看该作者
是波特率的问题  已解决
回复 支持 反对

使用道具 举报

3

主题

50

帖子

0

精华

高级会员

Rank: 4

积分
552
威望
266
贡献
184
兑换币
176
注册时间
2014-1-11
在线时间
51 小时
9#
发表于 2014-5-3 11:28:32 | 只看该作者
拉普兰德
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
威望
118
贡献
61
兑换币
66
注册时间
2013-10-30
在线时间
23 小时
毕业学校
北京理工大学珠海学院
8#
发表于 2014-4-22 10:46:33 | 只看该作者
上位机的波特率设置错了,应该是38400
回复 支持 反对

使用道具 举报

19

主题

126

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2159
威望
1081
贡献
600
兑换币
653
注册时间
2012-11-25
在线时间
239 小时
7#
发表于 2014-4-21 07:37:30 | 只看该作者
我的也是这样的,你解决了吗?
回复 支持 反对

使用道具 举报

2

主题

36

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
7501
威望
3029
贡献
1978
兑换币
2006
注册时间
2013-8-24
在线时间
1247 小时
6#
发表于 2014-4-10 15:58:47 | 只看该作者
这是谁家的上位机阿
回复 支持 反对

使用道具 举报

4

主题

215

帖子

0

精华

高级会员

Rank: 4

积分
950
威望
490
贡献
234
兑换币
314
注册时间
2013-11-5
在线时间
113 小时
毕业学校
棣棠中心校
5#
发表于 2014-4-10 01:16:20 | 只看该作者
波特率?
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-7 05:28 , Processed in 0.058397 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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