单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:11245|回复:36
打印上一主题下一主题

【Arduino】168种传感器模块系列实验(172)---MX1508双路马达驱动

[复制链接]
跳转到指定楼层
楼主
ID:513258发表于 2020-12-5 19:41|只看该作者|只看大图回帖奖励
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
实验一百七十二:MX1508 四通道双路有刷直流马达驱动模块 2路直流电机驱动模块 双H桥步进电机 正反转PWM调速




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




板凳
ID:513258发表于 2020-12-6 09:02|只看该作者
MX1508内部结构图



地板
ID:513258发表于 2020-12-6 09:07|只看该作者

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

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

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

5#
ID:513258发表于 2020-12-6 09:09|只看该作者

主要特性
   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 节锂电池供电的马达驱动

6#
ID:513258发表于 2020-12-6 09:29|只看该作者

7#
ID:513258发表于 2020-12-6 09:33|只看该作者

8#
ID:513258发表于 2020-12-6 09:34|只看该作者

9#
ID:513258发表于 2020-12-6 09:37|只看该作者

10#
ID:513258发表于 2020-12-6 09:39|只看该作者

11#
ID:513258发表于 2020-12-6 09:42|只看该作者

12#
ID:513258发表于 2020-12-6 09:45|只看该作者

13#
ID:513258发表于 2020-12-6 09:48|只看该作者



14#
ID:513258发表于 2020-12-6 09:51|只看该作者





15#
ID:513258发表于 2020-12-11 10:54|只看该作者


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

16#
ID:513258发表于 2020-12-11 11:15|只看该作者


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

17#
ID:513258发表于 2020-12-11 12:41|只看该作者
MX1508双路马达驱动模块电原理图



18#
ID:513258发表于 2020-12-11 12:59|只看该作者
MX1508双路马达驱动模块接脚图



19#
ID:513258发表于 2020-12-11 13:05|只看该作者
MX1508 电机驱动逻辑真值表



20#
ID:513258发表于 2020-12-11 13:08|只看该作者
MX1508双路电机驱动模块接线示意图



21#
ID:513258发表于 2020-12-11 16:13|只看该作者
下载安装MX1508库

链接  https://github.com/Saeterncj/MX1508




22#
ID:513258发表于 2020-12-11 17:25|只看该作者
  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
  3.   实验一百七十二:MX1508 四通道双路有刷直流马达驱动模块
  4.   2路直流电机驱动模块 双H桥步进电机 正反转PWM调速

  5.   1、安装库:下载链接 https://github.com/Saeterncj/MX1508
  6.   2、实验接线方法
  7.   MX1508模块   Ardunio Uno
  8.   GND---------GND接地线
  9.   VCC---------5V 接电源
  10.   IN1---------D9(PWM)
  11.   IN2 ------- D10(PWM)
  12.   3、实验之一:简易控制电机(MOTOR-A)连续正转,PWM设置为250
  13. */

  14. #include< MX1508.h>

  15. #define PINA 9
  16. #define PINB 10
  17. #define NUMPWM 2
  18. #define PWM 250

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

  20. void setup() {}

  21. void loop() {
  22.   motorA.motorGo(PWM);
  23. }
复制代码


23#
ID:513258发表于 2020-12-11 18:03|只看该作者
实验一场景示意图



