Для генерации ШИМ в 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);
}
}