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条回答
yun_yue
1楼-- · 2020-02-04 11:39
 精彩回答 2  元偷偷看……
john_patson
2楼-- · 2020-02-04 17:28
时序跑飞了。去看看你的步进电机的时序图吧。只要把时序和步进电机的时序对准时就不会震得那么历害了。。
shenrongze
3楼-- · 2020-02-04 22:20
细分,或者是启动转速太快
ykghj
4楼-- · 2020-02-04 23:48
回复【4楼】shenrongze shenrongze
-----------------------------------------------------------------------

要细分才行。
liuguangda
5楼-- · 2020-02-05 04:59
应该是太快了,10个周期很短;如果还抖可以考虑换个电机或者电路试试。
tianfe2010
6楼-- · 2020-02-05 10:33
 精彩回答 2  元偷偷看……

一周热门 更多>