大二时做的小机器人,和大家分享下(有视频,高手勿喷)
zuiyiyunyan2012/03/12机械与工具 IP:江苏
先上视频吧点击此处查看视频
全身黑色衣服那个是我![s:274]  
整个系统很简单,处理器是51系列的stc12c5a60s2,硬件2路pwm。8位红外对管的循迹板(也有16位的光敏的循迹板),L298驱动电机,机械臂部分不是我负责的,放球那位仁兄负责的。4个按键,2位数码管(595驱动的)等等,其他想到了再说,本人能力有限,发此贴就是为了转正啊!
好不容易找到了以前写的一些代码,贴一点核心的部分,整体的代码有1-2千行,编译成.hex有13k,还好这单片机能装。
循迹是采用PID算法的,只是数学没学好,只用了其中的P,I和D没有用,就是所谓简单的一次多项式模型:y = kx + A,我也怕cpu算不过来啊!代码如下:
8位传感器的:
void xunji()
{
     uchar sensorData,i,sum,temp;
     float bias=0;
     char zkb1,zkb2;
     int zkba,zkbb;
     static unsigned char flagSensor[8] = {0};      用一个数组来记录sensorData中的每一个位
     sensorData=P0;            读传感器                                              
     for(i=0; i<8; i++)
    {
        flagSensor = sensorData & 0x01;  
        sensorData >>= 1;
    }
    sum = 0;
    for(i=0; i<8; i++)
        if(flagSensor) sum ++;      计算线上的传感器个数(假设在黑线上传感器返回1)


    temp = 0;
    for(i=0; i<8; i++)
    {
        if(flagSensor)
            temp += (i+1);    计算在线上的传感器编号之和
    }
    if(temp != 0) bias = temp*1.0 / sum - REF_VALUE;    一次多项式模型:y = kx + A       REF_VALUE为4.5,具体自己算(1+8)/2                  


    zkba=(int)(90*bias)+120;     90和120 都是经验值
    zkbb=(int)(-90*bias)+120;


//     zkba=(int)(180*bias)+255;    90和120太慢了,这个参数跑的快,嘿嘿!
//    zkbb=(int)(-180*bias)+255;
    


    if(zkba>255)    zkb  占空比   代码写的不专业,乱起名字!
     zkba=255;
    if(zkba<-255)
      zkba=-255;
    zkb1=abs(zkba);
    CCAP0H = zkb1;          单片机的寄存器,具体看stc12c5a60s2芯片手册,中文的
    if(zkba>=0)
    {
     LIN1=1;     电机a的方向,这样是电机正转
     LIN2=0;
    }
    else
    {LIN1=0;LIN2=1;}


     if(zkbb>255)      这部分是电机b的,同上
     zkbb=255;
     if(zkbb<-255)
     zkbb=-255;
     zkb2=abs(zkbb);
     CCAP1H = zkb2;
     if(zkbb>=0)
      {RIN1=1;RIN2=0;}
      else
      {RIN1=0;RIN2=1;}
}

下面是16位的,只贴核心部分,都是些简单的代码。
uchar sum_get()
{
  char sensorData,i,sum;
   float bias=0;
   static unsigned char flagSensor[16] = {0};
   SWEN=0;      //读取低8位
   sensorData=P2;
   for(i=0; i<8; i++)
    {
        flagSensor = sensorData & 0x01;
        sensorData >>= 1;
    }
   SWEN=1;      //读取高8位
   sensorData=P2;
   for(i=8; i<16; i++)
    {
        flagSensor = sensorData & 0x01;
        sensorData >>= 1;
    }    
    sum = 0;
    for(i=0; i<16; i++)
        if(flagSensor) sum ++;
        temp = 0;
    for(i=0; i<16; i++)
    {
        if(flagSensor)
            temp += (i+1);
    }
    return sum;
}

就写这么多,时间太长记不得了,语文差,写的有点乱!
+50  科创币    jrcsh    2012/03/12 鼓励新人
+10  科创币    云烟    2012/03/13 欢迎。现在我还停在用软件编.RCU的时代。虽然可以编代码。但是图形化用的更多。呵呵,高二
+10  科创币    爬行动物    2012/03/13
+50  科创币    kknd    2012/03/16 感谢开源
来自:仪器与装备 / 机械与工具
4
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}