Скетч сжег два H-моста, нужна помощь, чтобы узнать, как его модифицировать.

Это радиоуправляемая машина Arduino, скетч хорошо протестирован на небольшом двигателе, но сгорели два драйвера на 60 А при подключении к двигателям 24 В, 500 Вт. Нужна помощь, чтобы выяснить, в чем дело?

#include <VirtualWire.h>


//двигатель A подключен между A01 и A02
//двигатель B подключен между B01 и B02

int STBY = 2; //режим ожидания //мод: было 10 --2 ??

int count;

//Двигатель А
int PWMA = 9; //Контроль скорости // нужен мод: было 3, изменилось на 9
int AIN1 = 8; //Направление // было 9
int AIN2 = 7; //Направление

//Мотор Б
int PWMB = 10; //Контроль скорости // нужен мод: было 5, изменилось на 10
int BIN1 = 5; //Направление // было 6
int BIN2 = 4; //Направление ///было 16 введено в p7, потому что Arduino uno no p16.

const boolean FORWARD = HIGH;
const boolean REVERSE = LOW;

float speed_Max = 252; //ШИМ обычно изменяется от: 0-255 ////0-255 меняется на 0-252

float speed_Min = 0;
float analogInput_Max = 1023;
float analogInput_Min = 0;
float analogInput_Middle_X = 515;//в идеале это было бы AnalogInput_Max/2
float analogInput_Middle_Y = 495;//в идеале это было бы AnalogInput_Max/2
float deadBand = 0;
float middleMax = (analogInput_Max / 2) + deadBand;
float middleMin = (analogInput_Max / 2) - deadBand;
boolean pastDirection = FORWARD;

void setup()
{
  // Настраиваем Таймер 2 для ШИМ @ 14 кГц.
  TCCR2A = 0;           // отменяем конфигурацию, выполненную...
  TCCR2B = 0;           // ...ядро библиотеки Arduino
  TCNT2  = 0;           // сбрасываем таймер

  TCCR2A = _BV(COM2A1)  // неинвертированный ШИМ на канале. А
           | _BV(COM2B1)  // то же самое для ch; Б
           | _BV(WGM20);  // режим 10: тел. правильный ШИМ, TOP = ICR1

      TCCR2B = (TCCR2B & 0b11111000) | 0x01; //3.92116 [кГц] //** используйте этот код, получили 3,9 кГц, но джойстик работает не очень хорошо
    {

    Serial.begin(9600);  // Только отладка
    Serial.println("setup"); //Выводит «Настройка» на последовательный монитор

    vw_set_rx_pin(6);       //Устанавливаем контакт D12 в качестве контакта RX
    vw_set_ptt_inverted(true); // Требуется для DR3100
    vw_setup(2000);      // Битов в секунду
    vw_rx_start();       // Запускаем работу ФАПЧ приемника

    pinMode(23, OUTPUT); //Реле одно ////M1 добавил 2 было 2 -- 4
    pinMode(25, OUTPUT); //Реле два
    pinMode(27, OUTPUT); //Реле четыре
    pinMode(29, OUTPUT); //Реле пять
    pinMode(31, OUTPUT); //Ретрансляция секса
    pinMode(33, OUTPUT); //Реле семь
    pinMode(35, OUTPUT); //Реле восемь
    pinMode(37, OUTPUT); //Реле три
    pinMode(39, OUTPUT); //Реле три
    pinMode(41, OUTPUT); //Реле восемь
    pinMode(43, OUTPUT); //Реле три
    pinMode(45, OUTPUT); //Реле три

    digitalWrite(23, HIGH); 
    digitalWrite(25, HIGH);
    digitalWrite(27, HIGH);
    digitalWrite(29, HIGH);
    digitalWrite(31, HIGH);
    digitalWrite(33, HIGH);
    digitalWrite(35, HIGH);
    digitalWrite(37, HIGH);
    digitalWrite(39, HIGH);
    digitalWrite(41, HIGH);
    digitalWrite(43, HIGH);
    digitalWrite(45, HIGH);
     }

  pinMode(STBY, OUTPUT); //// контакт: номер контакта, режим которого вы хотите установить; режим: INPUT, OUTPUT или INPUT_PULLUP.

  pinMode(PWMA, OUTPUT);
  pinMode(AIN1, OUTPUT);
  pinMode(AIN2, OUTPUT);

  pinMode(PWMB, OUTPUT);
  pinMode(BIN1, OUTPUT);
  pinMode(BIN2, OUTPUT);
}

