IAP15W413AS工业自动化控制之【11步进电机转动指定圈数】

  • SingleYork
  • LV5工程师
  • |      2017-08-17 15:56:46
  • 浏览量 2009
  • 回复:2
本帖最后由 SingleYork 于 2017-9-16 16:43 编辑 bg1.png

本例在原“步进电机正反转”的基础上进行修改,通过接通IN00,电机开始转动指定的圈数,任何时候接通停止信号IN01,电机马上停止转动。

电机启动、停止的部分笔者就不再赘述了,这里着重讲解如何让电机转动我们想要的圈数。从步进电机驱动器上我们可以看到,可以通过拨码开关来设置步进电机的细分。当然,笔者所使用的驱动器,最小细分也是400个脉冲转一圈:

当然,有些驱动器上可能表示不一样,是直接通过细分数来表示,比如:124816等,对步进电机有一定了解的小伙伴应该都知道,一般步进电机的步进脚是1.8度,也就是一个脉冲,步进电机转动的角度是1.8度,那么,转一圈360度需要多少个脉冲?很容易算出来了,360/1.8=200个脉冲。也就相当于细分为1,虽然表示方法不一样,但是原理都是一样的。

从步进电机跟控制板的接线图中我们可以看到,脉冲信号是低电平有效:

然而,从控制板的原理图中我们可知,要使得输出产生一个低电平,那么单片机的输出口需要输出一个高电平,即:对单片机来说,是高电平为有效输出电平。

那么,我们是不是可以通过捕捉高电平的个数,来获得有效脉冲的个数?没错,笔者就是这个干的!接下来我们详细看一下程序部分吧。

首先,定义好我们需要让电机转动的圈数:

#define TurnNum 2   //电机需要转动的圈数

再定义一个变量用来存放当前脉冲数:

u32 PlusNum;  //脉冲计数

接下来,我们就可以在定时器中断函数中直接实现我们想要的功能了。程序部分很简单,而且注释的也比较详细,相信读者一看就能明白了,笔者就不再赘述了:

/********************* Timer0中断函数************************/

void timer0_int (void) interrupt TIMER0_VECTOR        //1ms

{

    if(Motor_EN)

    {

      OUT00 = !OUT00;             //OUT00输出脉冲信号

      

      if(OUT00)                   //高电平时,脉冲计数加1

      {

        if(++PlusNum>=400*TurnNum)//驱动器设置为400个脉冲一圈,电机转TurnNum圈,停止

        {

          PlusNum = 0;

          Motor_EN= 0;

          Start   = 0;            //清除启动标志位,以便下次能启动

        } 

      }

    }

    else

    {

      OUT00   = 0;

      PlusNum = 0;

    }

}

本例中笔者是让电机转动了两圈,那么,如果让电机转动更多圈数怎么办?很简单,只需要修改TurnNum 后面的值即可。这里需要特别注意的是PlusNum的数据类型,一定要使得if(++PlusNum>=400*TurnNum)这个条件成立。

最后给大家分享一下运行效果吧:

运行效果一:电机转2圈 运行效果二:电机转10圈 运行效果三:电机转10圈,任意时刻接通IN01信号即停 源代码:
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:2
mihang1987@126. 2017-09-28
学习,初学者挺好懂得
0   回复
举报
发布
mihang1987@126. 2017-09-26
学习学习学习
0   回复
举报
发布
x
收藏成功!点击 我的收藏 查看收藏的全部帖子