智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 6477|回复: 18
打印 上一主题 下一主题

简单可跑程序 CCD

  [复制链接]

3

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
威望
231
贡献
84
兑换币
15
注册时间
2012-4-20
在线时间
21 小时
毕业学校
福建工程学院
跳转到指定楼层
1#
发表于 2012-6-6 23:34:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
由于是第一次接触该小车,有些问题请见谅。
场中断:PT1; 行中断:PT2; 舵机:PP0、PP1;电机:PP3;采集:AD0;摄像头转90°;
采集程序大家都很熟悉,不多说了。
舵机控制程序比较简单,采用两个黑线中点的比较来决定舵机转角,转角大小通过试验得到。
由于是第一次接触该小车,有些问题请见谅。



#include <hidef.h>      
#include <MC9S12XS128.h>
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
//------------------------------------------------


  #define column_end  72
  #define row 52      
  unsigned char c_row=0,g_row=0;
  unsigned int row_count=0,column_count=0;  
  unsigned char data[row][column_end];
  unsigned char ucRow,ucColumn,floag=0;
   int x1=0,x2=0,x3=0,i,j,k,m,w,y,z;
   int a1,a2;
  unsigned int get_n[]={ 16,29,41,52,62,71,79,86,92,98,
                         103,108,112,116,120,124,128,132,135,138,
                         141,144,147,150,153,156,159,162,165,168,
                         170,172,174,176,178 ,180,182,184,186,188,
                         190,192,194,196,198,200,202,204,206,208,
                          210,211,212,242,243,245,246,247,248,249,250};


  void PLL_init(void)
  {
    CLKSEL=0X00;      //64MHZ
    PLLCTL_PLLON=1;   
    SYNR =0xc0 | 0x07;                        
    REFDV=0xc0 | 0x01;
    POSTDIV=0x00;      
    _asm(nop);         
    _asm(nop);
    _asm(nop);
    _asm(nop);
    while(!(CRGFLG_LOCK==1));   
    CLKSEL_PLLSEL =1;   }

void ATD_init(void)
{  


   ATD0CTL1=0x00;   
        ATD0CTL2=0X40;  //禁止中断 转换后自动清除寄存器
        ATD0CTL3=0X88;  //没有断点  没有FIFO 通道0开始 单通道 继续转换右对齐 转换序列1
        ATD0CTL4=0X00;    //4周期,64/2,最快
        ATD0CTL5=0X30;  // 连续转换 多通道转换 通道AN0开始
       ATD0DIEN=0x00;   //相应的数字信号输入禁止



}




void AD_init(void)
{   

    TIOS =0x00;//定时器通道0,1 为输入捕捉
    TSCR1=0x80;//定时器使能
    TCTL4=0x18;//通道 1 捕捉下降沿通道 2 捕捉上升沿
    TIE=0x06;  //通道 1,2 中断使能
    TFLG1=0xFF;//清中断标志位

}

void PWM_int(void) {     


                       //舵机初始化
   PWMCTL_CON01=1;    //0和1联合成16位PWM;
    PWMCAE_CAE1=0;    //选择输出模式为左对齐输出模式
    PWMCNT01 = 0;     //计数器清零;
    PWMPOL_PPOL1=1;    //先输出高电平,计数到DTY时,反转电平
    PWMPRCLK = 0X62;    //clockA  4分频,clockA=busclock/4=16MHz;CLK B 16分频:1Mhz
    PWMSCLA = 0x08;    //对clock SA 16分频,pwm clock=clockA/16=1MHz;     
    PWMCLK_PCLK1 = 1;   //选择clock SA做时钟源
    PWMPER01 = 20000;   //周期20ms; 50Hz;
    PWMDTY01 = 1500;   //高电平时间为1.5ms;
    PWME_PWME1 = 1;   


      //驱动电机初使化
PWMPRCLK=0X72;
PWMCLK_PCLK3=1;
PWMSCLB=0X7D;
PWMPOL_PPOL3=0XFF;
PWMCAE_CAE3=0X00;
PWMPER3=0X13;
PWMDTY3=0X04;
PWME_PWME3=1;
}



  void image_int(void)//去噪