void loop() {

button(); //// отключаем «кнопку», ничего не работает. удалить включение '//', кнопка работает хорошо
joystick(); //// отключаем "джойстик", не работает. уберите включение '//', джойстик работает хорошо, но управление мотором пока отсутствует

 }

void joystick() {

  uint8_t buf[VW_MAX_MESSAGE_LEN]; // Здесь объявляется массив переменных. вместо 7 переменных buf1, buf2 и т. д.
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
  if (vw_get_message(buf, &buflen)) // Неблокируемый
  {
    int i;
    int column = 0;
    String message;
    int commands[30];
    // Получено сообщение с хорошей контрольной суммой, сбросьте его.
    for (i = 0; i < buflen; i++)
    {
      //ОТЛАЖИВАТЬ:
      //Serial.print(char(buf[i]));

      if (char(buf[i]) == '|') {
        commands[column] = message.toInt();
        message = "";
        column++;
      } else {
        message += char(buf[i]);
      }
    }

    //еще раз, чтобы захватить последнее значение, поскольку сообщение не заканчивается на |
    commands[column] = message.toInt();

    // ОТЛАДКА
    // Serial.print("X: ");
    // Serial.print(команды[0]);
    // Serial.print(" Y: ");
    // Serial.println(команды[1]);

     motorControl(commands[0], commands[1]);

  }

}

void move(int motor, int speed, boolean direction) {
  digitalWrite(STBY, HIGH); //отключаем режим ожидания

   if (motor == 1) {
    digitalWrite(AIN1, direction);
    digitalWrite(AIN2, !direction);
    analogWrite(PWMA, speed);
  } else {
    digitalWrite(BIN1, !direction);
    digitalWrite(BIN2, direction);
    analogWrite(PWMB, speed);
  }
}

void motorControl(float x, float y) {
  boolean currentDirection = y >= analogInput_Middle_Y;

    //карта(значение, fromLow, fromHigh, toLow, toHigh);
  if (currentDirection == REVERSE) {
    y = map(y, analogInput_Middle_Y, analogInput_Min, speed_Min, speed_Max) ;
  } else {
    y = map(y, analogInput_Middle_Y, analogInput_Max, speed_Min, speed_Max);
  }

  int subtractFromLeft = map(x, analogInput_Middle_X, analogInput_Min, speed_Min, y);
  int subtractFromRight = map(x, analogInput_Middle_X, analogInput_Max, speed_Min, y);

  if (subtractFromRight < 0) {
    subtractFromRight = 0;
  }

  if (subtractFromLeft < 0) {
    subtractFromLeft = 0;
  }

  int Throttle_RIGHT = y - subtractFromRight;
  int Throttle_LEFT = y - subtractFromLeft;

  boolean currentDirection_LEFT = currentDirection;
  boolean currentDirection_RIGHT = currentDirection;


  if (Throttle_LEFT < 1 && Throttle_RIGHT > 1) {
    currentDirection_LEFT = !currentDirection;
    Throttle_LEFT = Throttle_RIGHT;
  }

  if (Throttle_RIGHT < 1 && Throttle_LEFT > 1) {
    currentDirection_RIGHT = !currentDirection;
    Throttle_RIGHT = Throttle_LEFT;
  }

  move(1, Throttle_LEFT, currentDirection_LEFT);
  move(2, Throttle_RIGHT, currentDirection_RIGHT);

  }

