打印
[活动专区]

【赛元易码魔盒】SC95F8616驱动步进电机

[复制链接]
1014|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 jinglixixi 于 2020-7-5 10:44 编辑

步进电机是一种常用的执行器件,使用它能进行精准的定位及转速调节等工作。一个简单的步进电机驱动要由步进电机、驱动模块及单片机SC95F8616构成,见下图所示。

步进电机驱动的构成图

为了驱动步进电机,除了硬件方面的准备,还需必要的软件配合。在易码魔盒中,就提供了步进电机的外设驱动。
由于刚开始学习用易码魔盒来设计程序,便打算在这方面练练手。
起初试了许多次,都一直没有成功,就打算用手工编程的方法先让步进电机转起来,然后再与易码魔盒生成的程序进行对比来发现问题。
要手工编写步进电机驱动程序主要分为以下几步:
1)分配引脚的使用
以步进电机的MA~ MD引脚分别与P32~ P35相连接
sbit MA       =   P3^2;
sbit MB       =   P3^3;
sbit MC       =   P3^4;
sbit MD       =   P3^5;

2)定义输出高低电平的宏定义
#define MAL    MA  =   0;
#define MAH    MA  =  1;
#define MBL    MB  =   0;
#define MBH    MB  =   1;
#define MCL    MC  =   0;
#define MCH    MC  =   1;
#define MDL    MD  =   0;
#define MDH    MD  =   1;

3)配置延时函数
配置延时函数的工作在步进电机的驱动中十分重要,它控制着步进电机运转的快慢。
但问题也正出在这里,对于步进电机来说其速度是与驱动脉冲有关,但也并非脉冲越快,电机的转速越快。因为电机电机属于机械器件,
要建立相应的磁场及达到相应的扭矩才能使电机转动。过快的脉冲只会使电机在原地震颤和抖动,并无法旋转。
使电机转动的延时函数为:
void delay_ms(void)
{
           unsigned char b,c;
           for(c=0;c<180;c++)
           {
               for(b=0;b<8;b++);
           }
}

4)控制电机旋转方向
对于4相5线式步进电机来讲,可通过8个节拍的脉冲序列来控制其正反转。
正转的驱动函数为:
void zx()
{
    unsigned char X,Y;  
    for(X=0;X<64;X++)
    {
       for(Y=0;Y<8;Y++)
       {
         MDL;
         MAH; //A可
         delay_ms();
         MBH; //AB
         delay_ms();
         MAL; //B
         delay_ms();
         MCH; //BC
         delay_ms();
         MBL; //C
         delay_ms();
         MDH; //CD
         delay_ms();
         MCL; //D
         delay_ms();
         MAH; //DA
         delay_ms();
       }               
    }  
}

反转的驱动函数为:
void fx()
{
    unsigned char X,Y;
    for(X=0;X<64;X++)    // 控制节拍数
    {
       for(Y=0;Y<8;Y++)   // 控制节拍
       {
         MDH;
         MAH; //A
         delay_ms();
         MAL; //AB
         delay_ms();
         MCH; //B
         delay_ms();
         MDL; //BC
         delay_ms();
         MBH; //C
         delay_ms();
         MCL; //CD
         delay_ms();
         MAH; //D
         delay_ms();
         MBL; //DA
         delay_ms();
       }               
    }
}

5)主程序控制电机运行
void main() 
{
     unsigned char rdata=9,f,c;
     delay_ms();
     //停止电机转动
     MAL;
     MBL;
     MCL;
     MDL;
     delay_ms();
     f=1;//控制转向
     while(1)
     {
             for(c=0;c<rdata;c++)    //控制转动的位置
            {
                                if(f==0)
                                     fx();
                                else
                                {
                                     zx();
                                }
            }
     }
}

相当于手工编程,使用易码魔盒生成代码也大致需要这几个步骤。
1)在芯片配置视图,选取步进电机(4相),然后配置引脚的使用。

2)添加延时函数
void delay_ms(void)
{
           unsigned char b,c;
           for(c=0;c<200;c++)
           {
               for(b=0;b<80;b++);
           }
}

3)在用户程序图形化编辑视图,完成下面图示的程序流程以生成程序代码。
   
程序流程图
生成的程序主程序为:
void main(void)
{      
    SC_Init();
    SCD_StepMotor_Init( 1 , 0 , 0 );
    SCD_StepMotor_Move( 1 , 64*64 );
    SCD_StepMotor_Enable( 1 , 1 );
    while(1)
    {
        SCD_StepMotor_Rotate();
        delay_ms();
    }
}

其中:SC_Init()为整体的初始化函数,SCD_StepMotor_Init( 1 , 0 , 0 )为步进电机的初始化函数,并选取第一组电机工作,旋转方向为逆时针方向;SCD_StepMotor_Enable( 1 , 1 )函数为使能控制函数,以驱动第一组电机工作;SCD_StepMotor_Move( 1 , 64*64 )函数则是控制步进电机按指定步长的方式控制运行。

