Дергания бесщеточного мотора при управлении датчиком холла 49E

Всем спасибо за помощь. Непросто было разобраться, но я как то смог. Всё работает отлично. Да. На радостях в первой версиях кода забыл о гистерезисе, сейчас всё сделал. Теперь у меня 3 скорости. Есть пороги переключений. Еще может добавлю чуть более плавное переключение скоростей, потому что с1 на 2 чувствуется сильный толчок, а вот с 2 на 3 его совсем не заметно так как уже мотор достаточно раскручен (нудить физикой не хочу =) . Вот полностью рабочий код для тех кто хочет управлять мотором 140KV со сборкой 4s li-ion с помощью датчика холла E49 с блоком ESC (BLHELI, ZMR и другими подобными) на arduino хоть на китайской. В моём случае LGT8F328P. Ход датчика управления 1,9 мм. Магнит извините, не помню, но сами можете подобрать. У меня с какого то CD rom.

#include <Servo.h>

Servo motor;

// Пороговые значения для скоростей
const int lowSpeedLowerBound = 620;   // Нижняя граница для первой скорости
const int lowSpeedUpperBound = 629;   // Верхняя граница для первой скорости
const int midSpeedLowerBound = 633;   // Нижняя граница для второй скорости
const int midSpeedUpperBound = 650;   // Верхняя граница для второй скорости
const int highSpeedLowerBound = 655;  // Нижняя граница для третьей скорости
const int highSpeedUpperBound = 680;  // Верхняя граница для третьей скорости

int currentSpeed = 0;
bool midSpeedActive = false; // Флаг для отслеживания состояния второй скорости

void setup() {
  motor.attach(2);
  Serial.begin(9600);

  // Инициализация ESC
  motor.writeMicroseconds(2000); // Максимальное значение
  delay(2000); // Подождите 2 секунды
  motor.writeMicroseconds(1000); // Минимальное значение
  delay(2000); // Подождите 2 секунды
}

void regulateSpeed(int sensorValue) {
  // Логика переключения скоростей
  if (sensorValue < lowSpeedLowerBound) {
    currentSpeed = 0; // Остановка
    midSpeedActive = false; // Сброс флага
  } 
  else if (sensorValue >= lowSpeedLowerBound && sensorValue <= lowSpeedUpperBound) {
    currentSpeed = 1500; // Первая скорость
    midSpeedActive = false; // Сброс флага
  } 
  else if (sensorValue >= midSpeedLowerBound && sensorValue <= midSpeedUpperBound) {
    if (!midSpeedActive) {
      currentSpeed = 1750; // Вторая скорость
      midSpeedActive = true; // Устанавливаем флаг
    }
  } 
  else if (sensorValue >= highSpeedLowerBound && sensorValue <= highSpeedUpperBound) {
    currentSpeed = 1900; // Третья скорость
    midSpeedActive = false; // Сброс флага
  }

  // Проверяем, если вторая скорость активна, и значение падает ниже 626
  if (midSpeedActive && sensorValue <= 626) {
    currentSpeed = 1500; // Возвращаемся к первой скорости
    midSpeedActive = false; // Сброс флага
  }
}

void debug(int sensorValue) {
  Serial.print("Analog Value: ");
  Serial.print(sensorValue);
  Serial.print(" Current Speed: ");
  Serial.println(currentSpeed);
}

void loop() {
  int sensorValue = analogRead(A0);
  regulateSpeed(sensorValue);
  motor.writeMicroseconds(currentSpeed);
  debug(sensorValue);
  delay(100);
}