电机能按我的运动模式跑几遍,时间长了程序就跑飞了?

2019-07-18 15:52发布

时间短可以按照我的运动模式转动,时间一长程序就跑飞了,电机只能往一个方向跑,另外,请教下大神们,正反转的间隙电机会抖动,加多长时间延时比较好呢?

/*******************************************************

基于51单片机和TB6560AHQ驱动器的57步进电机的驱动程序

********************************************************/

#include <REGX52.H>

#define uint unsigned int;
#define uchar unsigned char;

sbit Pulse=P1^0;    //脉冲端
sbit Dir=P3^0;        //方向端 0:正转   1:反转
sbit En=P1^2;        //使能端 0:工作   1:脱机
//sbit F_led=P1^3;    //正转指示灯
//sbit R_led=P1^4;    //反转指示灯

bit State_flag = 0; //0为运动状态,1为停止状态
bit Action_flag = 0; //0为上次动作结束,1为上次动作未结束

uchar Step_number = 0;    //电机运行到第1步
uint clock, num;
//uchar a,b;
//void Delay10ms(void)//误差0us
//{
//   
////    for(c=1;c>0;c--)
//        for(b=19;b>0;b--)
//            for(a=130;a>0;a--);
//}

void Forward(void)      //电机正转
{
//    F_led=1;
    TR0=1;           //开定时器1中断
    TH0=(65536-clock)/256;      //初值大小由clock值决定
    TL0=(65536-clock)%256;      //clock增大,speed减小;clock减小,speed增大
    Dir=0;
    En=0;
}

void Reversal(void)     //电机反转
{
//    R_led=1;
    TR0=1;
    TH0=(65536-clock)/256;      
    TL0=(65536-clock)%256;      
    Dir=1;
    En=0;
}

void Timer_Init(void)
{
    TMOD=0X01;
    EA=1;
    ET0=1;
}

void main()
{
    Timer_Init();
    clock=75;      //改变clock,可以改变电机速度。。调频
    while(1)
    {
        if(Step_number == 0 && State_flag ==0 && Action_flag == 0) //电机第一步动作
        {   
//            Delay5ms();
            Action_flag=1;
            num=96*10;   //正转90度*10
            Forward();
            Step_number++;
        }
        else if(Step_number == 1 && State_flag ==0 && Action_flag == 0)     //电机第二部动作
        {   
//            Delay5ms();
            Action_flag=1;
            num=96*10;   //反转90度*10
            Reversal();
            Step_number++;
        }
        else if(Step_number == 2 && State_flag ==0 && Action_flag == 0)     //电机第三部动作
        {   
//            Delay5ms();
            Action_flag=1;
            num=96*20;   //正转180度*10
            Forward();
            Step_number++;
        }
        else if(Step_number == 3 && State_flag ==0 && Action_flag == 0)     //电机第四部动作
        {   
//            Delay5ms();
            Action_flag=1;
            Step_number=0;
            num=96*20;   //反转180度*10
            Reversal();
        }   
    }
}

void T0_time(void) interrupt 1
{
    TH0=(65536-clock)/256;
    TL0=(65536-clock)%256;
    Pulse=~Pulse;
    num--;
    if(num == 0)       //脉冲计数到了,关闭T0,电机脱机,运动标志位置0
    {
        TR0=0;
        En=0;
        Action_flag=0;
    }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。