本例在原“步进电机正反转”的基础上进行修改,通过接通IN00,电机开始转动指定的圈数,任何时候接通停止信号IN01,电机马上停止转动。
电机启动、停止的部分笔者就不再赘述了,这里着重讲解如何让电机转动我们想要的圈数。从步进电机驱动器上我们可以看到,可以通过拨码开关来设置步进电机的细分。当然,笔者所使用的驱动器,最小细分也是400个脉冲转一圈:
当然,有些驱动器上可能表示不一样,是直接通过细分数来表示,比如:1、2、4、8、16等,对步进电机有一定了解的小伙伴应该都知道,一般步进电机的步进脚是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信号即停 源代码: