Управление электродвигателем
  • Введение
  • Аппаратная часть курса
  • Описание платы VBCore
  • Знакомство и работа с Raspberry PI
  • Коллекторный двигатель
    • Устройство коллекторного двигателя
    • Практика. VBCores
      • VBCore VB32G4
      • VB STM32 программатор
      • DC драйвер 15A
      • Arduino IDE
        • Установка ПО
        • Настройка Arduino IDE
      • Библиотека VBCoreG4
      • Практика. Мигание светодиодом с заданной частотой.
    • H-мост
    • Практика. Вращение двигателя
    • ШИМ
      • Практика. Вращение двигателем с разной скоростью
    • Шина CAN
      • Практика: Реализация обмена данными между VB32G4 и Raspberry PI по шине CAN
        • Настройка CAN на RPI
        • Работа с CAN FD на Ардуино
        • Работа с CAN FD через Python
        • Эхо-обмен данными между Rpi и VB32G4
    • Энкодеры
    • Практика: Считывание угла поворота вала двигателя
  • Page 1
Powered by GitBook
On this page
  1. Коллекторный двигатель

Практика. Вращение двигателя

PreviousH-мостNextШИМ

Last updated 6 months ago

Для того, чтобы вращать мотором, давайте посмотрим на схему DC драйвера.

Обратите внимание на правый верхний угол. Тут находится описание пинов драйвера Allegro A4955 для управления мотором.

Давайте теперь откроем к нему документацию и найдем в ней схему встроенного H-моста, а также таблицу, в которой указано какой сигнал и на какой пин подавать для вращения мотором вперед или назад.

На первой же странице дается схема драйвера

А на пятой странице таблица, из которой видно, что если мы хотим, чтобы мотор вращался вперед на пин IN1 нужно подать 1, а на пин IN2 0. В обратном режиме - наоборот. При этом пины SLEEPn и VREF всегда должны быть установлены в режиме HIGH.

Зная, что IN1, IN2, SLEEPn, VREF это PA8, PA9, PB3 и PA4 соответственно, давайте напишем небольшую программу на ардуино.

#include <VBCoreG4_arduino_system.h>


#define IN1 PA8
#define IN2 PA9
#define SLEEPn PB3
#define VREF PA4
#define USR_BTN PC13

int forward = HIGH; // по умолчанию - вращение вперед
int prev_btnSt;
int buttonState;
int is_stopped = LOW;

void setup() {
 
  pinMode(PB3, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(VREF, OUTPUT);
  pinMode(USR_BTN, INPUT_PULLUP);
 
 // пин SLEEPn устанавливаем в HIGH, IN1 и IN2 - LOW
  digitalWrite(SLEEPn, HIGH);
  digitalWrite(VREF, HIGH);
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  
// предыдущее состояние кнопки = считываем состояние кнопки во время инициализации
  prev_btnSt = digitalRead(USR_BTN);

  Serial.begin(115200);
  delay(1000);
}

void loop() {
//читаем состояние кнопки 
  buttonState = digitalRead(USR_BTN);
  
  // если она не была нажата, а сейчас ее нажали
  if(buttonState == LOW && prev_btnSt == HIGH){
  
  //то меняем направление вращения мотора
    forward = !forward;
    prev_btnSt = buttonState;
  }
  //если кнопка нажата, то присвоим предыдущему ее состоянию текущее
  if(buttonState == HIGH) {prev_btnSt = buttonState;}
  
  // если вращение мотора должно идти вперед
  if (forward == HIGH && is_stopped == LOW){
  
  //подаем HIGH на IN1
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  }

// иначе если вращение мотора должно быть в противоположную сторону
  else if (forward == LOW && is_stopped == LOW){
  
  // подаем HIGH на IN2
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  }
  
// если мотор необходимо остановить
  else{
  // на IN1 и на IN2 подается LOW
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, LOW);
  }
  
  // через сериал порт считываем команду на остановку мотора
  if (Serial.available() > 0) {
    is_stopped = Serial.readString().toInt();
    
  }
}

837KB
A4955-Datasheet.pdf
pdf