专注电子技术学习与研究
当前位置:单片机教程网 >> Arduino >> 浏览文章

Arduino UNo 通过LM298n控制直流电机

作者:goingxu   来源:本站原创   点击数:  更新时间:2014年04月21日   【字体:

控制直流电机比较简单,主要利用Lm298n构成H桥来控制电机正反转。。

 

器件:

            LM298N模块1块;arduino uno 1块;直流电机 1个。

 

接线:

    LM298n除了控制部分和电机输入电源线各2根外,输入In1~In4,分别对应输出OUT1~OUT4. 接直流电机时OUT1、2接电机1的两条电源线;OUT3、4接电机2。这里只用了一个直流电机所以直接out1、2.

   输入端还有两条线EnA、EnB分别用于输入pwm波对两个电机调速。

  In1:High,In2:Low 时,电机正传(其实无所谓方向正负)。反之,反转。

 

  In1--》P13;in2--》p12; EnA--》P11(需要可以输出pwm波的端口)

 

程序:

 对网上找的的程序进行修改,实测可用:

 

 #define motor1pin1 13                              //定义IN1引脚
#define motor1pin2 12                              //定义IN2引脚
#define motor1pwm 11                             //定义ENA引脚(我的是Mega2560的板子)
#define motor2pin1 9                              //定义IN3引脚
#define motor2pin2 8                               //定义IN4引脚
#define motor2pwm 10                              //定义ENB引脚

unsigned long lastMillis =0;
unsigned long currentMillis =0;

unsigned long lastMicros =0;
unsigned long currentMicros =0;

unsigned long intervalMillis =0 ;
unsigned long intervalMicros =0;

void motor(int motorpin1,int motorpin2,int motorpwm,int val)  //定义一个电机转动函数
{
    pinMode(motorpin1,OUTPUT);                              //输出第一个引脚
    pinMode(motorpin2,OUTPUT);                             //输出第二个引脚
    digitalWrite(motorpin2,0);                                    //将第二个引脚置低
    digitalWrite(motorpin1,1);                                     //将第一个引脚抬高
    analogWrite(motorpwm,val);                                //给EN引脚设定模拟值,设定转速
}
void setup()

    Serial.begin(9600);
}
void loop()
{
  int i;
  currentMicros=micros();
  intervalMicros = currentMicros - lastMicros;
   Serial.println(intervalMicros);
   lastMicros=currentMicros;
//  for(i=100;i<=255;i++) //让电机的转速从100到255转动,A,B转速不一样,完成转向
//  {
//  //  motor(motor2pin1,motor2pin2,motor2pwm,255);             //电机B保持255匀速转动
//    motor(motor1pin1,motor1pin2,motor1pwm,i);                  //电机A从100到255转动
//    delay(500);                                                              //间隔500ms
//  }
//  for(i=100;i<=255;i++)                                  //让电机从100到255转动,功能同上
//  {
//    motor(motor1pin1,motor1pin2,motor1pwm,255);
//  //  motor(motor2pin1,motor2pin2,motor2pwm,i);
//    delay(500);
//  }
  motor(motor1pin1,motor1pin2,motor1pwm,125);                 //电机A以  转速转动
  delay(500);
   motor(motor1pin1,motor1pin2,motor1pwm,0);               
  delay(500);
  motor(motor1pin2,motor1pin1,motor1pwm,125);                //电机A反向转动
  delay(500);
   motor(motor1pin1,motor1pin2,motor1pwm,0);               
  delay(500);
}

 

结论:

    对直流电机的方向和速度控制简单。一个电机需要3个I/o口,因此一片arduino uno 只能控制4个电机,而且无法增加反馈。实际测量A0~A5也是可以输出数字信号的,如果可以加入,最多可控制6个电机,这个以后看看avr的接口再说。

    电机自带一个霍尔元件构成的码盘,测量成功,但还没用于电机速度位置控制,在网上搜了一下闭环控制的内容,发现首先需要采集足够多的编码器信号,如果对编码器进行4倍频,又需要占用1个中断2个接口,多个电机时处理速度上不知道是否可以保证;pid控制方面的例子也比较少,只好拔了一下arduino.cc,发现有人提供了库函数。后面有时间试试。

关闭窗口

相关文章