IAP15W413AS工业自动化控制之【08步进电机启动和停止】

  • SingleYork
  • LV5工程师
  • |      2017-08-12 17:18:13
  • 浏览量 2256
  • 回复:3
本帖最后由 SingleYork 于 2017-9-16 16:40 编辑 bg1.png

上一篇中,笔者给大家介绍了如果使用定时器单片机输出固定频率的脉冲,那么这一讲我们就要来实际应用这个功能来做一些简单的控制了,那么在工业自动化控制中典型的应用应该就要算步进电机的控制了。关于步进电机的详细知识点,详见附件中的“步进电机及驱动器知识讲座”,这里笔者只是摘抄其中部分知识进行讲解。

首先,我们来看一下步进电机的控制原理图:

很明显,通过控制器产生脉冲信号,再经过步进电机驱动器将脉冲信号转化为步进电机的角位移,便可以让步进电机动起来了!接下来我们看下步进电驱动器的接线方法。步进电机驱动器有三种接线方式,即:共阳极接法、共阴极接法和差分方式接法,分别如下图所示:

控制器跟步进电机之前,一般都是通过光耦隔离的。至于这个限流电阻,就要看实际供电情况来选择要不要了!

再来看电机的接线方法,步进电机一般有四线、六线和八线三种,三种电机的接线方式如下图所示:

一般买电机的时候,厂家会给出具体的接线图,本例中,笔者就是用的8线步进电机并行告诉接法。驱动器采用的是共阳极接法。线路连接好了,接下来我们就要来分析代码部分了。

本例中,要实现的功能是这样的:当IN00有信号输入的时候,电机按照固定频率900HZ转动;当IN01有信号输入的时候,电机停止。动作确实很简单,实际程序实现起来也是很简单。首先肯定是让定时器产品900HZ的脉冲了:

#define Fre_Mhz 900    //900Hz



/**************** 定时器配置 ******************/

void        Timer_config(void)

{

        TIM_InitTypeDef                TIM_InitStructure;                                                //结构定义

        TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;                //指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask

        TIM_InitStructure.TIM_Polity    = PolityLow;                                    //指定中断优先级, PolityHigh,PolityLow

        TIM_InitStructure.TIM_Interrupt = ENABLE;                                                //中断是否允许,   ENABLE或DISABLE

        TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;                                        //指定时钟源,     TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext

        TIM_InitStructure.TIM_ClkOut    = DISABLE;                                                //是否输出高速脉冲, ENABLE或DISABLE

        TIM_InitStructure.TIM_Value     = 65536UL - (MAIN_Fosc / Fre_Mhz/2);        //初值

        TIM_InitStructure.TIM_Run       = ENABLE;                                                //是否初始化后启动定时器, ENABLE或DISABLE

        Timer_Inilize(Timer0,&TIM_InitStructure);                                                //初始化Timer0          Timer0,Timer1,Timer2,Timer3,Timer44

}

然后,便是通过一个位变量Motor_EN来当作脉冲的开关,当Motor_EN为1的时候,有脉冲输出;当Motor_EN为0的时候,关闭脉冲输出。

bit Motor_EN;



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

void timer0_int (void) interrupt TIMER0_VECTOR        //1ms

{

    if(Motor_EN)

    {

        OUT00 = !OUT00;         //OUT00输出特定频率波形

    }

    else

    {

        OUT00 = 0;

    }

}

然后,通过IN00和IN01的输入状态来控制Motor_EN的值,即:当IN00有信号输入的时候,让Motor_EN置1;当IN01有信号输入的时候,让Motor_EN清零;

if((!IN00)&&(!Start))

        {

            delay_ms(20);

            if((!IN00)&&(!Start))

            {

                Start    = 1;

                Stop     = 0;

                Motor_EN = 1;

            }

        }

        if((!IN01)&&(!Stop))

        {

            delay_ms(20);

            if((!IN01)&&(!Stop))

            {

                Start    = 0;

                Stop     = 1;

                Motor_EN = 0;

            }

        }

最后,笔者给大家演示一下效果,完整源代码见附件:

源代码:

步进电机及驱动器知识讲座:

  • 0
  • 收藏
  • 举报
  • 分享
我来回复

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

所有回答 数量:1
7943603 2017-08-14
锄头舞的不错
0   回复
举报
发布
SingleYork 回复 2017-08-14
我又不挖墙角:L
0   回复
举报
mihang1987@126. 回复 2017-09-28
学习,初学者挺好懂得
0   回复
举报
nj720417 回复 2018-12-07
很容易看懂,学会
0   回复
举报
x
收藏成功!点击 我的收藏 查看收藏的全部帖子