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° приведет к выходу из строя сервопривода или корпуса тормоза/платы/чего-то еще.
@Pararera, 👍0
Обсуждение1 ответ
Вы можете избежать использования метода attach();
, программируя без сервобиблиотеки.
for(x=0; x<150; x=x+1)
{
digitalWrite(Servomotor, HIGH);
delayMicroseconds(2350); //Измените здесь задержку, чтобы изменить угол, на который она движется
digitalWrite(Servomotor, LOW);
delayMicroseconds(18550);
}
Это пример кода, показывающий, как это сработало у меня. Он посылает импульс сервоприводу, который заставляет его немного повернуться, пока не достигнет «барьера».
- Проблемы с пониманием минимальных и максимальных параметров серводвигателя
- Как Arduino Uno может поддерживать до 12 сервоприводов, если у него всего 6 цифровых выводов ШИМ?
- Управление сервоприводом без библиотеки сервоприводов
- Как изменить скорость нескольких сервоприводов, работающих одновременно с модулем PCA9685?
- Контакты ШИМ серводвигателей, Arduino Uno
- Управление сервоприводом с помощью ATtiny13A
- Проектирование роботизированной руки с помощью Arduino Uno
- Использование Servo на Timer3 на Leonardo
Если существуют ограничения на углы, которые он может перемещать, я думаю, вам нужно посмотреть на minAngle и maxAngle., @Gerben
Вы показали нам код ядра библиотеки Servo. ИЗВЕСТНО, что этот код работает. Это работает для всех остальных. Скорее всего ошибка в написанном вами коде, который вы нам не показали. Если вам действительно нужна помощь, опубликуйте код, с которым у вас возникли проблемы. Невозможно помочь вам исправить код, который я не вижу., @Delta_G
@Delta_G Извините за задержку с ответом.
HLServo.attach(PA8)
находится в функцииsetup()
. Сразу после перезагрузки сервопривод переходит в нейтральный угол. Думаю, проблема кроется в сервобиблиотеке. Я попробую с параметрами минимального и максимального угла., @ParareraВы по-прежнему не показываете код, с которым у вас возникли проблемы. Это все равно, что прийти к механику и спросить, что не так с вашей машиной, и не взять ее с собой. Или попросить врача рассказать вам, что случилось с вашим другом, которого вы не взяли с собой. Невозможно диагностировать то, чего мы не видим. Если вы не можете опубликовать имеющийся у вас код, который, по вашим словам, не работает, то никто ничем не сможет вам помочь. Отредактируйте свое сообщение и удалите код Servo.cpp. У всех нас уже есть этот код. Вместо этого вставьте код, который у вас есть, но который не работает., @Delta_G