【雕爷学编程】Arduino动手做(157)---MX1508双路电机驱动模块

发布时间 2023-07-10 10:03:07作者: 行者花雕

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

 

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百五十七:MX1508 四通道双路有刷直流电机驱动模块 2路直流马达驱动模块 双H桥步进电机 正反转PWM调速

 

 

知识点:MX1508芯片

是专用单芯片解决方案,芯片内部集成两路 H 桥驱动电路,可同时驱动转向电机以及前进后退电机。为电池供电的玩具、低压或者电池供电的运动控制应用提供了一种集成的有刷直流马达驱动解决方案。电路内部集成了两通道采用N沟和P沟功率MOSFET设计的H桥驱动电路,适合于驱动电动玩具车的转向轮及后轮驱动,(驱动有刷直流马达或者驱动步进马达的两个绕组)。该电路具备较宽的工作电压范围(从2V到9.6V)。

 

MX1508内部结构图

MX1508单通道工作时,左转/右转通道用于驱动转向电机,最大持续输出电流达到 1.2A,最大峰值输出电流达到 1.5A。前进/后退通道用于驱动前进后退电机,最大持续输出电流达到 1.4A,最大峰值输出电流达到 2A;双通道同时工作时,左转/右转通道持续输出 0.8A 的情况下,前进/后退通道能持续输出 1.2A。该芯片具备较宽的工作电压范围(VM 端供电从 2V 到 8V),可覆盖 2 节干电池至 5 节干电池的应用。

该专用芯片内置过热保护电路。驱动电路的负载电流远大于电路的最大持续电流时,受封装散热能力限制,封装内部芯片的结温将会迅速升高,一旦超过设定值,内部电路将立即关断输出功率管,切断负载电流,避免温度持续升高造成塑料封装冒烟、起火等安全隐患。内置的温度迟滞电路,确保电路恢复到安全温度后,才允许重新对电路进行控制。

应用中注意采用PWM控制时,PWM频率不可太高,高了后无法响应,输出端并非PWM信号,导致控制失败,建议采用较低控制频率,两路PWM控制,注意不能采用互补控制,有效波形必须全部非高,否则电机刹车。控制电压建议小于10V,逻辑电平5V为宜。

 

主要特性
    a. 低待机电流 (小于0.1uA);
    b. 低静态工作电流;
    c. 集成的H桥驱动电路;
    d. 内置防共态导通电路;
    e. 低导通内阻的功率MOSFET管;
    f. 内置带迟滞效应的过热保护电路 (TSD);
    g. 抗静电等级:3KV (HBM);
  h. 集成的 H 桥驱动电路;
  i. 高度集成方案,集成 RX2 芯片和两个马达驱动芯片;
  j. 内置 2.5V 稳压 LDO 电路。

典型应用
  2-5 节 AA/AAA 干电池供电的玩具马达驱动;
  2-5 节镍-氢/镍-镉充电电池供电的玩具马达驱动;
  1-2 节锂电池供电的马达驱动

MX1508双路马达驱动模块特点
1.采用专业电机驱动芯片,内置低导通内阻MOS开关管,发热极小,无需散热片,体积小,省电,是您电池供电的理想选择。(相比较L298N内部为晶体管开关,效率低,发热高,需散热,体积笨重,市面上的L298N极容易烧坏,都没有采用原装芯片,本模块能够完美替代)。
2.双路1.5A*2,峰值电流可到2.5A, 内置过热保护电路,不用怕电机堵转烧坏,温度下降后自动恢复(目前市面上的智能小车电压和电流都在此范围内)。
3.体积小,质量轻,0待机电流,是各种模型车载的理想选择。

MX1508双路马达驱动模块主要参数
双路H桥电机驱动,可以同时驱动两路直流电机或者1个4线两相式步进电机;
模块供电电压2V-10V;
信号端输入电压1.8-7V;
单路工作电流1.5A,峰值电流可达2.5A,低待机电流 (小于 0.1uA);
内置防共态导通电路,输入端悬空时,电机不会误动作;
内置带迟滞效应的过热保护电路 (TSD),无需担心电机堵转;
产品尺寸: 24.7*21*5mm (长宽高),超小体积,适合组装和车载;
安装孔直径:2 mm;
重量:5g 

 