{


  for(ucRow=0;ucRow<row;ucRow++)
  {
    for(ucColumn=0;ucColumn<column_end;ucColumn++)
    {

      if(data[ucRow][ucColumn]==0)
      {
        if((data[ucRow][ucColumn-1]==1)&&(data[ucRow][ucColumn+1]==1))

        {
          data[ucRow][ucColumn]=1;

        }
      }

      if(data[ucRow][ucColumn]==1)
      {
        if((data[ucRow][ucColumn-1]==0)&&(data[ucRow][ucColumn+1]==0))

        {
          data[ucRow][ucColumn]=0;

        }
      }
    }

  }

}



void control_int(void)// 舵机控制

{
          //两数组的黑线中点提取

for(i=0;((data[10]==0));i++)
{;}
for(j=i;((data[j][10]==1));j++)
  { ;}
    x1=((j-i)/2+i);

for(k=0;((data[k][40]==0));k++)
{;}
for(m=k;((data[m][40]==1));m++)
  { ;}
    x2=((m-k)/2+k);


if(k>=50)


  for(w=0;((data[51][w]==0) && (data[51][w+1]==0));w++)
    {
      if(w<40)
       a1=40;
      else
       a1=(-40);
    }


         //斜率的计算
    else
   if((x2-x1)>=0)

   {
     if((x2-x1)==0)

      a1=0;
     else
      a1=30/(x2-x1);
     }

    else
     a1=(-(30/(x1-x2)));





//斜率范围选择

if((a1>=10)&&(a1<=30)){a1=10;}
if((a1>=6)&&(a1<10)){a1=6;}
if((a1>=4)&&(a1<6)){a1=4;}
if((a1>=3)&&(a1<4)){a1=3;}
if((a1>0)&&(a1<3)){a1=1;}



if((a1<=(-10))&&(a1>=(-30))){a1=(-10);}
if((a1<=(-6))&&(a1>(-10))){a1=(-6);}
if((a1<=(-4))&&(a1>(-6))){a1=(-4);}
if((a1<=(-3))&&(a1>(-4))){a1=(-3);}
if((a1<0)&&(a1>(-3))){a1=(-1);}

//转角的选择

switch(a1)
{
  case 10:

                PWMDTY01 = 1700;
          break;
  case 6:

                PWMDTY01 = 1700;
          break;  

   case 4:


          PWMDTY01 = 1800;

          break;

    case 3:

           PWMDTY01 =1900;

         break;            

   case 1:

           PWMDTY01 =2000;

         break;         

   case 0:


           PWMDTY01 = 1600;

          break;

case (-10):

           PWMDTY01 = 1600;

          break;  
  case (-6):

           PWMDTY01 = 1500;

          break;         

   case(-4):

           PWMDTY01 =1300;

          break;

   case(-3):

           PWMDTY01 =1200;

          break;      

   case (-1):

           PWMDTY01 = 1100;

          break;

   case(40):

           PWMDTY01 =2000;

          break;      

   case (-40):

           PWMDTY01 = 1000;

          break;        

    default:

          break;
}  




}




void main(void)
{   
   DisableInterrupts;                 



    PLL_init();            
    ATD_init();                     
    AD_init();

    PWM_int();

       EnableInterrupts;

     {
      unsigned  int e,w;
      for(e=1;e<6;e++)
      for(w=0;w<10;w++);

      }


for(;;)
  {
     if(floag==1)
        {
             floag=0;



             TIE_C1I = 1;

        }




  }

}


