怎样与Arduino和L298N H桥配合使用以实现双极步进电机控制

电子说

1.3w人已加入

描述

步骤1:您将需要什么

该项目将需要一些注意事项,如果您正在阅读此内容,则可能已经拥有:/p》

*某种风味的arduino(我正在使用UNO)

*步进电机(请查阅规格表)

* L298N驱动程序类似于图片中的电路板

*某种电源,至少可提供5V电压,但小于电机的最大电压

*连接线,剥线钳,电线推子等(在该项目上无需焊接)

数字万用表可能会有所帮助

第2步:将L298N连接到Arduino

Arduino

我在上一节中对此进行了描述,但让我们详细介绍一下:

L298N模块IN1-4上有四个引脚,有四个输出连接OUT1-4。模块的接线盒中还有一个+ V和GND。还有一个+ 5V端子(我们将不再使用)。

IN引脚可以连接到Arduino上的任何控制引脚。在我的情况下,我在UNO上有一个LCD屏蔽,因此我使用了模拟引脚(A1到4,这在以后很重要)。然后按如下方式连接它们:

A1-》 IN1

A2-》 IN2

A3-》 IN3

A4-》重要的是,还必须将arduino的接地引脚连接到公共接地端子,否则将无法正常工作!!!!!

然后我将+ V连接到可变电源,然后通过端子将地再次接地。

步骤3:为步进器接线

如果您查看规格表,它应该列出哪些导线是A + A- B +和B-有时,它们不使用此特定语言,但是您所拥有的是一盒带有4根导线的盒子,它们被分成两组。您可以通过测量电阻(或连接)来查看万用表,以查看配对的两个(如果没有说明)。为了使电动机真正旋转,您需要确保A +和B +分别挂接到OUT1和OUT3。如果您对电动机进行接线,而电动机刚刚振动,则其中一对会反转。

接线图基本上是:

A +(黑色)-》 OUT1

A-(绿色)-》 OUT2

B +(蓝色)-》 OUT3

B-(红色)-》 OUT4

第4步:编程:概述和警告

因此,当我第一次开始本奥德赛时,文档非常少,而且更糟糕的是,大多数示例仍然依赖于使用digitalWrite来处理引脚操作,或更糟糕的是,仍然依赖于内置的arduino步进器库,该库实际上实现了同一件事。但是,以这种方式进行操作存在很大的问题。 digitalWrite系统非常慢,而且,如果要执行的是digitalWrite,然后再执行另一个digitalWrite,则它确实是丑陋的,可怕的慢速代码。

如果您还不熟悉它,则应该阅读以下内容:

https://www.arduino.cc/zh/Reference/PortManipulati 。..

这允许我们要做的是,而不是一次写高电平或低电平引脚,只需通过寻址控制这些引脚的寄存器,就将整套引脚高电平或低电平写入即可。

警告:L298N H桥本质上是4个单独的开关,作为一个开关运行,如果与现有的arduino Stepper库一起使用,则有一个主要的坏习惯,或者如果您使用重复的digitalWrite()语句,也就是说,由于设置引脚之前的等待时间,则可能同时将IN1和IN2置于高电平。这会造成死机,并且可能不超过一两分钟,可能会冒烟检查您的桥梁。我花了几天的调试时间才能弄清楚桥为何要拉4安培的电流,并在运行约5秒钟后,散热器变得太热而无法触摸。

第5步:编程示例

因此,这里可能需要或可能不需要一些额外的东西,例如LCDShield的代码或检查主循环执行时间的代码。

如果您使用的是A1-A4,则应编译该代码(Arduino IDE 1.6.5),并使电动机旋转。这段代码大部分是我自己的,从Stepper.h文件中借来了或修改了一点。

注意:

“ StepFast”上的延迟以微秒为单位,因此2000仅为2毫秒,大多数情况下,如果尝试以小于1200的延迟步进电动机它会跳过一些步,尽管对于大多数电动机来说,800步是4整圈,但您可能会发现电动机只能转动四分之一圈。

此代码仅作为示例,目前不反向,它也不会吸收L298的反馈,也不会做我想做的其他很多事情。在查看现有的Stepper.h时,我可能会在接下来的几周中使用此方法来处理步骤,以重新编写它,因为现有的方法可能会损坏L298或任何其他H桥配置。

#include

#include

//Keypad Shield LCD pins

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

long unsigned int lasttime;

long unsigned int timer;

int timeuntil;

float exectime;

int smallcount;

void setup()

{

lcd.begin(16, 2);

lcd.print(“Motor Test”);

delay(2500);

lcd.clear();

}

void StepFast(long int steps,long unsigned wait)

{

DDRC = B00011110; //set arduino ports A1-A4 output remember this works backwards!

// ^-pin 7^-pin 0

int pattern = 0;

int mydelay = 0;

for (int i = 0;i 《 steps; i++)

{

switch (pattern)

{

case 0: // 1010

PORTC = B00001010; //arduino analog port we‘re using pins A1-A4 So we’re only going to change those

break;

case 1: // 0110

PORTC = B00001100;

break;

case 2: //0101

PORTC = B00010100;

break;

case 3: //1001

PORTC = B00010010;

break;

}

pattern++;

if (pattern 》 3) {pattern = 0; }

delayMicroseconds(wait);

}

PORTC = B00000000; //de-energize to motor

}

void loop()

{

lasttime = timer;

timer = millis();

exectime = (timer - lasttime)/1000;

if (timeuntil 《 timer)

{

lcd.clear();

lcd.setCursor(0,0);

lcd.print(“Clockwise ”);

lcd.print(exectime);

lcd.setCursor(0,1);

lcd.print(timer);

lcd.print(“ ”);

lcd.print(lasttime);

timeuntil = timer + 1500;

}

StepFast(800,2000); //steps,delay in microseconds

delay(5000);

}

注意:

此代码在〜300RPM的中等步进速度(步进率为1ms左右)下可以很好地工作,因为您尝试将其提高到1000RPM,除非电压升高,否则它将开始丢失步骤,但是,如果以》 5V在60RPM(5ms)下运行电动机,则L298N会开始变得很热。

步骤6:事后的想法和补充

所以我在原始文章中没有真正提到的一些事情我非常重视在处理过程中。其中的主要问题是:

随着步进速度的增加,电源电压也必须增加

使用引脚ENA和ENB作为PWM输入以将电压保持在低低步速,并随着步速的增加而提高

加速和惯性应对

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

全部0条评论

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

×
20
完善资料,
赚取积分