天天看点

步进电机控制器的设计

本文档作备份用。

摘 要: 设计了一种具有多模式的步进电机控制装置,本装置基于STC的一款单片机STC89C52,软件部分由C51编写,包含启停中断程序、转向中断程序、步进电机调速程序以及键盘信号检测与显示程序等设计 ,硬件部分包含单片机最小系统电路、步进电机及其驱动电路、显示与按键处理电路等设计。

关键词: 多模式;步进电机;单片机;显示参数

1 设计任务与要求

(1)可控制步进电机的启动与停止、正转与反转

(2)10 档速度调节

(3)点动控制

(4)可显示电机运行参数

2 设计方案

2.1总体设计思路

在该控制装置中由单片机输出电机的各相控制脉冲序列,由ULN2003D驱动模块带动步进电机转动,用按键输入的方式控制电机的工作方式,同时数码管会显示电机运行状态。

2.2步进电机的控制方式

采用延时方法进行控制。

延时方法是在每次换向之后调用一个延时子程序,待延时结束后再次执行换向,这样周而复始就可发出一定频率的CP脉冲或换向周期。延时子程序的延时时间与换向程序所用的时间和,就是CP脉冲的周期。

2.3 键盘的工作方式

矩形键盘编程工作在键盘扫描输入方式,其原理为在某一时刻只让一条列线处于低电平,其余列线均处于高电平,则当这一列有键按下时,该键所在的行电平将会由高电平变为低电平,可判定该列相应的行有键按下。读入键盘时具有软件延时去抖动功能,避免误触发。

3 硬件设计

3.1 单片机最小系统电路的设计

控制芯片采用STC89C52,是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。由于单片机内部的资源丰富,性价比高,能够满足该设计的要求,而且减少了硬件电路的设计,提高了工作效率。单片机的外部引脚定义如图所示:

步进电机控制器的设计

复位电路采用手动按键复位方式。当接通电源的瞬间,RST端与VCC同电位,随着电容上的电压逐渐上升,RST端的电压逐渐下降,于是在RST端便形成了一个正脉冲,只要该正脉冲的宽度持续两个机器周期的高电平,就可实现系统自动复位。

时钟电路采用的是内部时钟方式。晶振电路是由两个30PF的电容和一个12M的晶体振荡器组成的,两端分别跨接在单片机的XTAL1和XTAL2的两个端口上。

步进电机控制器的设计

3.2 显示与按键处理电路的设计

为实现交互,该系统设计扩展了独立键盘、4x4按钮矩阵键盘和8段LED数码管,可手动直接操作该控制装置。

系统上电后,通过独立键盘输入步进电机的启停和转向,矩阵键盘控制电机转速,由LED管显示步进电机的转速和转向。键盘的输入和LED管的输出由8279进行控制,减少单片机工作负担。

数码管采用74LS138进行硬件译码,并进行动态显示,其原理为所有LED的段选线共同连接在一起共用一个 8位I/O口,而每个LED的位选分别由一根相应的I/O口线控制。因此必须采用动态扫描显示方式,每一个时刻只选通其中一个LED,同时在段选口送出该位LED的字型码。

矩形键盘编程工作在键盘扫描输入方式,其原理为在某一时刻只让一条列线处于低电平,其余列线均处于高电平,则当这一列有键按下时,该键所在的行电平将会由高电平变为低电平,可判定该列相应的行有键按下。读入键盘时具有软件延时去抖动功能,避免误触发。

3.3 步进电机及其驱动电路的设计

步进电机采用28BYJ-48,该电机为四相五线制,是可将电脉冲转化为角位移的执行机构。当步进驱动模块接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的步进角。通过控制脉冲个数可以控制角位移量,从而达到准确定位的目的;通过控制脉冲频率可以控制电机转动的速度和加速度,从而达到调速的目的。

步进电机控制器的设计

每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,四相步进电机可以在不同的通电方式下运行,常见的通电方式有四拍,双四拍,八拍,本设计采用八拍。

步进电机控制器的设计

步进电机的驱动模块采用ULN2003D,是高耐压、大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成,每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。

步进电机控制器的设计

3.4电气原理图

步进电机控制器的设计

4 软件设计

本实验中设立电机启停标志位和转向标志位,采用两个外部中断来改变标志位,主程序识别到不同的标志位会改变电机的运行模式,同时采用定时器中断键盘扫描的方式读取用户输入的速度值,并在数码管中显示。

4.1 流程图

步进电机控制器的设计

4.2 源程序

#include <reg52.h>
typedef unsigned char uchar;
uchar direction = 0;  //0为正转,1为反转
uchar onoff = 0; //关为0,开为1
uchar index = 0; //通过index指示电机转动,八拍
uchar tmp;
uchar keyval;
sbit P14=P1^4;      
sbit P15=P1^5;     
sbit P16=P1^6;      
sbit P17=P1^7; 
sbit P22=P2^2; 
sbit P23=P2^3; 
sbit P24=P2^4;      
uchar code table[ ]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};    //数字0~9的段码 
unsigned char code beatCode[ ] = { 0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};
unsigned char code beatCode_r[ ] = { 0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};