//---------------------------------  
#pragma CODE_SEG NON_BANKED
void interrupt 10 IC2ISR(void)
{

     TFLG1_C2F=1; {
      unsigned int i,j,num=1;
    for(i=0;i<num;i++)
       for(j=0;j<58;j++);

  if(row_count==get_n[c_row])

  {
    for(column_count=0;column_count<=column_end;column_count++)
   {
       while(!ATD0STAT0_SCF);

     {
      data[c_row][column_count]=ATD0DR0L;   //AD0口为信号输入
      if(data[c_row][column_count]<88) //88二值化阀值
       data[c_row][column_count]=1;
      else
       data[c_row][column_count]=0;

     }

    }



   c_row++;
  }
   row_count++;
  if(c_row>=row)
  {floag=1;

    TIE_C2I = 0;
   }
   else TIE_C2I = 1;

}

}





void interrupt 9 IC1ISR(void)
{              

   column_count=0;
   row_count=0;
   c_row=0;

  TFLG1_C1F=1; //清场中断标志
  TFLG1_C2F=1; //清行中断标志



    image_int();

    control_int();





   TIE_C2I = 1; //开行中断   
   TIE_C1I = 0;  
}







#pragma CODE_SEG DEFAULT  

5

主题

121

帖子

0

精华

高级会员

Rank: 4

积分
937
QQ
威望
573
贡献
218
兑换币
6
注册时间
2010-11-23
在线时间
73 小时
2#
发表于 2012-6-7 00:53:29 | 只看该作者
贡献精神很好。
回复 支持 反对

使用道具 举报

4

主题

74

帖子

0

精华

高级会员

Rank: 4

积分
934
QQ
威望
267
贡献
567
兑换币
5
注册时间
2012-3-1
在线时间
50 小时
3#
发表于 2012-6-7 07:48:44 | 只看该作者
哇,好啊好,谢谢分享!
回复 支持 反对

使用道具 举报

34

主题

500

帖子

1

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3183

推广达人奖章优秀会员奖章活跃会员奖章

威望
2298
贡献
257
兑换币
597
注册时间
2011-10-2
在线时间
314 小时
4#
发表于 2012-6-7 15:16:40 | 只看该作者
好短的程序
回复 支持 反对

使用道具 举报

3

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
威望
231
贡献
84
兑换币
15
注册时间
2012-4-20
在线时间
21 小时
毕业学校
福建工程学院
5#
 楼主| 发表于 2012-6-8 21:45:36 | 只看该作者
是啊 只是实现舵机简单的转向
回复 支持 反对

使用道具 举报

8

主题

53

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3091

优秀会员奖章

威望
2551
贡献
482
兑换币
0
注册时间
2012-5-28
在线时间
29 小时
毕业学校
湖北
6#
发表于 2012-6-9 17:17:51 | 只看该作者
你看嫩不能不进行二值化,去噪直接与阈值比较行不?
二值化到底有什么好处???
回复 支持 反对

使用道具 举报

32

主题

387

帖子

1

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4627
威望
2290
贡献
1181
兑换币
924
注册时间
2012-2-13
在线时间
578 小时
7#
发表于 2012-7-8 01:37:14 | 只看该作者
摄像头转90,是什么意思呀
回复 支持 反对

使用道具 举报

68

主题

1086

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4578

活跃会员奖章优秀会员奖章论坛元老奖章论坛骨干奖章在线王奖章

QQ
威望
2515
贡献
1213
兑换币
1382
注册时间
2012-9-19
在线时间
425 小时
8#
发表于 2012-9-27 13:11:09 | 只看该作者
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
威望
131
贡献
51
兑换币
43
注册时间
2012-10-14
在线时间
22 小时
毕业学校
东华大学
9#
发表于 2012-11-25 14:34:29 | 只看该作者
正找这种简单程序呢 顶
回复 支持 反对

使用道具 举报

11

主题

246

帖子

0

精华

高级会员

Rank: 4

积分
758
威望
396
贡献
142
兑换币
202
注册时间
2012-11-14
在线时间
110 小时
10#
发表于 2012-11-28 17:50:26 | 只看该作者
啥都不说了顶下
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-11 02:36 , Processed in 0.107106 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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