28BYJ48步进电机驱动程序

控制电机驱动器时,
STC8H系列、STC32G系列有8个通道的PWM,可以控制8个电机驱动器。
STC8A8K64D4有4路PCA,可以控制4个电机驱动器。
STC8G系列有3路PCA,可以控制3个电机驱动器。

28BYJ-48步进减速电机有个启动频率的参数,一般是550左右,每秒脉冲数,每秒给出550个步进脉冲可以正常启动,换算成单节拍时间是1.8ms,控制节拍刷新时间大于 1.8ms (启动频率不大于550脉冲/秒)。

/*******************
ULN2003驱动步进电机程序
Target:STC8H8K64U
Crystal:24MHz

接线:

高电平驱动ULN2003代码

0X01       0X03        0X02      0X06       0X04        0X0C     0X08       0X09

IN1 ---- P20
IN2 ---- P21
IN3 ---- P22
IN4 ---- P23
+   ---- +5V
-   ---- GND
*********************/
#include <STC8H.h>

typedef     unsigned char    u8;
typedef     unsigned int    u16;
typedef     unsigned long    u32;

#define MAIN_Fosc     24000000L  //定义主时钟
#define MotorData P2             //步进电机控制接口定义
u8 phasecw[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};   //逆时钟旋转相序表
u8 phaseccw[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};    //正时钟旋转相序表

//延时函数
void Delay_xms(u8 ms)
{
    u16 i;
    do
    {
        i = MAIN_Fosc / 10000;
        while(--i);
    }while(--ms);
}
//==================================
//    IO初始化
//==================================
void Init_GPIO()            
{
    P0M0 = 0x00; P0M1 = 0x00; 
    P1M0 = 0x00; P1M1 = 0x00; 
    P2M0 = 0x00; P2M1 = 0x00; 
    P3M0 = 0x00; P3M1 = 0x00; 
    P4M0 = 0x00; P4M1 = 0x00; 
    P5M0 = 0x00; P5M1 = 0x00; 
    P6M0 = 0x00; P6M1 = 0x00; 
    P7M0 = 0x00; P7M1 = 0x00; 
}
//顺时针转动
void MotorCW(void)
{
 u8 i;
 for(i=0;i<8;i++)
  {
   MotorData=phasecw[i];
   Delay_xms(10);//转速调节
  }
}
//逆时针转动
void MotorCCW(void)
{
 u8 i;
 for(i=0;i<8;i++)
  {
   MotorData=phaseccw[i];
   Delay_xms(10);//转速调节
  }
}
//停止转动
void MotorStop(void)
{
 MotorData=0x00;
}
//主函数
void main(void)
{
    u16 i;
    Init_GPIO();    //IO口设置为准双向口
    Delay_xms(50);//等待系统稳定
    while(1)
    {
        for(i=0;i<500;i++)
        {
            MotorCW();   //顺时针转动
        } 
        MotorStop();  //停止转动
        Delay_xms(500);
        for(i=0;i<500;i++)
        {
            MotorCCW();  //逆时针转动
        } 
        MotorStop();  //停止转动
        Delay_xms(500);  
    }
}

***********************************************************

***********************************************************

***********************************************************

/*******************
ULN2003驱动步进电机程序
Target:STC32G12K128
Crystal:35MHz

接线:
IN1 ---- P20
IN2 ---- P21
IN3 ---- P22
IN4 ---- P23
+   ---- +5V
-   ---- GND
*********************/
#include <STC32G.h>

typedef     unsigned char    u8;
typedef     unsigned int    u16;
typedef     unsigned long    u32;

#define MAIN_Fosc     35000000L  //定义主时钟
#define MotorData P2             //步进电机控制接口定义
u8 phasecw[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};   //逆时钟旋转相序表
u8 phaseccw[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};    //正时钟旋转相序表

