arduino控制电机正反转程序

arduino控制电机正反转程序,第1张

arduino控制电机,这可没有固定的程序。因为直接控制电机的是“电机驱动器”,arduino并不能适宜直接与电机连接在一起。

所以,控制正反转以及转速等的程序,取决于你购买的电机驱动器。仔细阅读该驱动器的说明书,将arduino的引脚与电机驱动器的控制引脚连接,然后控制相应引脚的高低电平和pwm,以实现电机的正反转和转速调节。

1、首先,请按照下图连接双路H桥驱动器和电机,4个按钮(右前进,右后退,左前进,左后退),以及核心板。

需要说明的是,双路H桥驱动器Vin和GND管脚,是接入驱动电机的电源的管脚,建议单独用一组负责动力的电池或电源,不要与单片机的供电混接,以防止大功率消耗瞬时拉低电压而死机。

完成好接线后,请在Arduino IDE中输入如下代码:(已提供源码下载)

int R_Q = 8//定义右前按钮管脚

int R_H = 4//定义右后按钮管脚

int L_Q = 7 //定义左前按钮管脚

int L_H = 2 //定义左后按钮管脚

int MOTO_A_a = 3  //定义右电机控制端a

int MOTO_A_b = 5  //定义右电机控制端b

int MOTO_B_a = 6  //定义左电机控制端a

int MOTO_B_b = 9  //定义左电机控制端b

//需要注意的是,双路H桥驱动器支持PWM方式输入,故In1-In4接3,5,6,9端口,便于以后改造为PWM信号输入

void setup()

{

pinMode(R_Q,INPUT_PULLUP)  //定义右前按钮为输入且上拉

pinMode(R_H,INPUT_PULLUP)  //定义右后按钮为输入且上拉

pinMode(L_Q,INPUT_PULLUP)  //定义左前按钮为输入且上拉

pinMode(L_H,INPUT_PULLUP)  //定义左后按钮为输入且上拉

pinMode(MOTO_A_a,OUTPUT)  //定义输出

pinMode(MOTO_A_b,OUTPUT)  //定义输出

pinMode(MOTO_B_a,OUTPUT)  //定义输出

pinMode(MOTO_B_b,OUTPUT)  //定义输出

}

void loop()

{

  //如果不按下右前和右后,则停转

if(digitalRead(R_Q)==1 &&digitalRead(R_H)==1){STOP_Moto_A()}

  //如果同时按下右前和右后,逻辑错误,则停转

if(digitalRead(R_Q)==0 &&digitalRead(R_H)==0){STOP_Moto_A()}

  //如果按下右后,则向后转

if(digitalRead(R_Q)==1 &&digitalRead(R_H)==0){Driver_Moto_A(255,false)}

  //如果按下右前,则向前转

if(digitalRead(R_Q)==0 &&digitalRead(R_H)==1){Driver_Moto_A(255,true)}

  //如果不按下左前和左后,则停转

if(digitalRead(L_Q)==1 &&digitalRead(L_H)==1){STOP_Moto_B()}

  //如果同时按下左前和左后,逻辑错误,则停转

if(digitalRead(L_Q)==0 &&digitalRead(L_H)==0){STOP_Moto_B()}

  //如果按下左后,则向后转

if(digitalRead(L_Q)==1 &&digitalRead(L_H)==0){Driver_Moto_B(255,false)}

  //如果按下左前,则向前转

if(digitalRead(L_Q)==0 &&digitalRead(L_H)==1){Driver_Moto_B(255,true)}

}

  //驱动右边电机,pwm为能量值,对应转速,Is_Forward为转向

void Driver_Moto_A(int pwm, bool Is_Forward)

{

if(Is_Forward)

{

  digitalWrite(MOTO_A_a,LOW)

  analogWrite(MOTO_A_b,pwm)

}

else

{

  digitalWrite(MOTO_A_b,LOW)

  analogWrite(MOTO_A_a,pwm)

}

}

  //停止右边电机

void STOP_Moto_A()

{

digitalWrite(MOTO_A_a,LOW)

digitalWrite(MOTO_A_b,LOW)

}

  //驱动左边电机,pwm为能量值,对应转速,Is_Forward为转向

void Driver_Moto_B(int pwm, bool Is_Forward)

{

if(Is_Forward)

{

  digitalWrite(MOTO_B_a,LOW)

  analogWrite(MOTO_B_b,pwm)

}

else

{

  digitalWrite(MOTO_B_b,LOW)

  analogWrite(MOTO_B_a,pwm)

}

}

  //停止左边电机

void STOP_Moto_B()

{

digitalWrite(MOTO_B_a,LOW)

digitalWrite(MOTO_B_b,LOW)

}

话不多说,先上图和程序,时间比较急的可以直接拿去用,下面分析可以不看。

#define vcc 2

#define pls 3

#define dir 4

#define ena 5

void setup() {

  Serial.begin(9600)

  pinMode(vcc,OUTPUT)

  pinMode(pls,OUTPUT)

  pinMode(dir,OUTPUT)

  pinMode(ena,OUTPUT)

  }

void loop() {

  digitalWrite(vcc,HIGH)

  digitalWrite(pls,HIGH)

  digitalWrite(dir,HIGH)

  digitalWrite(ena,HIGH)

  tone(pls,200)

}

接下来是程序讲解,最开始几个define是定义引脚,VCC是给驱动器提供电源引脚,pls是给步进电机提供脉冲引脚,dir决定电机正转还是反转,ena相当于步进电机驱动器的开关,控制电路给ena引脚高电压那么就相当于让驱动器能够接受控制信号,如果ena给的是低电压,那么不论你怎么给脉冲信号电机都不会动。

在arduino里面有一个tone函数可以产生脉冲

由上可知我们直接调用tone函数,即可在pls引脚产生一定频率的脉冲,并控制脉冲时间,上面程序中只设定了脉冲频率没有设定时长。至此驱动程序完成,如果感兴趣可以看一看下面为什么步进电机需要驱动。

步进电机是将电脉冲信号转变为角位移或线位移的开环控制电机,是现代数字程序控制系统中的主要执行元件,应用极为广泛。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数。

如上图2所示,步进电机内部有多对磁极,若通电状态保持不变,则步进电机会保持在某个固定状态,只有不断改变各个磁极对的通电状态,才能让步进电机不断旋转。所以步进电动机不能直接接到直流或交流电源上工作,必须使用专用的驱动电源(步进电动机驱动器)。控制器(脉冲信号发生器)可以通过控制脉冲的个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

直流电机原理,电机内部有由永磁铁形成的磁场,当线圈通电时由于受到电磁力而转动,转动到平衡位置后,由于电源没有随着线圈转动,故线圈受力依然使其朝同一个方向运动。如此往复,导致线圈可以不断朝一个方向转动。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12074573.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存