ULN2003如何驱动5V步进电机

基准/监控/保护电路

65人已加入

描述

  ULN2003是一个非门电路,包含7个单元,各二极管的正极分别接各达林顿管的集电极。用于感性负载时,该脚接负载电源正极,起续流作用(在感性负载中,电路断开后会产生很大的反电动势,为防止损坏达林顿管,接反相的二极管来构成通路,使之转换为电流)。

  步进电机是将电脉冲信号转变为角位移或线位移的开环控制电机,是现代数字程序控制系统中的主要执行元件,应用极为广泛。。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

  ULN2003如何驱动5V步进电机

  第一步进电机需要的驱动电流很大,因此直接使用单片机往往管脚电流不够,加上一般3.3V的单片机也无法驱动5V的步进电机,因此需要电路转换。用的ULN2003芯片驱动步进电机。ULN2003就是起到了电流放大作用,也使得驱动电压变成了5V。除了用ULN2003也可以自己用三极管搭建电路,原理与ULN2003内部结构类似。

  ULN2003

  也就是步进电机要运转时,如何给脉冲,让电机连续运动。ps:如果给错脉冲可能左转几下又转回来。下图就是小编电机的相序。

  ULN2003

  下面是正转翻转的编码 根据技术要求。如图用的单双八拍。

  unsigned char F_Rotation[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09} ; //FAN

  unsigned char B_Rotation[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08} ; //ZHENG

  此函数两个参数,第一个参数是圈数。第二个参数是方向也就是选择正转和翻转

  void motorNCircle(int n,bool position)

  {

  int i=0;

  int j=0;

  int k=0;

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

  {

  for(i=0;i《64*8;i++)

  {

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

  {

  if(TRUE == position)

  SetMotor(F_Rotation[k]);

  else

  SetMotor(B_Rotation[k]);

  Delay(20000);

  }

  }

  }

  }

  下面就是SetMotor函数,根据传的数据不同,控制的4个IO pin输出不同。

  void SetMotor(unsigned char InputData)

  {

  if(InputData & 0x08)

  {

  GPIO_ResetBits(GPIOC, GPIO_Pin_6 );

  }

  else

  {

  GPIO_SetBits(GPIOC, GPIO_Pin_6);

  }

  if(InputData & 0x04)

  {

  GPIO_ResetBits(GPIOC, GPIO_Pin_7 );

  }

  else

  {

  GPIO_SetBits(GPIOC, GPIO_Pin_7);

  }

  if(InputData & 0x02)

  {

  GPIO_ResetBits(GPIOC, GPIO_Pin_8 );

  }

  else

  {

  GPIO_SetBits(GPIOC, GPIO_Pin_8);

  }

  if(InputData & 0x01)

  {

  GPIO_ResetBits(GPIOC, GPIO_Pin_9 );

  }

  else

  {

  GPIO_SetBits(GPIOC, GPIO_Pin_9);

  }

  }

  ULN2003

  以28BYJ-48为例,根据技术资料,步距的角度为5.625-64 而且带有减速齿轮是1:64 因此转64乘64个脉冲才是1圈。 因此一个脉冲转过5.625除64=0.08789度。

  所以有了下面的循环。

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

  {

  for(i=0;i《64*8;i++) //64*8

  {

  for(k=0;k《8;k++) //4相单双8拍

  {

  if(TRUE == position)

  SetMotor(F_Rotation[k]);

  else

  SetMotor(B_Rotation[k]);

  Delay(20000); //注意这个延时自己去调节。

  }

  }

  

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

全部0条评论

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

×
20
完善资料,
赚取积分