本帖最后由 KA_IX 于 2021-10-27 13:57 编辑

1. 基于proteus的51单片机开发实例23-步进电机的驱动控制

1.1. 实验目的
ac2c4144354e443d99743874df3049ec?from=pc.jpg
图1 步进电机电路图

在本实例中,我们来了解步进电机的使用方法、电路设计、编程控制。在上一实例中,直流电机转动的时候,不能够精确地控制其转动的角度大小,而步进电机可以准确地控制它每运转一步转动多少角度。

1.2. 设计思路


本实例的设计思路为:使用按键控制步进电机的转动,当正转或者反转按键按下后,步进电机按照设定的步数运转。

1.3. 基础知识

步进电机基础知识
步进电机把电机的一个完整的转动周期分割成许多份,每一份称为一步,因此步进电机的转动是一步一步转动的,也因为这个原因才被称为步进电机。
步进电机在脉冲信号的驱动下,每次能转动一步或者多步。因为每一步的角度是固定的,同时步进电机的转动不需要任何的反馈,所以步进电机在脉冲信号的控制下能够实现非常精确的定位。下图所示是步进电机的实物图。
13de8cb6-cbf2-4d1f-8414-0dd7a7eaddbc?from=pc.jpg
图2 步进电机实物图

步进电机不像直流电机那样在正负极上加电就能转动。在步进电机内部,中间有一个铁片(转子),周围是4个电磁铁(定子)。如下图所示。定子由控制电路(如单片机或步进电机专用芯片)进行驱动控制。首先给1#电磁铁通电,于是转子被吸引对齐到最近的定子,这样中心铁片转过一个很小的角度,步进电机前进一步。
31503a4ed4844122b58af69284419c2d?from=pc.jpg
步进电机步进图示1

当转子与1号磁铁定子对齐后,转子与2号定子偏离了一个很小的角度,于是给2号定子通电,同时给1号定子断电。如下图所示。这丫转子被吸引到2号定子,转子又转动了一个很小的角度,步进电机又前进一步。
55198f1f09b44871ae2b7507179bb37f?from=pc.jpg
步进电机步进图示2

这样持续下去,1,2,3,4号定子依次接通电源,转子就不断的以固定角度转动,形成步进。当步进走过360°后,步进电机转过一圈。由此可以看出,步进电机的转子位置和速度与加在定子上的脉冲数和频率成对应关系,转动方向由各定子的通电顺序决定。
步进电机分为单极步进和双极步进两种。
单极步进电机一般有5个或者6个引脚。双极步进电机更为精确,一般有4个引脚。

1.4. 电路设计

在上一实例中我们已经说过,单片机驱动电机需要专门的驱动电路。原因是单片机的端口的驱动能力有限,必须借助特定的驱动电路才能有足够的驱动能力。
本实例的电路图如图1所示。单片机的P3.0,P3.1,P3.2分别接三个按键,作为电机转动的控制引脚。单片机的P2.0~P2.6脚通过达林顿管ULN2003A来控制步进电机的步进动作。

1.5. 程序设计

本实例的程序代码如下。
#include <AT89X52.h>
  • sbit key_Right = P3^0;
  • sbit key_Left = P3^1;
  • sbit key_Stop = P3^2;
  • void delay(unsigned char x);
  • //
  • void SETP_MOTOR_F(unsigned char n);
  • //
  • void SETP_MOTOR_R(unsigned char n);
  • int main(void)
  • {
  •   unsigned char phase = 0x00;
  •   P2 = 0x03;
  •   while(1)
  •   {
  •         if(key_Right==0)  //
  •         {
  •           while(1)
  •           {
  •                 SETP_MOTOR_F(phase=++phase&0x03);
  •                 if(!(key_Left!=0&&key_Stop!=0))
  •                 break;
  •           }
  •         }
  •         if(key_Left==0)  //
  •         {
  •           while(1)
  •           {
  •                 SETP_MOTOR_R(phase=++phase&0x03);
  •                 if(!(key_Right!=0&&key_Stop!=0))
  •                 break;
  •           }
  •         }
  •         if(key_Stop==0)  //
  •         {
  •           while(1)
  •           {
  •                 P2 = 0x03;
  •                 if(!(key_Right!=0&&key_Left!=0))
  •                 break;
  •           }
  •         }               
  •   }
  • }
  • void delay(unsigned char x)
  • {
  •         unsigned int j;
  •         while(x-->0)
  •         {
  •                 for(j=0;j<600;j++);
  •         }
  • }
  • void SETP_MOTOR_F(unsigned char n)            /
  • {
  •          unsigned char code table[]={0x03,0x09,0x0c,0x06}; //
  •         P2 = table[n];
  •         delay(80);
  • }
  • void SETP_MOTOR_R(unsigned char n)            //
  • {
  •      unsigned char code table[]={0x03,0x06,0x0C,0x09};//Õýת
  •         P2=table[n];
  •         delay(80);
  • }<code></code>
  • 复制代码
    1.6. 实例仿真

    编写程序代码,编译生成HEX文件,将HEX文件装载到proteus电路的单片机中,开始仿真,通过按下不同的按键观察电机的运行状态。