MX1508双路马达驱动模块电原理图

 

MX1508双路马达驱动模块接脚图

MX1508 电机驱动逻辑真值表

MX1508双路电机驱动模块接线示意图

下载安装MX1508库

链接  https://codeload.github.com/Saeterncj/MX1508/zip/master

 

Arduino实验开源代码

/*

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百五十七:MX1508 四通道双路有刷直流马达驱动模块

 2路直流电机驱动模块 双H桥步进电机 正反转PWM调速

 1、安装库:下载链接 https://codeload.github.com/Saeterncj/MX1508/zip/master

 2、实验接线方法

 MX1508模块  Ardunio Uno

 GND---------GND接地线

 VCC---------5V 接电源

 IN1---------D9(PWM)

 IN2 ------- D10(PWM)

 3、实验之一:简易控制电机(MOTOR-A)连续正转,

 PWM设置为180,运转电流大约70MA

*/



#include <MX1508.h>

#define PINA 9

#define PINB 10

#define NUMPWM 2

#define PWM 180

MX1508 motorA(PINA, PINB, FAST_DECAY, NUMPWM);

void setup() {}

void loop() {

 motorA.motorGo(PWM);

}

  

实验一场景示意图

 

Arduino实验开源代码之二

 

/*

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百五十七:MX1508 四通道双路有刷直流马达驱动模块

 2路直流电机驱动模块 双H桥步进电机 正反转PWM调速

 1、安装库:下载链接 https://codeload.github.com/Saeterncj/MX1508/zip/master

 2、实验接线方法

 MX1508模块  Ardunio Uno

 GND---------GND接地线

 VCC---------5V 接电源

 IN1---------D9(PWM)

 IN2 ------- D10(PWM)

 3、实验之二:控制电机(MOTOR-A)正转与反转,

 PWM为0-180,180-0,,逐步加速然后减速,循环

*/



#include <MX1508.h>

#define PINA 9

#define PINB 10

#define NUMPWM 2

MX1508 motorA(PINA, PINB, FAST_DECAY, NUMPWM);

void setup() {

 Serial.begin(115200);

}

/*

 通过每50毫秒将pwm增加1来将斜坡增加到pwm = 180。

  然后通过每50毫秒降低pwm降低到pwm = -180。

  正值pwm表示正向。

  负值pwm的方向相反。

*/

void loop() {

 static unsigned long lastMilli = 0;

 static bool cwDirection = true; // 假设初始方向(正pwm)为顺时针

 static int pwm = 1;

 if (millis() - lastMilli > 50) { // 每50毫秒

  if (cwDirection && pwm++ > 180 ) {

   cwDirection = false;

  } else if (!cwDirection && pwm-- < -180) {

   cwDirection = true;

  }

  motorA.motorGo(pwm);

  lastMilli = millis();

  Serial.println(motorA.getPWM()); // 我们可以只打印pwm,但是仅显示成员函数getPWM()起作用。

 }

}

  

MX1508库的几个函数

1、motorGo(pwmVal)

这将设置PWM val(速度)其值为0-200(数值太小,电机只是抖动而无法转动,合适的数值需要通过实验来确定)

2、stopMotor()

只需停止电动机

3、setResolution(pwmResolution)

可以更改pwm的分辨率。要使用此功能,必须使用arduino nano / uno的9和10的pwm可以实现16位PWM。理论上,该值可以在0-65535之间的任何值)

说明:

MX1508电机驱动器的主要缺点之一是需要PWM引脚,每1台电机需要2 pwm引脚。通过实验发现,仅使用一个PWM和任何数字引脚,而不是使用2个不同的PWM引脚是可能的。这是一个巨大的折衷。电机转动一个方向所获得的响应不同于电机转动另一个方向所获得的响应。在一种方式中,将获得FAST_DECAY响应(线性响应,看起来像一个“ V”),然后在另一种情况下,将获得SlOW_DECAY响应(积极反应,看起来像个“ U”)。仅当绝对没有更多的PWM引脚时才应使用此功能。

 

