Практика. Вращение двигателем с разной скоростью

Для генерации ШИМ в Arduino есть готовая функция analogWrite(pin, duty):

  • pin – PWM пин

  • duty – заполнение ШИМ сигнала (коэффициент D). По умолчанию имеет разрядность 8 бит, то есть принимает значение 0.. 255. То есть, D=35%, соответствует значение 90, 50%-128, 100%-255.

Напомним, что за вращение мотора у нас отвечали пины PA8 и PA9, что можно увидеть в описании DC драйвера. И пин PB3 необходимо перевести в режим HIGH.

#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 velocity = 0; // начальная скорость 0
HardwareTimer *timer = new HardwareTimer(TIM3);

void setup() {
 
  pinMode(PB3, OUTPUT); 
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(VREF, OUTPUT);
  pinMode(USR_BTN, INPUT_PULLUP);
 
  digitalWrite(SLEEPn, HIGH);
  digitalWrite(VREF, HIGH);
  analogWrite(IN1, 0);
  analogWrite(IN2, 0);

  prev_btnSt = digitalRead(USR_BTN);

  Serial.begin(115200);

  timer->pause();
  timer->setOverflow(100, HERTZ_FORMAT); //будем вызывать функцию вращения мотором с частотой 100 Гц
  timer->attachInterrupt(move);
  timer->refresh();
  timer->resume();

  delay(1000);
}

void loop() {
  buttonState = digitalRead(USR_BTN); //читаем состояние кнопки
  if(buttonState == LOW && prev_btnSt == HIGH){ //если кнопку нажали, а предыдущее состояние - не нажата
    forward = !forward;                        // меняем направление вращения мотора
    prev_btnSt = buttonState;                  // предыдущее состояние кнопки меняем на текущее
    analogWrite(IN1, 0);                      // на оба вывода подаем 0
    analogWrite(IN2, 0);
    delay(1);
  }
  if(buttonState == HIGH) {prev_btnSt = buttonState;}
  if (Serial.available() > 0) {
    velocity = Serial.readString().toInt();    // читаем значение скорости в Serial
  }
}

void move(){ // на оба вывода при нажатии кнопки подается 0, 
            // поэтому подаем аналоговый сигнал только на один вывод, 
            // в зависимости от направления вращения мотора
  if (forward == HIGH) {
      analogWrite(IN1, velocity); 
    }
  if (forward == LOW) {
    analogWrite(IN2, velocity);
  }
}

Last updated