lllyanllll 发表于 2011-11-17 20:27:06

51控制步进电机 ,震动太厉害,怎么回事啊,求高手帮我优化一下程序!!!!

#include <AT89X51.h>

static unsigned int count;
static int step_index;

void delay(unsigned int endcount);
void gorun(bit turn, unsigned int speedlevel);

void main(void)
{
        count = 0;
        step_index = 0;
        P1_0 = 0;
        P1_1 = 0;
        P1_2 = 0;
        P1_3 = 0;


        EA = 1;             //允许CPU中断
        TMOD = 0x11; //设定时器0和1为16位模式1
        ET0 = 1;            //定时器0中断允许
       
        TH0 = 0xFE;
        TL0 = 0x0C; //设定时每隔0.5ms中断一次
        TR0 = 1;         //开始计数

        do        {
                  gorun(1,10);
                }while(1);

}

//定时器0中断处理           
void timeint(void) interrupt 1
{
        TH0=0xFE;
        TL0=0x0C; //设定时每隔0.5ms中断一次
        count++;
}

void delay(unsigned int endcount)
{
        count=0;
        do{}while(count<endcount);
}

void gorun(bit turn,unsigned int speedlevel)
{
        switch(step_index)
        {
                case 0:
                  P1_0 = 1;
                  P1_1 = 0;
                  P1_2 = 0;
                  P1_3 = 0;
                  break;
                case 1:
                  P1_0 = 1;
                  P1_1 = 0;
                  P1_2 = 1;
                  P1_3 = 0;
                  break;
                case 2:
                  P1_0 = 0;
                  P1_1 = 0;
                  P1_2 = 1;
                  P1_3 = 0;
                  break;
                case 3:
                  P1_0 = 0;
                  P1_1 = 1;
                  P1_2 = 1;
                  P1_3 = 0;
                  break;
                case 4:
                  P1_0 = 0;
                  P1_1 = 1;
                  P1_2 = 0;
                  P1_3 = 0;
                  break;
                case 5:
                  P1_0 = 0;
                  P1_1 = 1;
                  P1_2 = 0;
                  P1_3 = 1;
                  break;
                case 6:
                  P1_0 = 0;
                  P1_1 = 0;
                  P1_2 = 0;
                  P1_3 = 1;
                  break;
                case 7:
                  P1_0 = 1;
                  P1_1 = 0;
                  P1_2 = 0;
                  P1_3 = 1;
        }
       
        delay(speedlevel);
       
        if (turn==0)
        {
          step_index++;
          if (step_index>7)
              step_index=0;
        }
        else
        {
          step_index--;
          if (step_index<0)
              step_index=7;
        }
   
}

yun_yue 发表于 2011-12-28 23:09:19

一般只有细分能解决这个问题吧。

john_patson 发表于 2011-12-29 01:16:53

时序跑飞了。去看看你的步进电机的时序图吧。只要把时序和步进电机的时序对准时就不会震得那么历害了。。

shenrongze 发表于 2011-12-29 03:36:27

细分,或者是启动转速太快

ykghj 发表于 2011-12-29 11:43:08

回复【4楼】shenrongze shenrongze
-----------------------------------------------------------------------

要细分才行。

liuguangda 发表于 2011-12-29 22:24:20

应该是太快了,10个周期很短;如果还抖可以考虑换个电机或者电路试试。

tianfe2010 发表于 2012-2-10 21:00:36

没有细分是这样的了

kiracl 发表于 2012-2-26 17:27:44

不一定要细分。不过震动大说明你的电机时序是不对的。看你 “TL0=0x0C; //设定时每隔0.5ms中断一次”基本判断是启动速度太快了所致。建议你修改一下定时值低速跑一个看看效果。行的话,问题就找到了。之后的策略就是低速起步后再慢慢的变速至你希望的速度。
页: [1]
查看完整版本: 51控制步进电机 ,震动太厉害,怎么回事啊,求高手帮我优化一下程序!!!!