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

2020-02-04 09:33发布

#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;
        }
   
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
kiracl
1楼-- · 2020-02-05 12:37
不一定要细分。不过震动大说明你的电机时序是不对的。看你 “TL0=0x0C; //设定时每隔0.5ms中断一次”  基本判断是启动速度太快了所致。  建议你修改一下定时值低速跑一个看看效果。行的话,问题就找到了。之后的策略就是低速起步后再慢慢的变速至你希望的速度。

一周热门 更多>