Подключаем драйвер мотора на чипе VNH2SP30 к Piranha Uno

Общие сведения:

Драйвер на базе чипа VNH2SP30 - используется для управления коллекторным мотором постоянного тока.

Спецификация:

  • Напряжение на входе питания мотора Vin: 5,5 ... 16 В;
  • Напряжение логики: 5 В;
    • Основан на чипе VNH2SP30;
    • Тип: Н-мост;
    • Ток нагрузки: до 6А без охлаждения, до 14А с охлаждением;
    • Максимальный импульсный ток до 30А;
    • Защита от обратного тока;
    • Возможность считывать ток нагрузи;
    • Рабочая температура от -40° до 150°;
    • Защита от перегрева;
    • ШИМ до 20 кГц;
    • Размеры, мм: 55,4х28,2х12 (без учёта колодки выводов)

    Подключение:

    Выводы ArduinoВыводы драйвераВыводы в примерахКомментарий
    любой аналоговый выводENА0состояние ключей AB
    любой аналоговый выводCSА1аналоговый выход значения тока
    любой выводINAА2управление ключом A
    любой выводINBА3управление ключом В
    любой вывод с ШИМPWM3управление ШИМ
    5V5V5V
    GNDGNDGND

    Подключение к Piranha UNO:

    Питание:

    Выходы драйвера работают только от внешнего источника питания 5,5 - 16 В, который должен подключаться к вводам питания Vin.

    Подробнее о драйвере:

    Драйвер построен на базе чипа VNH2SP30. что позволяет управлять скоростью движения, направлением подключённых двигателей, а так же считывать ток нагрузки при помощи функции analogRead();

    • Управление мотором постоянного тока осуществляется через выводы A2 (ключ А), A3 (ключ В) и 3 (ШИМ). В зависимости от состояния ключей мотор будет вращаться в ту или другую сторону. ШИМ контролирует скорость мотора.
    • Направление в функции motorGo() устанавливается подачей логических уровней на ключи A и В: A=LOW, B=HIGH - мотор вращается в одну сторону; A=HIGH, B=LOW - мотор вращается в другую сторону.
    • Скорость устанавливается подачей сигнала ШИМ, коэффициент заполнения которого, прямо пропорционален скорости.

    Примеры:

    Управление мотором:

    const uint8_t pwmpin = 3;     // определяем вывод для шим
    const uint8_t enpin = A0;     // определяем вывод состояния ключей AB. Ключи открываются, если притянуть к 0.
    const uint8_t cspin = A1;     // определяем вывод считывания тока
    const uint8_t inApin = A2;    // определяем вывод управления ключом A
    const uint8_t inBpin = A3;    // определяем вывод управления ключом В
    void setup() {
      Serial.begin(9600);
      pinMode(inApin, OUTPUT);    // переводим вывод управления ключом A в режим "выход"
      pinMode(inBpin, OUTPUT);    // переводим вывод управления ключом B в режим "выход"
      pinMode(pwmpin, OUTPUT);    // переводим вывод управления ШИМ в режим выход
      // устанавливаем вращение мотора в одну сторону:
      digitalWrite(inApin, HIGH); 
      digitalWrite(inBpin, LOW); 
      // приращиваем ШИМ от 0 до 255:
      for (int i = 0; i < 256; i++){
        analogWrite(pwmpin, i);   // мотор плавно стартует
        delay(20);
      }
      // уменьшаем ШИМ от 255 до 0:
      for (int i = 255; i >= 0; i--){
        analogWrite(pwmpin, i);   // мотор плавно останавливается
        delay(20);
      }
      analogWrite(pwmpin, 127);   // устанавливаем ШИМ в значение 50%
      // устанавливаем вращение мотора в другую сторону:
      digitalWrite(inApin, LOW);
      digitalWrite(inBpin, HIGH);
      pinMode(enpin, OUTPUT);     // переводим вывод состояния ключей в режим "выход"
      digitalWrite(enpin, LOW);   // запрещаем мотору вращаться
      delay(5000);                // на пять секунд
      pinMode(enpin, INPUT);      // разрешаем мотору вращаться, переводя вывод состояния ключей в режим "вход"
      delay(5000);                // мотор вращается пять секунд
      //выводим значение тока мотора в серийный порт:
      Serial.println(analogRead(cspin));
      delay(5000);                // мотор вращается ещё пять секунд
      //резко останавливаем мотор (мотор в режиме "тормоз"):
      digitalWrite(inApin, HIGH);
      digitalWrite(inBpin, HIGH);
      delay(10000);
      // плавно останавливаем мотор (мотор в режиме "отключен"):
      digitalWrite(inApin, LOW);
      digitalWrite(inBpin, LOW);
    }
    
    void loop() {
    //
    }

    Управление мотором с функциями motorGo() и motorOff():

    #define BRAKEVCC 0                  // определяем значение резкого тормоза
    #define CW   1                      // определяем значение вращения по часовой стрелке
    #define CCW  2                      // определяем значение вращения против часовой стрелки
    #define BRAKEGND 3                  // определяем значение остановки
    
    const uint8_t pwmpin = 3;     // определяем вывод для шим
    const uint8_t enpin = A0;     // определяем вывод состояния ключей AB. Ключи открываются, если притянуть к 0.
    const uint8_t cspin = A1;     // определяем вывод считывания тока
    const uint8_t inApin = A2;    // определяем вывод управления ключом A
    const uint8_t inBpin = A3;    // определяем вывод управления ключом В
    void setup()
    {
      Serial.begin(9600); 
      // переводим выводы управления в режим "выход"
        pinMode(inApin, OUTPUT);     // вывод ключа A
        pinMode(inBpin, OUTPUT);     // выводы ключа B
        pinMode(pwmpin, OUTPUT);     // вывод ШИМ
      // инициируем мотор выключенным
      motorOff();
    }
    
    void loop()
    {
      motorGo(CW, 32);                   // мотор по часовой стрелке, ШИМ 17,5%
      delay(3000);                       // ждём 3 секунды, моторы вращаются
      Serial.print(analogRead(cspin));   //считываем значение тока
      delay(3000);
    // переводим вывод состояния ключей мотора в режим "выход":
      pinMode(enpin, OUTPUT);
    // выключаем мотор:   
      digitalWrite(enpin, LOW);
    // на три секунды: 
      delay(3000);
    // включаем мотор, 
    // переводя вывод состояния ключей в режим "вход":             
      pinMode(enpin, INPUT); 
      delay(3000);   
      motorGo(BRAKEVCC, 32);            // останавливаем мотор в режим "тормоз"
      delay(10000);                     // ждём 10 секунд
      motorOff();                       // останавливаем мотор в режим "выключен"
      while(true);                      // скетч не выполняется дальше
    }
    
    // функция выключения мотора:
    void motorOff()            
    {
      digitalWrite(inApin, LOW);
      digitalWrite(inBpin, LOW);
      analogWrite(pwmpin, 0);
    }
    
    
    // функция включения мотора:
    void motorGo(uint8_t direct, uint8_t pwm)  
    {
    // если направление совпадает со значениями направлений:
        if (direct <=3)
        {
    // если направление мотора по часовой или плавный стоп,
    // устанавливаем соответствующие значения ключа А выбранного мотора:
        if (direct <=1)
          digitalWrite(inApin, HIGH);
        else
          digitalWrite(inApin, LOW);
    
    // если направление мотора по часовой или резкий стоп,
    // устанавливаем соответствующие значения ключа B выбранного мотора:
        if ((direct==0)||(direct==2))
          digitalWrite(inBpin, HIGH);
        else
          digitalWrite(inBpin, LOW);
    // устанавливаем ШИМ выбранного мотора
        analogWrite(pwmpin, pwm);    
      }
    }

    Описание функции motorGo():

    • Назначение: управление мотором;
    • Синтаксис: motorGo();
    • Параметры: направление (CW, CCW, BRAKEVCC, BRAKEGND), ШИМ (0-255);
    • Возвращаемые значения: void;
    • Примечание: направление может быть CW - по часовой стрелке, CCW - против часовой стрелки, BRAKEVCC - остановить мотор с блокировкой, BRAKEGND - остановить мотор без блокировки.
    • Пример:
    motorGo(CCW, 127); // включаем мотор, против часовой стрелки, скорость 50%

    Описание функции motorOff():

    • Назначение: остановка мотора
    • Синтаксис: motorOff();
    • Параметры: нет
    • Возвращаемые значения: void;
    • Примечание: функция так же выставляет значение ШИМ в ноль;
    • Пример:
    motorOff(); // выключаем мотор

    Применение:

    Ссылки:

    Обсуждение