3986|1

471

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

811学习心得循迹小车 [复制链接]


拿到811也快一个月了,可我的心得还没写完800字呢,这不又来凑字数来了,奋斗了两周,我基于811控制的循迹小车终于基本完成了,先说说我的硬件部分吧,买了一个车底盘,电机驱动和传感器部分自己动手焊的,循迹部分没怎么弄好,但是幸好811有ADC,也能凑合着用。小车轨道是自己画的椭圆状的,能完成循迹,小车模样

循迹部分原理图电机驱动部分

下面是控制部分代码unsigned int abs(signed int xx)//将相互之间采回的电压差值转换成正数
{
  unsigned int yy;
  if(xx<0)
    yy=-xx;
  else
    yy=xx;
  return yy;
}
unsigned int find_min(unsigned int x1,unsigned int x2,unsigned int x3)//寻找哪两个传感器之间的差值最小,
                                                                      //从而判断是否有发生小偏
{
  unsigned int min;
  if(x1<=x2&&x1<=x3)
    min=1;//表示没偏
  if(x2<=x3&&x2<=x1)
    min=2;//向左有小偏
  if(x3<=x2&&x3<=x1)
    min=3;//向右有小偏
  return min;
}
void main()
{

  unsigned int i;
  unsigned long Value[3];//Value[0],Value[1],Value[3]分别对应左中右三个传感器对应电压
  unsigned int daLR,daLM,daMR;//三个传感器相互之间电压差值,以此判断是左偏还是右偏
  SysClockInt(); //时钟配置
  ADC_Init();//ADC  初始化'                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
  PWMInit();//PWM初始化
 // timerInt();
  SysEnable();//设置控制减速电机IO口
  while(1)
  {
    ADC_Sample(Value);//开始采样
   
      for (i = 0;    i < 3;    i++)
        {
         Value = (Value * 3000) / 1024;       //   转换成电压值
        }
      daLR=abs(Value[0]-Value[2]);
      daLM=abs(Value[0]-Value[1]);
      daMR=abs(Value[1]-Value[2]);
     while(Value[0]>Value[1]&&Value[0]>Value[2])//说明小车向左出现大偏,
     {
      
        goleft();  //向左转   
       ADC_Sample(Value);            
       for (i = 0;    i < 3;    i++)
            {
              Value = (Value * 3000) / 1024;       //   转换成电压值
            }
            daLR=abs(Value[0]-Value[2]);
            daLM=abs(Value[0]-Value[1]);
            daMR=abs(Value[1]-Value[2]);
            if(find_min(daLR,daLM,daMR)==1)//如果转到中间的传感器正对黑线,跳出循环前进
              break;
         SysCtlDelay(30 * (TheSysClock / 3000));
     }
          while(Value[2]>Value[1]&&Value[2]>Value[0])//说明小车向右出现大偏,
     {
            goright();
            ADC_Sample(Value);            
            for (i = 0;    i < 3;    i++)
              {
                Value = (Value * 3000) / 1024;       //   转换成电压值
              }
            daLR=abs(Value[0]-Value[2]);
            daLM=abs(Value[0]-Value[1]);
            daMR=abs(Value[1]-Value[2]);
            if(find_min(daLR,daLM,daMR)==1)//如果转到中间的传感器正对黑线,跳出循环前进
              break;
            SysCtlDelay(30 * (TheSysClock / 3000));
       
     }
      switch(find_min(daLR,daLM,daMR))//判断是向左还是右出现小偏,或没偏
      {
        case 1:gostright(); break;
        case 2://向左出现小偏
          {
            while(find_min(daLR,daLM,daMR)!=1)//小车左转,直到中间传感器对准黑线
            {
              ADC_Sample(Value);            
              for (i = 0;    i < 3;    i++)
                {
                  Value = (Value * 3000) / 1024;       //   转换成电压值
                }
                daLR=abs(Value[0]-Value[2]);
                daLM=abs(Value[0]-Value[1]);
                daMR=abs(Value[1]-Value[2]);
                goleft();//左转
                SysCtlDelay(50 * (TheSysClock / 3000));
             }
          }      break;
        case 3:   
         {
            while(find_min(daLR,daLM,daMR)!=1)//小车右转,直到中间传感器对准黑线
            {
              ADC_Sample(Value);            
              for (i = 0;    i < 3;    i++)
                {
                  Value = (Value * 3000) / 1024;       //   转换成电压值
                }
                daLR=abs(Value[0]-Value[2]);
                daLM=abs(Value[0]-Value[1]);
                daMR=abs(Value[1]-Value[2]);
                goright();//右转
                SysCtlDelay(50 * (TheSysClock / 3000));
           }
         }     break;
      }
    SysCtlDelay(100 * (TheSysClock / 3000));
  }
   
}

最新回复

图片用附件上传啊 很期待 不过现在看不了  详情 回复 发表于 2011-5-17 23:33
 
点赞 关注

回复
举报

7219

帖子

192

TA的资源

五彩晶圆(高级)

沙发
 
图片用附件上传啊 很期待 不过现在看不了
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表