Скетч сжег два 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 А, что мне делать, чтобы уменьшить пусковой ток?
@laoadam, 👍0
Обсуждение1 ответ
Как вы написали в комментарии, вы используете этот H-мост:
https://www.ebay.com/itm/60A-DC-Motor-Driver-Module-High-Power-motor-Speed-Control-Dual-Channel-H-bridge/122479397950
Описание использования понятно:
Но в листинге не сказано, что произойдет, если вы установите состояние A1,A2=1.1
для этого H-моста.
Когда вы устанавливаете значение A1,A2=1,1
для незащищенного (дешевого) H-моста, вы получаете прямое замыкание на землю через 2 транзистора, которые мгновенно сжигают их
Ваш код на самом деле не защищает от этого:
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
- Реализовать связь Visible Light с помощью Arduino
- Невозможно использовать библиотеку клавиатуры с Arduino UNO даже после смены прошивки.
- GSM-модуль IOT-GA6 Arduino + ошибка CME 58
- Скетч мигания ESP8266 не мигает светодиодом
- Что такое скетч Arduino Uno по умолчанию?
- Как запрограммировать nodeMCU через OTA с помощью GPRS?
- Serial печатается дважды?
- Когда я включаю сервопривод, он вращается сам по себе, прежде чем перейти в нужное положение и начать скетч.
Что за драйверы?, @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