uln2003驱动步进电机原理,uln2003驱动步进电机程序

基准/监控/保护电路

65人已加入

描述

  步进电动机是一种将电脉冲信号转换成角位移或线位移的机电元件。步进电动机的输入量是脉冲序列,输出量则为相应的增量位移或步进运动。正常运动情况下,它每转一周具有固定的步数;做连续步进运动时,其旋转转速与输入脉冲的频率保持严格的对应关系,不受电压波动和负载变化的影响。由于步进电动机能直接接受数字量的控制,所以特别适宜采用微机进行控制。

  该步进电机为一四相步进电机,采用单极性直流电源供电。只要对步进电机的各相绕组按合适的时序通电,就能使步进电机步进转动。图1是该四相反应式步进电机工作原理示意图。

  步进电机

  开始时,开关SB接通电源,SA、SC、SD断开,B相磁极和转子0、3号齿对齐,同时,转子的1、4号齿就和C、D相绕组磁极产生错齿,2、5号齿就和D、A相绕组磁极产生错齿。当开关SC接通电源,SB、SA、SD断开时,由于C相绕组的磁力线和1、4号齿之间磁力线的作用,使转子转动,1、4号齿和C相绕组的磁极对齐。

  而0、3号齿和A、B相绕组产生错齿,2、5号齿就和A、D相绕组磁极产生错齿。依次类推,A、B、C、D四相绕组轮流供电,则转子会沿着A、B、C、D方向转动。四相步进电机按照通电顺序的不同,可分为单四拍、双四拍、八拍三种工作方式。单四拍与双四拍的步距角相等,但单四拍的转动力矩小。八拍工作方式的步距角是单四拍与双四拍的一半,因此,八拍工作方式既可以保持较高的转动力矩又可以提高控制精度。

  单四拍、双四拍与八拍工作方式的电源通电时序与波形分别如图2.a、b、c所示:

  步进电机

  uln2003驱动步进电机程序

  #include《reg52.h》

  //unsigned char IRCOM[]={0x00,0x00,0x00,0x00,0x10,0x10};

  unsigned char zhuangtai=0;

  unsigned char code F_Rotaion[4]={0x03,0x05,0x0d,0x09};

  void delay(uchar delay){

  uchar i;

  for(delay;delay》0;delay--){

  for(i=123;i》0;i--)

  }

  }

  /*

  void delay1(int ms)

  {

  uchar y;

  while(ms--)

  {

  for(y=0;y《250;y++)

  {

  _nop_();

  _nop_();

  _nop_();

  _nop_();

  }

  }

  }

  */

  void moto(){

  unsigned char i;

  for(i=0;i《4;i++){

  P0=F_Rotaion[i];

  delay(500);

  }

  }

  void nmoto(){

  unsigned char i;

  for(i=3;i》=0;i--){

  P0=F_Rotaion[i];

  delay(500);

  }

  }

  void stopmoto(){

  P0=0x00;

  }

  void yunxing(){

  if(zhuangtai==0){

  stopmoto();

  }

  else if(zhuangtai==1){

  moto();

  }

  else if(zhuangtai==2){

  nmoto();

  }

  }

  void jude(){

  if(P3==0xef){

  zhuangtai=0;

  }

  else if(P3==0xdf){

  zhuangtai=1;

  }

  else if(P3==0xbf){

  zhuangtai=2;

  }

  }

  main(){

  /*

  IE=0x81;

  TCON=0x01;

  */

  P1=0x00;

  P3=0xff;

  jude();

  yunxing();

  }

  /*void IR_IN()interrupt 0

  {

  uchar j,k,N=0;

  EX0=0;

  delay(15);

  if(IRIN==1)

  {

  EX0 =1;

  return;

  }

  while(!IRIN)

  delay(1);

  for(j=0;j《4;j++)

  {

  for(k=0;k《8;k++)

  {

  while(IRIN)

  delay(1);

  while(!IRIN)

  delay(1);

  while(IRIN)

  {

  delay(1);

  N++;

  if(N》=30)

  {

  EX0=1;

  return;

  }

  }

  IRCOM[j]=IRCOM[j]》》1;

  if(N》=8)

  IRCOM[j] = IRCOM[j] | 0x80;}

  N=0;

  }

  if(IRCOM[2]!=~IRCOM[3])

  {

  EX0=1;

  return;

  }

  if(IRCOM[0]!=0x00)

  {

  EX0=1;

  return;

  }

  IRCOM[4]=IRCOM[2]&0x0F;

  IRCOM[5]=IRCOM[2]》》4;

  play();

  beep();

  EX0=1;

  }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分