电机驱动的学习笔记

常见双H桥电机驱动模块:

H桥电路通常包含四个独立控制的开关元件,通常用于驱动电流较大的负载,比如电机。如图:

这里有四个开关元件Q1,Q2,Q3,Q4,另外还有一个直流电机M。我们可以通过 对Q开关的控制,来驱动直流电机。而其中的正转和反转是人为规定的方向。

例如正转:

  • 打开Q1和Q4
  • 关闭Q2和Q3 

此时假设电机正转,电流依次流过Q1,M,Q4。如下图:

应用:

实际应用时,市面上常用的电机驱动的型号,通常接上电源,电机,通过控制信号就可以驱动电机了。

由于网上找到的资料为L298N模块为以下,我们以此作为了解:

其属于H桥集成电路,其输出电流为2A,最高为4A。最高工作电压为50V.其输入端可以与带单片机直接相连,从而通过单片机对其进行控制。实现电机的驱动。

这是网上找到的模块介绍图:

  •  OutputA\B:用于连接两个电机
  • 5V enable:如果使用的输入电源为大于12v的电源,要将跳帽线移除,反之,短接其可以提供5v的电源输出
  • +5V power:如果输入电源小于12V且短接,可以输出5V的电源
  • 连接电机电源,最大为35V.输入电源大于12V时,为了安全,要将5V enble针脚上的跳帽线移除。
  • A/B enble:可以用于输入PWM脉宽调制信号对电机进行调速控制:

PWM频率:

指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);

也就是说一秒钟PWM有多少个周期

单位:HZ

PWM周期:

周期=1/频率

例如:59HZ就相当于20ms,也就是说,一秒有50次周期

占空比:

指一个脉冲周期中,高电平的时间与整个周期时间比例。

在单片机中,我们知道IO口输出的是数字信号,IO口只能输出高电平和低电平

假设高电平为5V,低电平为0V.那么通过改变IO口输出的方波的占空比,(即通过对断开和连接时间的控制)理论上可以输出0-5V之间的任意大的电压值。

比方说,占空比为50%,即高电平时间的一半,低电平时间的一半。在此频率下,就可以得到2.5v的输出电压。

  • 控制: 控制电机全速运动:

电机对应的两个逻辑输入口,全速则不用拔掉跳线帽。此时使能端为5V的电机满占空比驱动,全速运行

 

 上图为本次小车使用的电机驱动:

 对于逻辑输入口:

  • ENA接5V,使能电机A
  • ENA接地,电机A不转
  • IN1接5V ,IN2接地 电机A正转
  • IN1接地 IN2接5V 电机反转
  • (对于电机B,则是对于相应的IN3 ,IN4)

下面通过网上找到的一段关于电机驱动代码进行分析学习:

Arduino智能小车——测试篇_不懂音乐的欣赏者的博客-CSDN博客_arduino小车代码

//定义五中运动状态
#define STOP      0
#define FORWARD   1
#define BACKWARD  2
#define TURNLEFT  3
#define TURNRIGHT 4
//定义需要用到的引脚
int leftMotor1 = 4;
int leftMotor2 = 5;
int rightMotor1 = 6;
int rightMotor2 = 7;

void setup() {
  // put your setup code here, to run once:
  //设置控制电机的引脚为输出状态
  pinMode(leftMotor1, OUTPUT);
  pinMode(leftMotor2, OUTPUT);
  pinMode(rightMotor1, OUTPUT);
  pinMode(rightMotor2, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  int cmd;
  for(cmd=0;cmd<5;cmd++)//依次执行向前、向后、向左、想有、停止四个运动状态
  {
    motorRun(cmd);  
    delay(2000);//每个命令执行2s 
  } 
}
//运动控制函数
void motorRun(int cmd)
{
  switch(cmd){
    case FORWARD:
      digitalWrite(leftMotor1, LOW);
      digitalWrite(leftMotor2, HIGH);
      digitalWrite(rightMotor1, LOW);
      digitalWrite(rightMotor2, HIGH);
      break;
     case BACKWARD:
      digitalWrite(leftMotor1, HIGH);
      digitalWrite(leftMotor2, LOW);
      digitalWrite(rightMotor1, HIGH);
      digitalWrite(rightMotor2, LOW);
      break;
     case TURNLEFT:
      digitalWrite(leftMotor1, HIGH);
      digitalWrite(leftMotor2, LOW);
      digitalWrite(rightMotor1, LOW);
      digitalWrite(rightMotor2, HIGH);
      break;
     case TURNRIGHT:
      digitalWrite(leftMotor1, LOW);
      digitalWrite(leftMotor2, HIGH);
      digitalWrite(rightMotor1, HIGH);
      digitalWrite(rightMotor2, LOW);
      break;
     default:
      digitalWrite(leftMotor1, LOW);
      digitalWrite(leftMotor2, LOW);
      digitalWrite(rightMotor1, LOW);
      digitalWrite(rightMotor2, LOW);
  }
}

分析:

  • 代码开头通过宏定义,对状态有数字代替,让代码更简便。
  • 此代码不管电机的转速,所以ENA,ENB两组引脚默认输出高电平。只需要控制IN1,IN2,IN3,IN4两组引脚
  • 当电机的两个输入端的电压差满足一定条件时电机才会转动。控制小车运动时,只需将同一边两个引脚设置成不同的电压即可。
  • 为了提高函数的使用性,其代码将控制小车运动状态的语句封装在函数里,方便调用。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值