SCD_StepMotor_Init()的主要内容为:
void SCD_StepMotor_Init(unsigned char MotorSelect,unsigned char Direction,unsigned char ChangeTime) 
{       // ChangeTime 为节拍间隔时间,控制步进电机的转速。
         if(MotorSelect==1)
         {      
                   SCD_StepMotor_PinMode(SCD_StepMotor1_PhaseA_INIT, GPIO_MODE_OUT_PP);
                   SCD_StepMotor_PinMode(SCD_StepMotor1_PhaseB_INIT, GPIO_MODE_OUT_PP);
                   SCD_StepMotor_PinMode(SCD_StepMotor1_PhaseC_INIT, GPIO_MODE_OUT_PP);
                   SCD_StepMotor_PinMode(SCD_StepMotor1_PhaseD_INIT, GPIO_MODE_OUT_PP);
                   SCD_StepMotor_Control(MotorSelect,Direction,ChangeTime);
         }
}

从中可以看出,它完成了引脚的分配和输出功能设置。
SCD_StepMotor_Move()的主要内容为:
void SCD_StepMotor_Move(unsigned char MotorSelect,unsigned int step)
{
          if(MotorSelect == 1)
          {
                 SCD_StepMotor1_MoveCount = step;
                   SCD_StepMotor1_MoveFlag = 1;
                   SCD_StepMotor1_Switch = 1;
          }

它的主要作用是通过标志SCD_StepMotor1_MoveFlag来指定按旋转步数运行。

SCD_StepMotor_Enable()的主要内容为:
void SCD_StepMotor_Enable(unsigned char MotorSelect,unsigned char enable)
{
         if(MotorSelect==1)
         {      
                   if(enable)
                   {
                            SCD_StepMotor1_Switch = 1;
                   }
                   else
                   {
                            SCD_StepMotor1_Switch = 0;
                            SCD_StepMotor1_MoveFlag = 0;
                            SCD_StepMotor1_MoveCount = 0;
                   }
         }

其作用是通过标志SCD_StepMotor1_Switch来启动电机运行。

在所以函数中,以函数SCD_StepMotor_Rotate()最为复杂,其主要内容如下,为便于理解直接加以注释说明。
void SCD_StepMotor_Rotate()
{
          if(SCD_StepMotor1_Switch)         //开启运行
          {
                    SCD_StepMotor1_TimeCount++;
                    if(SCD_StepMotor1_TimeCount>SCD_StepMotor1_X.ChangeTime)  
                    {      
                            // ChangeTime  控制步进电机的转速
                           SCD_StepMotor1_TimeCount = 0;
                            #if((SCD_StepMotor1_PhaseA_INIT!=0xFF00)&&(SCD_StepMotor1_PhaseB_INIT!=0xFF00)&&(SCD_StepMotor1_PhaseC_INIT!=0xFF00)&&(SCD_StepMotor1_PhaseD_INIT!=0xFF00))
                            if(SCD_StepMotor1_X.Direction)  // 正转
                            {
                                      
                                      switch(SCD_StepMotor1_Step)
                                      {
                                              case0:SCD_StepMotor1_PhaseA=1;SCD_StepMotor1_PhaseB=0;SCD_StepMotor1_PhaseC=0;SCD_StepMotor1_PhaseD=0;break;
                                              case1:SCD_StepMotor1_PhaseA=1;SCD_StepMotor1_PhaseB=1;SCD_StepMotor1_PhaseC=0;SCD_StepMotor1_PhaseD=0;break;
                                               case2:SCD_StepMotor1_PhaseA=0;SCD_StepMotor1_PhaseB=1;SCD_StepMotor1_PhaseC=0;SCD_StepMotor1_PhaseD=0;break;
                                               case3:SCD_StepMotor1_PhaseA=0;SCD_StepMotor1_PhaseB=1;SCD_StepMotor1_PhaseC=1;SCD_StepMotor1_PhaseD=0;break;
                                               case4:SCD_StepMotor1_PhaseA=0;SCD_StepMotor1_PhaseB=0;SCD_StepMotor1_PhaseC=1;SCD_StepMotor1_PhaseD=0;break;
                                               case5:SCD_StepMotor1_PhaseA=0;SCD_StepMotor1_PhaseB=0;SCD_StepMotor1_PhaseC=1;SCD_StepMotor1_PhaseD=1;break;
                                               case6:SCD_StepMotor1_PhaseA=0;SCD_StepMotor1_PhaseB=0;SCD_StepMotor1_PhaseC=0;SCD_StepMotor1_PhaseD=1;break;
                                               case7:SCD_StepMotor1_PhaseA=1;SCD_StepMotor1_PhaseB=0;SCD_StepMotor1_PhaseC=0;SCD_StepMotor1_PhaseD=1;break;
                                               default:break;
                                      }
                             }
                             else
                             {      

在该函数中,依次解决了节拍输出、正反转控制、按旋转步数控制运行等。这次,就缺少相应的节拍延时函数配置了,补放到主程序的循环中即可!
经实际验证,效果正常有效,这样又掌握一种用易码魔盒设计步进电机驱动程序的方法,也对易码魔盒中的外设驱动函数有了更深的了解。

RAR文件:

BJDJ.rar

1.57 MB

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

451

主题

2747

帖子

38

粉丝