//延时函数
void Delay_xms(u16 ms)
{
    u16 i;
    do
    {
        i = MAIN_Fosc / 6000;
        while(--i);
    }while(--ms);
}
//==================================
//    IO初始化
//==================================
void Init_GPIO()            
{
    P0M0 = 0x00; P0M1 = 0x00; 
    P1M0 = 0x00; P1M1 = 0x00; 
    P2M0 = 0x00; P2M1 = 0x00; 
    P3M0 = 0x00; P3M1 = 0x00; 
    P4M0 = 0x00; P4M1 = 0x00; 
    P5M0 = 0x00; P5M1 = 0x00; 
    P6M0 = 0x00; P6M1 = 0x00; 
    P7M0 = 0x00; P7M1 = 0x00; 
}
//顺时针转动
void MotorCW(void)
{
 u8 i;
 for(i=0;i<8;i++)
  {
   MotorData=phasecw[i];
   Delay_xms(10);//转速调节
  }
}
//逆时针转动
void MotorCCW(void)
{
 u8 i;
 for(i=0;i<8;i++)
  {
   MotorData=phaseccw[i];
   Delay_xms(10);//转速调节
  }
}
//停止转动
void MotorStop(void)
{
 MotorData=0x00;
}
//主函数
void main(void)
{
    u16 i;
    
    EAXFR = 1;                //使能XFR访问
    CKCON = 0x00;            //设置外部数据总线速度最快
    WTST = 0x00;            //设置程序读取等待时间为0个时钟,CPU执行程序速度最快
    
    Init_GPIO();    //IO口设置为准双向口
    
    Delay_xms(50);//等待系统稳定
    while(1)
    {
        for(i=0;i<500;i++)
        {
            MotorCW();   //顺时针转动
        } 
        MotorStop();  //停止转动
        Delay_xms(500);
        for(i=0;i<500;i++)
        {
            MotorCCW();  //逆时针转动
        } 
        MotorStop();  //停止转动
        Delay_xms(500);  
    }
}

 /******************************************/
           #include     "stc8h.h"        //包含此头文件后 不需要再包含"reg51.h"头文件      
           #include     "stdio.h"
         #include     "intrins.h"
           #define      high 1
         #define      low 0
           #define      OPEN 1
         #define      OFF 0
           typedef        unsigned char    u8;
         typedef        unsigned int        u16;
         typedef        unsigned long    u32;
           sbit      OUT_A=P1^0;
           sbit      OUT_B=P1^1;
           sbit      OUT_C=P1^2;
           sbit      OUT_D=P1^3;
           u8        Counter;     //步进计数器
                 #define MAIN_Fosc        24000000UL
    //===================================================================//
//              void  delay_ms(u8 ms)
//              {
//               u16 i;
//               do
//                    {
//                i=MAIN_Fosc/1000;
//                while(--i);
//               }
//               while(--ms);
//              }            
     /**步进电机节拍 4相8拍**********开关散转*********************/
              void motor_RUN(u8 Counter)
              {        
               switch(Counter)                    

   //橙黄粉蓝
               {
               case 1:P1=0X01;break;        //橙色开  1  0 0 0 1
               case 2:P1=0X03;break;        //黄色开  2     0 0 1 1
               case 3:P1=0X02;break;        //橙色关  3     0 0 1 0
               case 4:P1=0X06;break;        //粉色开  4     0 1 1 0
               case 5:P1=0X04;break;        //黄色关  5     0 1 0 0
               case 6:P1=0X0C;break;        //蓝色开  6     1 1 0 0
               case 7:P1=0X08;break;        //粉色关  7  1 0 0 0
               case 8:P1=0X09;break;        //橙色开  8  1 0 0 1
                 default:break;
                 }
              }
     /******************** 主函数 **************************/
         void main(void)
         {
           P_SW2 |= 0x80;  //扩展寄存器(XFR)访问使能
           P0M1 = 0x00;   P0M0 = 0x00;   //设置为推挽输出
           P1M1 = 0x00;   P1M0 = 0x03;   //设置为准双向口
           P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
           P3M1 = 0x00;   P3M0 = 0xFF;   //设置为准双向口
           P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
           P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
           P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
           P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
           Counter=0;
           while(1)
            {
                     Counter++;
                     if(Counter>=8)
                     Counter=0;
                     motor_RUN(Counter);
                     }
                        }        

51开源,步进电机驱动 程序, 直接驱动, 或驱动步进电机驱动器 一共8个程序
https://www.stcaimcu.com/thread-2160-1-1.html
(出处: 国芯人工智能技术交流网站)

//////////////////////////////////////////////////////

使用SPWM 1~64细分驱动2相4线步进电机效果视频
https://www.stcaimcu.com/thread-2001-1-1.html
(出处: 国芯人工智能技术交流网站)
 

细分处理方案:
 



