【树莓派入门】(三)| 树莓派如何控制步进电机

hushuo
发布于 2020-12-30 10:57
浏览
0收藏

树莓派这个东西,一定要亲自动手玩一玩,多实践。所以,我打算录几期视频带大家动手做一做东西。估计要等到下半年,因为目前宿舍地方有限。
上一次我们说到了如何控制超声波传感器,这一次我们来介绍一下如何控制步进电机。
这里,我以arduino为例驱动步进电机,同样我会给出树莓派的驱动代码。
28BYJ48步进电机的详细参数网上百度一下就知道了。

【树莓派入门】(三)| 树莓派如何控制步进电机-鸿蒙开发者社区这里有三种减速比:分别是1:16,1:64,1:32,我感觉我手中拿着的是1:32的,因为网上大家都说是4096步转一圈,而我实验发现是2048步转一圈。

一、首先弄明白什么是:四拍,双四拍,八拍。
四拍是说步进电机A,B,C,D四组线圈的通电时序,四拍的驱动正转通电顺序为A-B-C-D-A-B-C-D-A-……循环往复,-A-B-C-D-四拍为一个循环周期。双四拍的通电时序为AB-BC-CD-DA-AB-BC-CD-DA-...…,-AB-BC-CD-DA-四拍为一个循环周期。相对应的还有八拍的通电时序,A-AB-B-BC-C-CD-D-DA-A。

【树莓派入门】(三)| 树莓派如何控制步进电机-鸿蒙开发者社区

具体的arduino代码如下:

int flag=1;

void setup() {
  // put your setup code here, to run once:
  for(int i=2;i<=5;i++)
    {
      pinMode(i,OUTPUT);
    }
}
void loop() {
  // put your main code here, to run repeatedly:
  if(flag==1)
  {
     for(int i=0;i<512;i++)
    {
      Coil_A1();
      delay(5);
      Coil_B1();
      delay(5);
      Coil_C1();
      delay(5);
      Coil_D1();
      delay(5);
    }
    flag=0;
  }
}

void Coil_A1()
{
 digitalWrite(2,HIGH);
 digitalWrite(3,LOW);
 digitalWrite(4,LOW);
 digitalWrite(5,LOW);
}
void Coil_B1()
{
 digitalWrite(2,LOW);
 digitalWrite(3,HIGH);
 digitalWrite(4,LOW);
 digitalWrite(5,LOW);
}
void Coil_C1()
{
 digitalWrite(2,LOW);
 digitalWrite(3,LOW);
 digitalWrite(4,HIGH);
 digitalWrite(5,LOW);
}
void Coil_D1()
{
 digitalWrite(2,LOW);
 digitalWrite(3,LOW);
 digitalWrite(4,LOW);
 digitalWrite(5,HIGH);
}


下面我来解释一下:
电机是64步/圈,每步360° / 64 = 5.625°,出来还有1 / 32减速箱,所以是64 * 32 = 2048步/圈。
每一次for循环都是步进电机内部转了一圈,也就是4步(注意是内部,看看上一篇拆机就懂啦),外面实际我们看到的只动了5.625°*4=22.5°,然而这个时候,用时是5*4=20ms,所以根据这个我们可以推算出步进电机转一圈需要10.24秒(这里的一圈指的是我们所能观察到的),具体的算法是:每步耗时5ms,一共2048步,也就是耗时10240ms,所以也就是10.24s(秒)。
不知道大家用的步进电机是不是1:32的,如果你是1:64的那就把上面i<512改为i<1024,这样也是转一圈,具体怎么算我想你应该会了吧。

如果还是不会,那就请多思考和多实验几次。

树莓派的代码如下:

#include <stdio.h>
#include <wiringPi.h>

void init();
void Coil_A1();
void Coil_B1();
void Coil_C1();
void Coil_D1();
void Coil_OFF();

int main()
{
    init();
    for(int i=0;i<512;i++)
    {
        Coil_A1();
        delay(5);
        Coil_B1();
        delay(1500);
        Coil_C1();
        delay(5);
        Coil_D1();
        delay(5);
    }
    return 0;
}




void init()
{
    
    wiringPiSetup();
    for(int i=22;i<=25;i++)
    {
        pinMode(i,OUTPUT);
    }
}

void Coil_A1()
{
    digitalWrite(22,HIGH);
    digitalWrite(23,LOW);
    digitalWrite(24,LOW);
    digitalWrite(25,LOW);
}
void Coil_B1()
{
    digitalWrite(22,LOW);
    digitalWrite(23,HIGH);
    digitalWrite(24,LOW);
    digitalWrite(25,LOW);
}
void Coil_C1()
{
    digitalWrite(22,LOW);
    digitalWrite(23,LOW);
    digitalWrite(24,HIGH);
    digitalWrite(25,LOW);
}
void Coil_D1()
{
    digitalWrite(22,LOW);
    digitalWrite(23,LOW);
    digitalWrite(24,LOW);
    digitalWrite(25,HIGH);
}
void Coil_OFF()
{
    digitalWrite(22,LOW);
    digitalWrite(23,LOW);
    digitalWrite(24,LOW);
    digitalWrite(25,LOW);
}

收藏
回复
举报
1条回复
按时间正序
/
按时间倒序
Hallym6
Hallym6

这算什么鬼呀,没法落地应用

回复
2021-2-8 11:36:13
回复
    相关推荐