24#
ID:513258发表于 2020-12-11 19:45|只看该作者
  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
  3.   实验一百七十二:MX1508 四通道双路有刷直流马达驱动模块
  4.   2路直流电机驱动模块 双H桥步进电机 正反转PWM调速

  5.   1、安装库:下载链接 https://github.com/Saeterncj/MX1508
  6.   2、实验接线方法
  7.   MX1508模块   Ardunio Uno
  8.   GND---------GND接地线
  9.   VCC---------5V 接电源
  10.   IN1---------D9(PWM)
  11.   IN2 ------- D10(PWM)
  12.   3、实验之二:控制电机(MOTOR-A)正转与反转,
  13.   PWM为0-180,180-0,,逐步加速然后减速,循环
  14. */

  15. #include< MX1508.h>

  16. #define PINA 9
  17. #define PINB 10
  18. #define NUMPWM 2

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

  20. void setup() {
  21.   Serial.begin(115200);
  22. }


  23. /*
  24.   通过每50毫秒将pwm增加1来将斜坡增加到pwm = 180。
  25.    然后通过每50毫秒降低pwm降低到pwm = -180。
  26.    正值pwm表示正向。
  27.    负值pwm的方向相反。
  28. */

  29. void loop() {
  30.   static unsigned long lastMilli = 0;
  31.   static bool cwDirection = true; // 假设初始方向(正pwm)为顺时针
  32.   static int pwm = 1;

  33.   if (millis() - lastMilli > 50) { // 每50毫秒
  34.    if (cwDirection&& pwm++ > 180 ) {
  35.      cwDirection = false;
  36.    } else if (!cwDirection&& pwm--< -180) {
  37.      cwDirection =  true;
  38.    }
  39.    motorA.motorGo(pwm);
  40.    lastMilli = millis();
  41.    Serial.println(motorA.getPWM()); // 我们可以只打印pwm,但是仅显示成员函数getPWM()起作用。
  42.   }

  43. }
复制代码


25#
ID:513258发表于 2020-12-11 20:03|只看该作者
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引脚时才应使用此功能。

26#
ID:513258发表于 2020-12-11 20:16|只看该作者
MX1508.h文件

  1. #ifndef MX1508_h
  2. #define MX1508_h

  3. #include "Arduino.h"

  4. typedef enum
  5. {
  6.   FAST_DECAY  = 0,  // set non-PWM pin low
  7.   SLOW_DECAY = 1   // set non-PWM pin high
  8. } DecayMode;

  9. typedef enum
  10. {
  11.   PWM_1PIN  = 1,
  12.   PWM_2PIN  = 2
  13. } NumOfPwmPins;

  14. class MX1508 {
  15.   public:
  16.    MX1508(uint8_t pinIN1, uint8_t pinIN2); // default fast decay, 2 pwm pins
  17.    MX1508(uint8_t pinIN1, uint8_t pinIN2, DecayMode decayMode, NumOfPwmPins numPWM);
  18.    void motorGo(long pwmVal); //
  19.    void setResolution(unsigned int resolution);
  20.    int getPWM();
  21.    void stopMotor();
  22.      void analogWrite16(uint8_t pin, uint16_t val);
  23.    void setPWM16(uint8_t prescaler, unsigned int resolution);
  24.   private:
  25.   
  26.    uint8_t _pinIN1;
  27.    uint8_t _pinIN2;
  28.      bool _useAnalogWrite16 = false;
  29.    int _pwmVal;
  30.    int _pwmResolution = 255;   //max resolution of pwm, default is 255.  
  31.    DecayMode _whichMode;
  32.    NumOfPwmPins _numPwmPins;
  33. };

  34. #endif
复制代码