void button()
{
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
  if (vw_get_message(buf, &buflen)) // Неблокируемый
  {
    int i;
    digitalWrite(13, true);  // Мигаем светом, чтобы показать полученное хорошее сообщение
    // Получено сообщение с хорошей контрольной суммой, сбросьте его.
    Serial.print("Got: ");

    for (i = 0; i < buflen; i++)
    {
      int c = (buf[i]);
      Serial.print(c);
      Serial.print(" ");
      if (c == 65 ) {
        digitalWrite(23, !digitalRead(23));  //// А--РЕЛЕ А1
      }

      if (c == 66 ) {
        digitalWrite(25, !digitalRead(25));  //// B-РЕЛЕ A2
      }

      if (c == 67 ) {
        digitalWrite(27, !digitalRead(27)); //// C-РЕЛЕ B1
      }

      if (c == 68 ) {
        digitalWrite(29, !digitalRead(29)); //// D-РЕЛЕ B2
      }
/*      
      if (c == 69 ) {
        digitalWrite(37, !digitalRead(37)); //// Э--
      }

      if (c == 70 ) {
        digitalWrite(39, !digitalRead(39)); //// Ф--
      }
*/
      if (c == 71 ) {
        digitalWrite(31, !digitalRead(31)); //// G-РЕЛЕ C1
      }

      if (c == 72 ) {
        digitalWrite(33, !digitalRead(33));  //// H -- РЕЛЕ C2
      }

      if (c == 73 ) {
        digitalWrite(43, !digitalRead(43));  //// Я --
      }

       if (c == 74 ) {
        digitalWrite(35, !digitalRead(35));  //// Дж --
      }

       if (c == 75 ) {
        digitalWrite(37, !digitalRead(37));  //// К --
      }

      if (c == 76 ) {
        digitalWrite(39, !digitalRead(39));  //// Л --
      }
      if (c == 77 ) {
        digitalWrite(41, !digitalRead(41));  //// М --
      }
      if (c == 78 ) {
        digitalWrite(35, !digitalRead(35));  //// Н --
      }

    }
    count++;
    // Serial.print(count);
    Serial.println("");
    digitalWrite(13, false);
  }
}

Пришел мой новый драйвер, я просто боюсь его использовать, слышал, что двигатель постоянного тока при запуске потребляет ток до 300 А, что мне делать, чтобы уменьшить пусковой ток?

, 👍0

Обсуждение

Что за драйверы?, @Filip Franik

этот: https://www.ebay.com/itm/60A-DC-Motor-Driver-Module-High-Power-motor-Speed-Control-Dual-Channel-H-bridge/122479397950?hash=item1c84574c3e:g :ZHAAAOSww9xZC0wa:rk:2:pf:0, @laoadam

Правок много, что с ними делать?, @laoadam

откуда ты знаешь, что эскиз является причиной сбоя?, @jsotola

@jsotola Я не уверен, я проверил в Интернете, драйвер был продан и использовался довольно часто, поэтому я думаю, может быть, неправильный эскиз привел к «прострелу»?, @laoadam

мне кажется, что ваш код слишком сложен для простого теста работы двигателя ...... например, в чем причина всех реле?, @jsotola

Это. но тестирование проходит хорошо при напряжении 12 В, оно может контролировать скорость и направление двух двигателей 12 В. Все реле относятся к кнопке геймпада на стороне передачи., @laoadam

Не могу удержаться: «Разве ты не слышала, что нельзя сжигать мосты», @Duncan C

к сожалению. Полагаю, поговорка «Разве вы не слышали, что нельзя сжигать мосты» появилась после того, как сожгли 100 домов. решение пожалуйста., @laoadam


1 ответ


4

Как вы написали в комментарии, вы используете этот H-мост:

https://www.ebay.com/itm/60A-DC-Motor-Driver-Module-High-Power-motor-Speed-Control-Dual-Channel-H-bridge/122479397950

Описание использования понятно: функции h-bridge

Но в листинге не сказано, что произойдет, если вы установите состояние A1,A2=1.1 для этого H-моста.

Когда вы устанавливаете значение A1,A2=1,1 для незащищенного (дешевого) H-моста, вы получаете прямое замыкание на землю через 2 транзистора, которые мгновенно сжигают их

H-мост и электрический путь для 1,1