void delay(unsigned int i)//延时
{
 while(--i);                
}
 void led_delay(void)//数码管动态扫描延时     
 {
   uchar j;
for(j=0;j<200;j++)
;
  }

void display(uchar k)//按键值的数码管显示子程序
{
   P22=1; 
   P23=1;
   P24=1;           
   P0=table[k/10];       
   led_delay();       
   P22=0; 
   P23=1;
   P24=1;    
   P0=table[k%10];      
   led_delay();         
 }
 void delay20ms(void)//软件延时子程序   
{
   uchar i,j;
for(i=0;i<100;i++)
for(j=0;j<60;j++)
           ;
 }

void main(){

    /* LED */
    P0 = 0xff;
    /* 初始化中断 */
    EA = 1;
    EX0 = 1; //要用到的中断是两个外部中断和定时器中断0
    IT0 = 1;
    EX1 = 1;
    IT1 = 1;
	 /* 定时器0 */
	ET0=1;                          
    TMOD=0x01;            
    TH0=(65536-10000)/256;  //65536-500
    TL0=(65536-10000)%256;  
    TR0=1;                
    keyval=0x00; 

while(1){
   display(keyval);

if(onoff==1){

 if(direction==0){
 tmp = P1;			  //读取端口值
 tmp = tmp & 0xF0;	  //高4位不变
 tmp = tmp | beatCode[index]; //低四位变为相应节拍(低四位与电机相连)
 P1 = tmp;		      //输出时序
 
 index++;			  
 index= index & 0x07; //准备输出下一节拍
 delay(keyval*40);	//max speed standard:150 延迟越小(脉冲间隔越小)速度越快
    }
 else if(direction==1){
 P2=0X00; //NEW
 tmp = P1;
 tmp = tmp & 0xF0;
 tmp = tmp | beatCode_r[index];
 P1 = tmp;
 index++;
 index= index & 0x07;
 delay(keyval*40);  	
   }

  } 
 }
} 
void Stop()interrupt 0 //k3  电机启停
{
    onoff++;
    if (onoff > 1)
        onoff = 0;
}
void int1()interrupt 2 //k4  按一下控制电机反转,再按正转
{
    direction++;
    if (direction > 1)
        direction = 0;
}

void time1_interserve(void) interrupt 1 //键盘扫描中断(定时器0) 
  {
     TR0=0;                 
     P1=0xf0;                
 if((P1&0xf0)!=0xf0)      
    delay20ms();           
 if((P1&0xf0)!=0xf0)      
   {
      P1=0xfe;            
      if(P14==0)       
             keyval=1;           
           if(P15==0)            
             keyval=2;           
           if(P16==0)             
             keyval=3;          
           if(P17==0)           
             keyval=4;           
 
 
           P1=0xfd;             
     if(P14==0)       
             keyval=5;         
           if(P15==0)         
             keyval=6;       
           if(P16==0)     
             keyval=7;        
           if(P17==0)    
             keyval=8;  
 
           P1=0xfb;      
   if(P14==0)     
             keyval=9;   
           if(P15==0)      
             keyval=10;    
           if(P16==0)    
             keyval=11;       
           if(P17==0)        
             keyval=12;   
    
           P1=0xf7;     
   if(P14==0)         
             keyval=13;          
           if(P15==0)           
             keyval=14;         
           if(P16==0)         
             keyval=15;        
           if(P17==0)          
             keyval=16;        
       }
     TR0=1;                   
     TH0=(65536-10000)/256;  
     TL0=(65536-10000)%256;   
 }
           

5 调试中出现的问题及解决的办法

5.1 步进电机抖动但不旋转

推测可能的原因:

1.两个脉冲间隔太小导致力矩变小无法旋转:当步进电机转动时,电机各相绕组的电感将形成一个反向电动势;频率越高,反向电动势越大。在它的作用下,电机随频率(或速度)的增大而相电流减小,从而导致力矩下降。

解决办法:增加延时

2.电机的通电时序表有错误:四相步进电机驱动方式有四拍,双四拍,八拍,通电顺序错误会导致电机运行异常

解决办法:检查时序表

3程序问题

解决办法:将单独的控制电机转动的程序提取测试。若正常则扩大程序提取范围,若异常则进行修改

4电机损坏

解决办法:当上述原因不成立时,考虑更换电机

根据上述罗列顺序进行测试,发现为程序以及时序表问题,查阅资料进行表的修改,并重新编写程序后进行测试,电机运转正常。

5.2外部中断无法控制启停

推测可能的原因:

  1. 外部中断失效
  2. 解决办法:编写一段能在数码管中显示数值的中断测试程序,若触发中断后显示数值,该中断触发正常
  3. 程序编写错误

    解决办法:重新检查是否正常初始化和开放中断,外部中断是否改变标志,主程序是否正常识别标志

按照上述罗列顺序进行测试,发现中断运行正常,则归类为程序错误,排查错误时发现将语句onoff==1写为onoff=1,导致程序不能正常运行。

6 参考资料

[1]高玉芹.单片机原理与应用及C51编程技术[M].北京:机械工业出版社,2017.

[2]张元良.单片机开发技术实例[M].北京:机械工业出版社,2010.