27#
ID:513258发表于 2020-12-11 20:19|只看该作者
MX1508.cpp文件

  1. #include "MX1508.h"

  2. MX1508::MX1508( uint8_t pinIN1, uint8_t pinIN2) {
  3.   _pinIN1 = pinIN1; // always a PWM pin
  4.   _pinIN2 = pinIN2; // can be a non-Pwm pin.
  5.   _whichMode = FAST_DECAY;
  6.   _numPwmPins = PWM_2PIN;
  7.   pinMode(_pinIN1, OUTPUT);
  8.   pinMode(_pinIN2, OUTPUT);
  9. }

  10. MX1508::MX1508( uint8_t pinIN1, uint8_t pinIN2, DecayMode decayMode, NumOfPwmPins numPins) {
  11.   _pinIN1 = pinIN1; // always a PWM pin
  12.   _pinIN2 = pinIN2; // can be a non-Pwm pin.
  13.   _whichMode = decayMode;
  14.   _numPwmPins = numPins;
  15.   pinMode(_pinIN1, OUTPUT);
  16.   pinMode(_pinIN2, OUTPUT);
  17. }

  18. int MX1508::getPWM() {
  19.   return _pwmVal;
  20. }

  21. void MX1508::stopMotor() {
  22.   digitalWrite(_pinIN1, LOW);
  23.   digitalWrite(_pinIN2, LOW);
  24. }

  25. void MX1508::setResolution(unsigned int pwmResolution) {
  26.   _pwmResolution = pwmResolution;
  27.   if(_useAnalogWrite16) ICR1 = pwmResolution;
  28. }

  29. void MX1508::setPWM16(uint8_t prescaler, unsigned int resolution){
  30.      if(prescaler > 5 || prescaler == 0) prescaler = 3; // default to 64 if not in range.
  31.      DDRB  |= _BV(PB1) | _BV(PB2);     /* set pin 9and 10 as outputs */
  32.    TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(WGM11);   // non-inverting PWM, mode 14 fastPWM, TOP =ICR1
  33.      TCCR1B = _BV(WGM13) | _BV(WGM12) | prescaler ;     // rescaler must be 1->5, 1,8,64,256,1028 respectively
  34.      ICR1 = resolution;
  35.      _pwmResolution = resolution;
  36.      _useAnalogWrite16 = true;
  37. }

  38. void MX1508::analogWrite16(uint8_t pin, uint16_t val)
  39. {
  40.   if(_useAnalogWrite16){
  41.      if(val< 5) val =5;
  42.      switch (pin) {
  43.          case  9: OCR1A = val; break;
  44.          case 10: OCR1B = val; break;
  45.          default: analogWrite(pin,val);
  46.      }
  47.   }else{
  48.        analogWrite(pin, val);
  49.   }
  50. }

  51. void MX1508::motorGo(long pwmSpeed) {
  52.   _pwmVal = pwmSpeed;
  53.   
  54.   // if set decay mode is set as fast decay mode
  55.   if (this->_whichMode == FAST_DECAY) {
  56.    if (pwmSpeed >= 0) {                 //forward fast decay
  57.      if(_numPwmPins == PWM_1PIN)digitalWrite(_pinIN2, LOW);
  58.        else analogWrite16(_pinIN2, 1);
  59.      analogWrite16(_pinIN1, pwmSpeed);
  60.    } else if (this->_numPwmPins == PWM_2PIN) { // reverse fast decay
  61.      pwmSpeed *= -1;
  62.        analogWrite16(_pinIN1, 1);
  63.      analogWrite16(_pinIN2, pwmSpeed);
  64.    } else if (this->_numPwmPins == PWM_1PIN) { // reverse slow decay
  65.      pwmSpeed *= -1;
  66.      pwmSpeed = map(pwmSpeed, 0, _pwmResolution, _pwmResolution, 0);
  67.      digitalWrite(_pinIN2, HIGH);
  68.      analogWrite16(_pinIN1, pwmSpeed);
  69.    }
  70.   }
  71.    // if decay mode is set as slow decay mode
  72.   else {
  73.    if (pwmSpeed >= 0) {                 // forward slow decay
  74.      pwmSpeed = map(pwmSpeed, 0, _pwmResolution, _pwmResolution, 0);
  75.      if(_numPwmPins == PWM_1PIN)digitalWrite(_pinIN1, HIGH);
  76.        else analogWrite16(_pinIN1, _pwmResolution);
  77.      analogWrite16(_pinIN2, pwmSpeed);
  78.    } else if (this->_numPwmPins == PWM_2PIN) { // reverse slow decay
  79.      pwmSpeed *= -1;
  80.      pwmSpeed = map(pwmSpeed, 0, _pwmResolution, _pwmResolution, 0);
  81.        analogWrite16(_pinIN2, _pwmResolution);
  82.      analogWrite16(_pinIN1, pwmSpeed);
  83.    } else if (this->_numPwmPins == PWM_1PIN) { // reverse fast decay
  84.      pwmSpeed *= -1;
  85.      digitalWrite(_pinIN1, LOW);
  86.      analogWrite16(_pinIN2, pwmSpeed);
  87.    }
  88.   }
  89. }
复制代码