实验之三:通过D9和D10的pwm引脚来实现16位PWM

  使用功能setPWM16(uint8_t预分频器,unsigned int分辨率)的Arduino Nano / Uno引脚9和10的分辨率。

  快速pwm频率的公式= MPU(16Mhz)/预分频器/分辨率的频率, F_PWM = 16000000 /预分频器/分辨率

  预分频器参数值必须在1-5之间,分别代表1、8、64、256、1024。分辨率必须为0-65535之间的值。

  MX1508(uint8_t pinIN1,uint8_t pinIN2,DecayMode衰减模式,NumOfPwmPins numPWM);

  DecayMode必须为FAST_DECAY或SLOW_DECAY,NumOfPwmPins,对于setPWM16()函数,其值必须为2,PINA和PINB必须!!! 是setPWM16()函数的引脚9和10 。

  示例MX1508 myMotor(10,9,FAST_DECAY,2)。

 

 

/*

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

 实验一百五十七:MX1508 四通道双路有刷直流马达驱动模块

 2路直流电机驱动模块 双H桥步进电机 正反转PWM调速

 1、安装库:下载链接 https://codeload.github.com/Saeterncj/MX1508/zip/master

 2、实验接线方法

 MX1508模块  Ardunio Uno

 GND---------GND接地线

 VCC---------5V 接电源

 IN1---------D9(PWM)

 IN2 ------- D10(PWM)

 3、实验之三:通过D9和D10的pwm引脚来实现16位PWM

*/



#include <MX1508.h>

#define PINA 9

#define PINB 10

#define NUMPWM 2

MX1508 motorA(PINA, PINB, FAST_DECAY, 2);

int resolution = 1000;

void setup() {

 Serial.begin(115200);

 motorA.setPWM16(2, resolution); // 预分频器为8,分辨率1000,PWM频率= 16Mhz / 8/1000 = 2000Hz

 // prescalar 1=1, 2=8, 3=64, 4=256, 5 =1028

 /*------------ setPWM16 Class function is defined as below-----------------

  void MX1508::setPWM16(uint8_t prescaler, unsigned int resolution){

  if(prescaler > 5 || prescaler == 0) prescaler = 3; // default to 64 if not in range.

  DDRB |= _BV(PB1) | _BV(PB2);    // set pin 9and 10 as outputs

   TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(WGM11);  // non-inverting PWM, mode 14 fastPWM, TOP =ICR1

  TCCR1B = _BV(WGM13) | _BV(WGM12) | prescaler ;

  ICR1 = resolution;

  _pwmResolution = resolution;

  _useAnalogWrite16 = true;

  }

 */

}

/*

 通过每50毫秒将pwm增加1,将斜率提高到pwm =分辨率/ 2。

 然后通过每50毫秒降低pwm降低到pwm = -resolution / 2。

 正值pwm表示正向。

 负值pwm的方向相反。

*/

void loop() {

 static unsigned long lastMilli = 0;

 static bool cwDirection = true; // 假设初始方向(正pwm)为顺时针

 static int pwm = 1;

 if (millis() - lastMilli > 50) { // 每50毫秒

  if (cwDirection && pwm++ > resolution / 2 ) {

   cwDirection = false;

  } else if (!cwDirection && pwm-- < -(resolution / 2)) {

   cwDirection = true;

  }

  motorA.motorGo(pwm);

  lastMilli = millis();

  Serial.println(motorA.getPWM()); // 我们可以只打印pwm,但是仅显示成员函数getPWM()起作用。

 }

}

  

实验开源图形编程(Mind+、编玩边学)

通过数字口12和13,简单控制电机A正转与反转

 

实验开源仿真编程(Linkboy V4.62)

使用按键控制电机1,按下正转,松开停止

 

实验仿真编程(linkboy V4.62)之二
通过设置延时器,控制电机1正转与反转

 

 

使用红外遥控和MX1508模块,控制二只电机正转2秒

实验开源图形编程(Mind+、编玩边学)

 

Arduino实验场景图

【花雕动手做】超迷你哦,用商徽香烟盒做个智能小车!

 

【花雕动手做】超迷你哦,用商徽香烟盒做个智能小车!

https://v.youku.com/v_show/id_XNTAyMzQ4MzA4OA==.html?spm=a2hzp.8253869.0.0