Переменная скорость разгона для двигателей, управляемых джойстиком

arduino-mega motor joystick

Я пытаюсь создать фрагмент кода, который будет увеличивать скорость двигателей до изменяющегося значения, управляемого джойстиком. Например, джойстик запрашивает скорость двигателей 120, поэтому вместо перехода от 0 до 120 он переходит на 0, 10, 20…. 120. Но максимальное значение будет постоянно меняться в диапазоне от 0 до 130, поэтому его необходимо каждый раз увеличивать. Это фрагмент моего кода для запуска двигателей в прямом направлении.

{
  motorControl = analogRead(joystick);
  motorControl = motorControl / 4;
  if(motorControl > 129)

{

    digitalWrite(pwm2, 0);
    digitalWrite(pwm3, 0);
    speedI = (motorControl - 130);
    speedFadeI = 
    Serial.println(speedFadeI-130);
    analogWrite(pwm1, (speedFadeI - 130));
    analogWrite(pwm4, (speedFadeI - 130));

спасибо всем, у кого есть идеи

, 👍1

Обсуждение

у вас есть вопрос?, @jsotola


1 ответ


Лучший ответ:

0

Я предполагаю, что из 0, 10, 20…. 120, для которой требуется линейное изменение скорости до желаемой. Это можно сделать очень легко, если ваши требования не слишком высоки.

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

#define INTERVAL        100
#define ACCELERATION    51
int current_speed = 0;

Я выбрал интервал 100 мс и значение ускорения, чтобы оно увеличивалось от 0 до 255 (полная скорость) за 5 с (что дает 51 значение ШИМ в секунду). Теперь в функции voidloop() мы используем оператор if с функцией millis(), чтобы запускать обновление скорости через регулярные промежутки времени. Чтобы это работало, нам нужна переменная (здесь глобальная), содержащая метку времени. (Если вы не знакомы с этой техникой, вы можете увидеть ее в примере BlinkWithoutDelay, который поставляется с Arduino IDE, и в Интернете есть множество учебных пособий)

Внутри оператора if мы пишем второй оператор if. Он проверяет, находится ли текущая скорость выше или ниже заданного значения, заданного джойстиком. Если оно выше, мы вычтем один шаг скорости (рассчитывается по ускорению и интервалу и делится на 1000, поскольку для интервала мы использовали миллисекунды, а не секунды), если оно ниже, мы добавим один шаг скорости.

unsigned long timestamp = 0;

void loop(){
    int setpoint = analogRead(joystick)/4;
    if(millis() - timestamp > INTERVAL){
        if(current_speed > setpoint){
            current_speed -= ACCELERATION*INTERVAL/1000;
        } else {
            current_speed += ACCELERATION*INTERVAL/1000;
        }
        if(current_speed > 255) current_speed = 255;
        else if(current_speed < 0) current_speed = 0;
        analogWrite(pwm1, current_speed);
        timestamp += INTERVAL;
    }

Я также добавил операторы if, чтобы ограничить текущую скорость от 0 до 255. В противном случае значение переполнится при записи в соответствующий 8-битный регистр таймера функцией analogWrite().< /п>

Конечно, у этого метода есть и недостатки. Вам нужно будет найти подходящую комбинацию значений ACCELERATION и INTERVAL, потому что, когда текущая скорость достигнет заданного значения, она будет колебаться вокруг этого значения. Лучший способ — установить необходимый вам УСКОРЕНИЕ и на основе этого выбрать подходящий интервал.

Есть и другие способы запрограммировать это, но мне нравится этот способ, потому что он очень простой.

,