STM32103驱动28BYJ48步进电机

  1. 电路接法

    步进电机需要的驱动电流很大,因此直接使用单片机往往管脚电流不够,加上一般3.3V的单片机也无法驱动5V的步进电机,因此需要电路转换。

    常用的ULN2003芯片驱动步进电机。ULN2003就是起到了电流放大作用,也使得驱动电压变成了5V。除了用ULN2003也可以自己用三极管搭建电路,原理与ULN2003内部结构类似。

    STM32103驱动28BYJ48步进电机_第1张图片
    STM32103驱动28BYJ48步进电机_第2张图片
  2. 了解相序

    也就是步进电机要运转时,如何给脉冲,让电机连续运动。

    ps:如果给错脉冲可能左转几下又转回来。下图就是小编电机的相序。

    STM32103驱动28BYJ48步进电机_第3张图片
  3. 软件的实现  使用STM32F103控制电机

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

    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

       {

          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);

      }

    }

    STM32103驱动28BYJ48步进电机_第4张图片
  4. 如何计算

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

    所以有了下面的循环。

      for(j=0;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);       //注意这个延时自己去调节。

              }

          }

你可能感兴趣的:(步进电机)