两个相电流相位差90度,产生的磁力是矢量,叠加后成为一个合成矢量,为了使合成矢量恒定,细分使用正交分解,这样其合成矢量就会恒定(即 SQRT(sin(A)*SIN(A)+COS(A)*COS(A)) = 1。

比如4细分,就是电流从0到最大分4级,即90度分4份,22.5度一份,则得到:
角度A     sin(A)       sin(A+90)
0               0              1
22.5       0.3827      0.9239
45          0.7071      0.7071
67.5        0.9239      0.3827
90             1               0
按照这个规律,每走一步,根据上面表格的顺序将改变对应的PWM占空比即可。专用驱动器原理是一样的,只不过其PWM控制的是电流,如果我用PWM控制电流,则电路复杂,不合适学习原理,使用SPWM控制电压的方法来控制电流,学习起来简单。

 用变频器做恒张力控制的实质是闭环矢量控制,即加编码器反馈。对收卷来说,收卷的卷经是由小到大变化的,为了保证恒张力,所以要求电机的输出转距要由小到大变化。同时在不同的操作过程,要进行相应的转距补偿。即小卷启动的瞬间、加速、减速、停车,大卷启动时,要在不同卷经时进行不同的转距补偿,这样就能使得收卷的整个过程很稳定,避免小卷时张力过大;大卷启动时松纱的现象。

二.张力控制变频收卷纺织行业的应用及工艺要求

  2.1 传统收卷装置的弊端

  纺织机械如:浆纱机、浆染联合机、并轴机等设备都会有收卷的环节。传统的收卷都是采用机械传动,因为机械的同轴传动对于机械的磨损是非常严重的,据了解,用于同轴传动部分的机械平均寿命基本上是一年左右。而且经常要维护,维护的时候也是非常麻烦的,不仅浪费人力而且维护费用很高,给客户带来了很多的不便。尤其是纺织设备基本上是开机后不允许中途停车的,如发生意外情况需要停车会造成很大的浪费。在这种情况下,张力控制变频收卷开始逐渐取代传统的机械传动系统。

  2.2 张力控制变频收卷的工艺要求

  (1)在收卷的整个过程中都保持恒定的张力。张力的单位为:牛顿或公斤力。

  (2)在启动小卷时,不能因为张力过大而断纱;大卷启动时不能松纱。

  (3)在加速、减速、停止的状态下也不能有上述情况出现。

  (4)要求将张力量化,即能设定张力的大小(力的单位),能显示实际卷径的大小。

  2.3 张力控制变频收卷的优点

  (1)张力设定在人机上设定,人性化的操作,单位为力的单位:牛顿。

  (2)使用先进的控制算法:卷径的递归运算;空心卷径激活时张力的线性递加;张力锥度计算公式的应用;转矩补偿的动态调整等等。

  (3)卷径的实时计算,精确度非常高,保证收卷电机输出转矩的平滑性能好。并且在计算卷径时加入了卷径的递归运算,在操作失误的时候,能自己纠正卷径到正确的数值。

  (4)因为收卷装置的转动惯量是很大的,卷径由小变大时。如果操作人员进行加速、减速、停车、再激活时很容易造成爆纱和松纱的现象,将直接导致纱的质量。而进行了变频收卷的改造后,在上述各种情况下,收卷都很稳定,张力始终恒定。而且经过PLC的处理,在特定的动态过程,加入一些动态的调整措施,使得收卷的性能更好。

  (5)在传统机械传动收卷的基础上改造成变频收卷,非常简便而且造价低,基本上不需对原有机械进行改造。改造周期小,基本上两三天就能安装调试完成。

  (6)克服了机械收卷对机械磨损的弊端,延长机械的使用寿命。方便维护设备。

  

  图1 系统构成及系统框图

三. 变频收卷的控制原理及调试过程

  3.1 卷径的计算原理

  根据V1=V2来计算收卷的卷径。因为V1=ω1*R1, V2=ω2*Rx。因为在相同的时间内由测长辊走过的纱的长度与收卷收到的纱的长度是相等的。即L1/Δt=L2/Δt,Δn1*C1=Δn2*C2/i(Δn1——-单位时间内牵引电机运行的圈数、Δn2——-单位时间内收卷电机运行的圈数、C1——-测长辊的周长、C2——-收卷盘头的周长、i——-减速比) Δn1*π*D1=Δn2*π*D2/i D2=Δn1*D1*i/Δn2,因为Δn2=ΔP2/P2(ΔP2——-收卷编码器产生的脉冲数、P2——-收卷编码器的线数)。Δn1=ΔP1/P1取Δn1=1,即测长辊转一圈,由霍尔开关产生一个信号接到PLC。那么D2=D1*i*P2/ΔP2,这样收卷盘头的卷径就得到了。

  3.2收卷的动态过程分析

  要能保证收卷过程的平稳性,不论是大卷、小卷、加速、减速、激活、停车都能保证张力的恒定。需要进行转矩的补偿。整个系统要激活起来,首先要克服静摩擦力所产生的转矩,简称静摩擦转矩,静摩擦转矩只在激活的瞬间起作用;正常运行时要克服滑动摩擦力产生地滑动摩擦转矩,滑动摩擦转矩在运行当中一直都存在,并且在低速、高速时的大小是不一样的。需要进行不同大小的补偿,系统在加速、减速、停车时为克服系统的惯量,也要进行相应的转矩补偿,补偿的量与运行的速度也有相应的比例关系。在不同车速的时候,补偿的系数是不同的。即加速转矩、减速转矩、停车转矩、激活转矩;克服了这些因素,还要克服负载转矩,通过计算出的实时卷径除以2再乘以设定的张力大小,经过减速比折算到电机轴。这样就分析出了收卷整个过程的转矩补偿的过程。总结:电机的输出转矩=静摩擦转矩(激活瞬间)+滑动摩擦转矩+负载转矩。(1)在加速时还要加上加速转矩;(2)在减速时要减去减速转矩。(3)停车时,因为是通过程控减速至设定的最低速,所以停车转矩的补偿同减速转矩的处理。

  3.3转矩的补偿标准

  (1)静摩擦转矩的补偿

  因为静摩擦转矩只在激活的瞬间存在,在系统激活后就消失了。因此静摩擦转矩的补偿是以计算后电机输出转矩乘以一定的百分比进行补偿。

  (2)滑动摩擦转矩的补偿

  滑动摩擦转矩的补偿在系统运行的整个过程中都是起作用的。补偿的大小以收卷电机的额定转矩为标准。补偿量的大小与运行的速度有关系。所以在程序中处理时,要分段进行补偿。

  (3)加减速、停车转矩的补偿

  补偿硬一收卷电机的额定转矩为标准,相应的补偿系数应该比较稳定,变化不大。

  3.4计算当中的公式计算

  (1)已知空芯卷径Dmin=200mm,Dmax=1200mm;线速度的最大值Vmax=90m/min,张力设定最大值 Fmax=50kg(约等于500牛顿);减速比i=9;速度的限制如下:因为:V=π*D*n/i(对于收卷电机)=》收卷电机在空芯卷径时的转速是最快的。所以:90=3.14*0.2*n/9=》n=1290r/min;

  (2)因为我们知道变频器工作在低频时,交流异步电机的特性不好,激活转矩低而且非线性。因此在收卷的整个过程中要尽量避免收卷电机工作在2HZ 以下。因此:收卷电机有个最低速度的限制。计算如下:对于四极电机而言其同步转速为:n1=60f1/p=》n1=1500r/min。 =& gt;2HZ/5HZ=N/1500=》n=60r/min。当达到最大卷径时,可以求出收卷整个过程中运行的最低速。V=π*D*n/i=& gt;Vmin=3.14*1。2*60/9=25.12m/min。张力控制时,要对速度进行限制,否则会出现飞车。因此要限速。

  (3)张力及转矩的计算如下:如果F*D/2=T/I=》F=2*T*i/D对于22KW的交流电机,其额定转矩的计算如下:T=9550*P/n=》T=140N。m。所以Fmax=2*140*9/0.6=4200N。(其中P为额定功率,n为额定转速)。

四.调试过程:

  先对电机进行自整定,将电机的定子电感、定子电阻等参数读入变频器。

  将编码器的信号接至变频器,并在变频器上设定编码器的线数。然后用面板给定频率和启停控制,观察显示的运行频率是否在设定频率的左右波动。因为运用死循环矢量控制时,运行频率总是在参考编码器反馈的速度,最大限度的接近设定频率,所以运行频率是在设定频率的附近震荡的。

  在程序中设定空芯卷径和最大卷径的数值。通过前面卷径计算的公式算出电机尾部所加编码器产生的最大脉冲量(P2)和最低脉冲量 ( P2 )。通过算出的最大脉冲量对收卷电机的速度进行限定,因为变频器用作张力控制时,如果不对最高速进行限定,一旦出现断纱等情况,收卷电机会飞车的。最低脉冲量是为了避免收卷变频器运行在2Hz以下,因为变频器在2Hz以下运行时,电机的转距特性很差,会出现抖动的现象。

  通过前面分析的整个收卷的动态过程,在不同卷径和不同运行速度的各个阶段,进行一定的转距补偿。补偿的大小,可以以电机额定转距的百分比来设定。

五.真正的张力控制

  5.1 张力控制的定义

  所谓的张力控制,通俗点讲就是要能控制电机输出多大的力,即输出多少牛顿。反应到电机轴即能控制电机的输出转距。

  5.2 真正的张力控制不同于靠前后两个动力点的速度差形成张力的系统,靠速度差来调节张力的实质是对张力的PID控制,要加张力传感器。而且在大小卷启动、停止、加速、减速、停车时的调节不可能做到象真正的张力控制的效果,张力不是很稳定。肯定会影响生产出产品的质量。

六.变频收卷对变频器性能的要求

  (1)变频收卷的实质是要完成张力控制,即能控制电机的运行电流,因为三相异步电机的输出转距T=CmφmIa,与电流成正比。并且当负载有突变时能够保证电机的机械特性曲线比较硬。所以必须用矢量变频器,而且必须要加编码器死循环控制。

  (2)市场上能进行张力控制变频收卷的变频器主要有: 汇川330,正弦,和海普蒙特,安川、艾默生、伦次等。艾默生。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值