Attach() сбрасывает угол сервопривода

Я работаю над кодом, который будет управлять микросервоприводом. Я использую универсальный сервопривод и встроенную библиотеку для управления сервоприводом. Микроконтроллер — универсальный STM32. Управление сервоприводом работает как положено. Но мне не нужно следующее поведение - функция attach() устанавливает сервопривод на 180° (может быть, 0°, не уверен). В моем проекте я хочу следующее:

  • Сервопривод остается под углом перед выключением/перезагрузкой.
  • Сервопривод поворачивается на 90° после включения/перезагрузки.

Я погуглил об этой проблеме и попробовал использовать write(90); перед attach() в функции setup(). Сервопривод достигает 90°, но примерно через 50 мс attach() останавливает функцию write(90) и возвращается к 180°. Так что это не решило мою проблему. Затем я открыл Servo.cpp и обнаружил, что функция attach() содержит следующий код:

    bool Servo::attach(uint8 pin,
                   uint16 minPW,
                   uint16 maxPW,
                   int16 minAngle,
                   int16 maxAngle) {
    timer_dev *tdev = PIN_MAP[pin].timer_device;

    if (tdev == NULL) {
        // не сбрасываем никакие поля или ASSERT(0), чтобы продолжать управлять любыми
        // ранее присоединенный() сервопривод.
        return false;
    }

    if (this->attached()) {
        this->detach();
    }

    this->pin = pin;
    this->minPW = minPW;
    this->maxPW = maxPW;
    this->minAngle = minAngle;
    this->maxAngle = maxAngle;

    pinMode(pin, PWM);

    timer_pause(tdev);
    timer_set_prescaler(tdev, SERVO_PRESCALER - 1); // прескалер отсчитывается от 1
    timer_set_reload(tdev, SERVO_OVERFLOW);
    timer_generate_update(tdev);
    timer_resume(tdev);

    return true;
}

Что мне следует сделать, чтобы решить эту проблему? Сервопривод будет регулировать угол печатной платы, на которой закреплены светодиоды. Плата будет в корпусе, а угол 90° является углом по умолчанию. 0°/180° приведет к выходу из строя сервопривода или корпуса тормоза/платы/чего-то еще.

, 👍0

Обсуждение

Если существуют ограничения на углы, которые он может перемещать, я думаю, вам нужно посмотреть на minAngle и maxAngle., @Gerben

Вы показали нам код ядра библиотеки Servo. ИЗВЕСТНО, что этот код работает. Это работает для всех остальных. Скорее всего ошибка в написанном вами коде, который вы нам не показали. Если вам действительно нужна помощь, опубликуйте код, с которым у вас возникли проблемы. Невозможно помочь вам исправить код, который я не вижу., @Delta_G

@Delta_G Извините за задержку с ответом. HLServo.attach(PA8) находится в функции setup(). Сразу после перезагрузки сервопривод переходит в нейтральный угол. Думаю, проблема кроется в сервобиблиотеке. Я попробую с параметрами минимального и максимального угла., @Pararera

Вы по-прежнему не показываете код, с которым у вас возникли проблемы. Это все равно, что прийти к механику и спросить, что не так с вашей машиной, и не взять ее с собой. Или попросить врача рассказать вам, что случилось с вашим другом, которого вы не взяли с собой. Невозможно диагностировать то, чего мы не видим. Если вы не можете опубликовать имеющийся у вас код, который, по вашим словам, не работает, то никто ничем не сможет вам помочь. Отредактируйте свое сообщение и удалите код Servo.cpp. У всех нас уже есть этот код. Вместо этого вставьте код, который у вас есть, но который не работает., @Delta_G


1 ответ


1

Вы можете избежать использования метода attach();, программируя без сервобиблиотеки.

  for(x=0; x<150; x=x+1)
  {
    digitalWrite(Servomotor, HIGH);
    delayMicroseconds(2350); //Измените здесь задержку, чтобы изменить угол, на который она движется
    digitalWrite(Servomotor, LOW);
    delayMicroseconds(18550);
  }

Это пример кода, показывающий, как это сработало у меня. Он посылает импульс сервоприводу, который заставляет его немного повернуться, пока не достигнет «барьера».

,