Всем спасибо за помощь. Непросто было разобраться, но я как то смог. Всё работает отлично. Да. На радостях в первой версиях кода забыл о гистерезисе, сейчас всё сделал. Теперь у меня 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);
}