小R科技-WIFI机器人网·机器人创意工作室

 找回密码
 立即注册
查看: 10068|回复: 3

【求助】自己做了条机械腿 关于单片机串口问题

[复制链接]
发表于 2017-1-11 10:22:29 | 显示全部楼层 |阅读模式
自己做了条机械腿,目前可以走路 爬楼梯 下蹲
lz决定想加一个控制,通过串口发送命令让机械腿根据指令来运动
机械腿的图片发不上去 老是报错error 502            TAT!!!
用的是小r的51单片机 加51舵机模块 加usb 源代码是小r科技51单片机的源代码,在这个论坛上下的
遇到的问题
我在测试通信时给舵机设计了一个很简单的动作
但是我在发送指令后,舵机一卡一卡的非常慢慢的执行,但是只单独运行这个动作指令就很流畅,只是加了这个串口控制就特别卡,
蠢蠢的lz不知道怎么办,只能求助各位大神,希望点出错误在哪里,
代码如下


回复

使用道具 举报

 楼主| 发表于 2017-1-11 10:37:31 | 显示全部楼层
/*======================================================================
//  °üà¨í·Îļt
======================================================================*/
#include "Config.h"

/*======================================================================

======================================================================*/
unsigned char UART_DAT;
unsigned char temp;

/*======================================================================

======================================================================*/
void main()
{uchar i;int a;

        UART_init();
        Timer0_Init();
       
        temp=UART_DAT;
        while(1)
        {
                Delay_Ms(500);
                 temp=0x35;
     SetServoAngle(1,90);Delay_Ms(7);
                 SetServoAngle(3,85);Delay_Ms(7);
                 SetServoAngle(5,90);Delay_Ms(7);
                 SetServoAngle(7,90);Delay_Ms(7);
               
                if(temp!=UART_DAT)
                {switch(UART_DAT)
                 {
                       
                       
         case 0x31://行走
                               
                temp=0x31;
         for(i=0;i<10;i++)//óòíèÇ°Âõ
                {SetServoAngle(7,90-3*i);
                        SetServoAngle(5,90+5*i);
                        Delay_Ms(10);
                }
     a=1;
                while(1)
                {
                for(i=0;i<10;i++)//óòíèÇ°Âõ×óíèoóÂõ
                { if(a==0)
                        {SetServoAngle(7,90-3*i);
             SetServoAngle(1,90-3*i);
                        Delay_Ms(10);
                        }
                        else
                        {SetServoAngle(1,90-3*i);
                               
                        Delay_Ms(10);
                        }
                }
               
                for(i=0;i<10;i++)//á½íèêÕ£
                {SetServoAngle(7,60+3*i);
                        SetServoAngle(5,120-3*i);
                        SetServoAngle(1,60+3*i);
                        SetServoAngle(3,85-5*i);
                        Delay_Ms(10);
                }
               
               
                for(i=0;i<10;i++)//óò½ÅoóÂõ×óíèÇ°Âõ
                {SetServoAngle(1,90+3*i);
                 SetServoAngle(7,90+3*i);
                        Delay_Ms(10);
                }
               
               
                for(i=0;i<10;i++)//á½íèêÕ£
                {SetServoAngle(1,120-3*i);
                 SetServoAngle(3,55+3*i);
                        SetServoAngle(7,120-3*i);
                        SetServoAngle(5,90+5*i);
                        Delay_Ms(10);  
    }                                                                  
  a=0;       
         if(temp!=UART_DAT)
           {break;}
        }
         break;
         
         
         
       
         
         case 0x32://上楼梯
                                //′®¿úêä3öêy×Ö 2£¬¶Ôó|ASCIIÂëÖμ£o0x32
                temp=0x32;
         for(i=0;i<10;i++)//óòíèÅàÂ¥ìY
                {SetServoAngle(7,90-7*i);
                        SetServoAngle(5,90+7*i);
                        Delay_Ms(10);
                }
                while(1)
                {
                for(i=0;i<10;i++)//óòíèêÕ£×óíèÅàÂ¥ìY
                {SetServoAngle(7,20+7*i);
                        SetServoAngle(5,140-7*i);Delay_Ms(10);
                        SetServoAngle(1,90+7*i);
                        SetServoAngle(3,85-7*i);Delay_Ms(10);
                }
               
               
                for(i=0;i<10;i++)//×óíèêÕ£óòíèÅàÂ¥ìY
                {SetServoAngle(1,160-7*i);
                 SetServoAngle(3,35+7*i);Delay_Ms(10);
                        SetServoAngle(7,90-7*i);
                        SetServoAngle(5,90+7*i);Delay_Ms(10);
                       
                }
                if(temp!=UART_DAT)
           {break;}
        }               
        break;
         

       
                       
         case 0x33://下楼梯
                 temp=0x33;
         for(i=0;i<10;i++)//óòíèÇ°Âõ
                {SetServoAngle(7,90-5*i);
                        SetServoAngle(5,90+6*i);
                        Delay_Ms(10);
                }
     a=1;
                while(1)
                {
                for(i=0;i<10;i++)//óòíèÇ°Âõ×óíèoóÂõ
                { if(a==0)
                        {SetServoAngle(7,90-5*i);
             SetServoAngle(1,90-3*i);
                        Delay_Ms(10);
                        }
                        else
                        {SetServoAngle(1,90-3*i);
                               
                        Delay_Ms(10);
                        }
                }
               
                for(i=0;i<10;i++)//á½íèêÕ£
                {SetServoAngle(7,40+6*i);
                        SetServoAngle(5,170-8*i);
                        SetServoAngle(1,60+3*i);
                        SetServoAngle(3,85-8*i);
                        Delay_Ms(10);
                }
               
               
                for(i=0;i<10;i++)//óò½ÅoóÂõ×óíèÇ°Âõ
                {SetServoAngle(1,90+5*i);
                 SetServoAngle(7,90+3*i);
                        Delay_Ms(10);
                }
               
               
                for(i=0;i<10;i++)//á½íèêÕ£
                {SetServoAngle(1,140-5*i);
                 SetServoAngle(3,5+8*i);
                        SetServoAngle(7,120-3*i);
                        SetServoAngle(5,90+8*i);
                        Delay_Ms(10);  
    }                                                               

  a=0;
        if(temp!=UART_DAT)
           {break;}
                }
               
                        break;
          
       
         case 0x34://坐下
               
         while(1)
        {       
                 for(i=0;i<10;i++)//á½íèêÕ£
                {SetServoAngle(7,90-8*i);
                        SetServoAngle(5,90+8*i);
                        SetServoAngle(1,90+8*i);
                        SetServoAngle(3,85-8*i);
                        Delay_Ms(10);
                }
        if(temp!=UART_DAT)
           {break;}
        }
                       
                        break;
       
       
       
        case 0x35:        //停止
   break;
}
}
        }
}

/*======================================================================
// 中断
======================================================================*/
void UART_Interrupt_Receive(void) interrupt 4
{uchar t;
    UART_DAT=SBUF;

    RI=0;
}


回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-11 10:42:18 | 显示全部楼层
我查了查说可能是串口的中断时间过长使PWM占空比不稳定导致的
因为在运行时候(现在)舵机模块的灯会一闪一闪,有的时候单片机操控的舵机会乱动,然后死机了,不只是一卡一卡
lz小白不知道怎么改,大神请指点一下

回复 支持 反对

使用道具 举报

发表于 2017-1-12 15:17:31 | 显示全部楼层
有为青年赵大彪 发表于 2017-1-11 10:42
我查了查说可能是串口的中断时间过长使PWM占空比不稳定导致的
因为在运行时候(现在)舵机模块的灯会一闪 ...

从你代码看,你并没启用串口来控制,而是通过内部写死的角度控制的,所以说串口中断时间影响PWM有点牵强。建议你直接把串口初始化代码注释掉,看看效果。如果还会的话,你需要考虑一下舵机功率,是不是供电电源无法一次提供那么多舵机联动动作?
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-11-22 19:39 , Processed in 1.106171 second(s), 22 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

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