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

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;
    }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
yuanye1234
1楼-- · 2019-07-18 20:37
 精彩回答 2  元偷偷看……
woodmice
2楼-- · 2019-07-19 01:05
没有发现程序跑飞的原因,建议硬件调试看一下跑飞时在哪里运行;
正、反转间隙电机抖动的原因可能是因为每次换向你都关闭后再打开,造成每次EN有效时做一次初始化,初始化需要给电机的一个线圈驱动,以保证转子在确定的位置,如果转子上次停转时不是在初始化驱动的位置,电机就会产生你说的抖动
woodmice
3楼-- · 2019-07-19 05:21
建议你的所有动作都和时钟上升沿同步,不然有可能一个驱动周期只执行了很短的时间,就被EN信号关掉了,这也可能是抖动的原因
Mad-life
4楼-- · 2019-07-19 08:41
woodmice 发表于 2014-11-14 10:59
没有发现程序跑飞的原因,建议硬件调试看一下跑飞时在哪里运行;
正、反转间隙电机抖动的原因可能是因为每 ...

谢谢您的提醒,我加以改进
Mad-life
5楼-- · 2019-07-19 09:00
yuanye1234 发表于 2014-11-14 08:22
我的意见是可能外部的时间中断void T0_time(void) interrupt 1这边有问题,因为运行程序每一步骤都需要时间 ...

谢谢您的提醒,我会改进的

一周热门 更多>