Ваш код на самом деле не защищает от этого:

   if (motor == 1) {
    digitalWrite(AIN1, direction);
    digitalWrite(AIN2, !direction);
    analogWrite(PWMA, speed);
  } else {
    digitalWrite(BIN1, !direction);
    digitalWrite(BIN2, direction);
    analogWrite(PWMB, speed);
  }
}

Если предыдущее значение направления равно 0 (A1,A2=0,1) и вы хотите установить направление на 1 (A1,A2=1,0) когда arduino запускает строку digitalWrite(AIN1, Direction); в течение нескольких циклов, вы фактически получаете A1,A2=1,1, и МОП-транзисторы уходят до свидания.

Попробуйте установить AIN1, AIN2 (или BIN1, BIN2) на 0, прежде чем менять направление

   if (motor == 1) {
    digitalWrite(AIN1, LOW);
    digitalWrite(AIN2, LOW);

    digitalWrite(AIN1, direction);
    digitalWrite(AIN2, !direction);
    analogWrite(PWMA, speed);
  } else {
    digitalWrite(BIN1, LOW);
    digitalWrite(BIN2, LOW);

    digitalWrite(BIN1, !direction);
    digitalWrite(BIN2, direction);
    analogWrite(PWMB, speed);
  }
}

Таким образом, вам гарантировано, что у вас всегда будет хотя бы один 0.

ОТРЕДАКТИРОВАНО:

Вы написали, что модуль содержит IR2103, он должен защитить вас от описанной выше проблемы. (Но предложенное мной исправление не представляет опасности, поэтому вы можете использовать его на всякий случай)

Есть и другая возможность. Возможно, быстрое изменение направления вызывает скачки высокого напряжения в двигателе, что приводит к сгоранию цепи. Вы видите там какие-нибудь силовые диоды? Посмотрите на изображение, которое я вставил выше, на нем есть 4 диода, которые должны безопасно разряжать эти пики. Убедитесь, что ваш код не меняет направление каждые несколько миллисекунд.

,

Спасибо Филип Франик, вы правы. Я помню, что сгорел после тестирования через некоторое время. Можете ли вы помочь мне изменить эскиз, чтобы избежать этого?, @laoadam

Или можно избежать этого, используя схему ниже: https://www.mycontraption.com/wp-content/uploads/2013/06/Super-Simple-MOSFET-H-Bridge.png, @laoadam

Не могли бы вы отремонтировать H-мост, заменив вышедшие из строя МОП-транзисторы?, @Duncan C

Я думаю, это возможно, я проверил, что пластина печатной платы сгорела, МОП-транзисторы могут быть еще пригодны к использованию, конечно, я также могу заменить новые МОП-транзисторы. По дороге я даже купил 2 картинки новых драйверов. Тем не менее мне нужно решить проблему. Спасибо., @laoadam

@laoadam Если вы можете прочитать номера деталей на микросхемах этого драйвера, я могу проверить таблицу данных, так ли это на самом деле. Обычно драйверы H-моста защищены., @Filip Franik

@ Филип Франик, на плате использовано 8 шт. LR7843/MOSFET 30 В 161A, 1 N-CH HEXFET и 4 x IR 2103/драйвер полумоста., @laoadam

Спасибо Филиппу Франику, проверю, когда придет мой новый водитель заказа., @laoadam

Привет Филип Франик! В драйвере сзади установлено 8 диодов Шоттки ss32., @laoadam

Этот динамик H-моста выглядит довольно хорошо спроектированным. Единственной причиной его неудачи могут быть возможные быстрые переключения, которые на мгновение превращают двигатели в источники высокого напряжения., @Filip Franik

@Filip Franik Спасибо. При проверке SOA полевого МОП-транзистора, чем выше ток, тем меньше время, скажем, 80 А при 100 мкс, означает ли это, что я могу использовать цикл ШИМ менее 100 мкс при 80 А?, @laoadam

@Filip Franik Привет, Фрэнк, пришел мой новый драйвер, и я изменил эскиз. Я слышал, что умеренная группа может здесь пригодиться, можете ли вы мне помочь, как ее здесь нарисовать? Я хочу попробовать как можно больше, прежде чем подключить новый привод. Большое спасибо., @laoadam