28#
ID:513258发表于 2020-12-12 16:57|只看该作者
实验之三:通过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)。
29#
ID:513258发表于 2020-12-12 16:59|只看该作者
  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
  3.   实验一百七十二:MX1508 四通道双路有刷直流马达驱动模块
  4.   2路直流电机驱动模块 双H桥步进电机 正反转PWM调速

  5.   1、安装库:下载链接 https://codeload.github.com/Saeterncj/MX1508/zip/master
  6.   2、实验接线方法
  7.   MX1508模块   Ardunio Uno
  8.   GND---------GND接地线
  9.   VCC---------5V 接电源
  10.   IN1---------D9(PWM)
  11.   IN2 ------- D10(PWM)
  12.   3、实验之三:通过D9和D10的pwm引脚来实现16位PWM
  13. */

  14. #include< MX1508.h>

  15. #define PINA 9
  16. #define PINB 10
  17. #define NUMPWM 2

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

  19. int resolution = 1000;
  20. void setup() {
  21.   Serial.begin(115200);

  22.   motorA.setPWM16(2, resolution); // 预分频器为8,分辨率1000,PWM频率= 16Mhz / 8/1000 = 2000Hz
  23.   // prescalar 1=1, 2=8, 3=64, 4=256, 5 =1028
  24.   /*------------ setPWM16 Class function is defined as below-----------------
  25.    void MX1508::setPWM16(uint8_t prescaler, unsigned int resolution){
  26.    if(prescaler > 5 || prescaler == 0) prescaler = 3; // default to 64 if not in range.
  27.    DDRB  |= _BV(PB1) | _BV(PB2);     // set pin 9and 10 as outputs
  28.      TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(WGM11);   // non-inverting PWM, mode 14 fastPWM, TOP =ICR1
  29.    TCCR1B = _BV(WGM13) | _BV(WGM12) | prescaler ;
  30.    ICR1 = resolution;
  31.    _pwmResolution = resolution;
  32.    _useAnalogWrite16 = true;
  33.    }
  34.   */
  35. }
  36. /*
  37. 通过每50毫秒将pwm增加1,将斜率提高到pwm =分辨率/ 2。
  38.    然后通过每50毫秒降低pwm降低到pwm = -resolution / 2。
  39.    正值pwm表示正向。
  40.    负值pwm的方向相反。  
  41. */
  42. void loop() {
  43.   static unsigned long lastMilli = 0;
  44.   static bool cwDirection = true; // 假设初始方向(正pwm)为顺时针
  45.   static int pwm = 1;

  46.   if (millis() - lastMilli > 50) { // 每50毫秒
  47.    if (cwDirection&& pwm++ > resolution / 2 ) {
  48.      cwDirection = false;
  49.    } else if (!cwDirection&& pwm--< -(resolution / 2)) {
  50.      cwDirection =  true;
  51.    }
  52.    motorA.motorGo(pwm);
  53.    lastMilli = millis();
  54.    Serial.println(motorA.getPWM()); // we can just print pwm but just showing that member function getPWM() works.
  55.   }
  56. }
复制代码


30#
ID:513258发表于 2020-12-14 19:56|只看该作者
实验开源图形编程(Mind+、编玩边学)
通过数字口12和13,简单控制电机A正转与反转



31#
ID:513258发表于 2020-12-14 19:57|只看该作者
实验开源仿真编程(linkboy3.7)
使用按键控制电机1,按下正转,松开停止




32#
ID:513258发表于 2020-12-24 13:01|只看该作者
【花雕动手做】超迷你哦,用商徽香烟盒做个智能小车!




33#
ID:513258发表于 2020-12-24 13:04|只看该作者
【花雕动手做】超迷你哦,用商徽香烟盒做个智能小车!



34#
ID:513258发表于 2020-12-24 13:06|只看该作者
【花雕动手做】超迷你哦,用商徽香烟盒做个智能小车!




35#
ID:74784发表于 2021-3-7 18:30|只看该作者
上个MX1508的pdf看看?
36#
ID:710495发表于 2022-1-24 12:47|只看该作者
你好,我最近在用这个模块的时候出了点问题。我用3.3V供电STC8G2K64S4单片机和mx1508模块,输入1和0也就是高低电平电机并不会转动,只有输入两个高电平的时候电机才转动,而且只能朝一个方向转动,请问这是什么问题
37#
ID:796416发表于 2022-7-7 01:59|只看该作者
1508有不同的版本,9楼的那张原理图与其他的电路与模块实物都不符,发贴前建议检查确认一下。

手机版|小黑屋|51黑电子论坛|51黑电子论坛6群QQ管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网