锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

步进电机控制器的设计

时间:2022-12-29 21:00:00 电机电容器500vth矩形电连接器

备份使用本文档。

摘 要: 基于多模式的步进电机控制装置设计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位微控制器,8位k字节Flash,512字节RAM, 32 位I/O 口线,门狗定时器,内置4KB EEPROM,MAX810复位电路,316 定时器/计数器,四个外部中断,全双工串行口为7向量4级中断结构(兼容传统515向量2级中断结构)。由于单片机内部的资源丰富,性价比高,能够满足该设计的要求,而且减少了硬件电路的设计,提高了工作效率。由于单片机内部资源丰富,性价比高,足设计要求,降低硬件电路设计,提高工作效率。单片机外引脚定义如图所示:
在这里插入图片描述

复位电路采用手动按路。当电源打开时,RST端与VCC随着电容上电压的逐渐升高,同电位,RST端部电压逐渐下降,因此在RST只要正脉冲的宽度持续两个机器周期的高电平,系统就可以自动复位。
时钟电路采用内部时钟法。晶振电路由两个30PF电容和12M晶体振荡器由单片机两端跨接组成XTAL1和XTAL在两个端口上。

3.2 显示和按钮处理电路的设计

该系统设计扩展了独立键盘和4x4按钮矩阵键盘和8段LED控制装置可手动直接操作数码管。
系统上电后,通过独立键盘输入步进电机的启停输入,矩阵键盘控制电机转速LED管道显示步进电机的速度和转向。键盘的输入和LED8279控制管道输出,减轻单片机工作负担。
数码管采用74LS硬件译码和动态显示的原理是一切LED段选线连接在一起共享 8位I/O口,而每个LED位选分别由一个相应的位选I/O口线控制。因此,必须采用动态扫描显示,每时每刻只选择其中一个LED,同时,将该位置送到段选口LED的字型码。
矩形键盘编程在键盘扫描输入模式中工作,其原理是在某一时刻只让一条线处于低电平,其余线处于高电平,然后当按下键时,键的行电平将从高电平变为低电平,可以确定相应的行有键按下。读取键盘时,具有软件延迟抖动功能,避免误触发。

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

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

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

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

3.4电气原理图

4 软件设计

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

4.1 流程图

4.2 源程序

#include  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.

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章