Проблемы создания кастомного сервопривода

Приветствую.
Собираю серпопривод из двигателя с редуктором от шуруповерта, потенциометра, драйвера двигателя (Pololulu 18v17), управляемого по двум пинам - PWM и DIR и выдающим сигнал обратной связи по току CS, и контроллера Arduino DUE.
На входе управления контроллера - стандартный ШИМ сигнал для сервомашинок (с частотой 50 Гц), на выходе (пины к драйверу двигателя - ШИМ, формируемый командой AnalogWrite(DIR, DWM).

DIR подключен к пину 11, PWM подключен к пину 9, сигнал от потенциометра подключен к пину A3, сигнал CS подключен к пину A1.

Для проверки работы написал следующий скетч (далее фрагмент непосредственно управления в loop() цикле):
if (RC3_pulseDuration > 1700) { // нажата кнопка на пульте, длительность импульса от радиоуправления больше 1700 мс
digitalWrite(DIR, PWM);
}
По задумке, когда кнопка на пульте нажата, привод должен вращаться с заданным напряжением, когда отпущена - остановиться.
В реальности, когда кнопка нажата, привод действительно начинает вращаться (а драйвер раздражающе гудеть). Но после этого отпущенная кнопка никак на продолжение не влияет! Привод продолжает вращаться до “сворачивания шеи” потенциометру. Кто-нибудь может подсказать, почему так происходит, и как это победить?

Ну, наверное, нужно некроманта нанять, чтобы поднять из могилы АСПушкина, который будет выключать ШИМ.

2 лайка

Здоровья вам!

Если Вы хотите получить вменяемый ответ, нужно (кто бы мог подумать!) задать вменяемый вопрос.
Необходимы:

  1. Скетч (полный - так, чтобы можно было у себя загрузить и откомпилировать).
  2. Схема (своя, а не похожая из Интернета. И словесное описание схему не заменяет).
  3. Внятное описание проблемы.

Внятное описание должно включать:

  1. Чего хочется добиться.
  2. Что происходит вместо этого.
  3. Чем 2 отличается от 1.

После дополнения условия при значении else явным указанием на изменение режима драйвера двигателя:
if (RC3_pulseDuration > 1700) {
analogWrite(PIN, PWM);
}
else {
analogWrite(PIN, 0);
}
при отпускании кнопки привод стал останавливаться, как и положено.

Отсюда следует вывод - пропускание блока выполнения при состоянии условия else, подразумевающее “ничего не делать” (в данном случае не слать PWM в драйвер двигателя), не останавливает этот запущенный ранее драйвер двигателя. Его надо тормозить принудительно.

вначале было:
if (RC3_pulseDuration > 1700) {
analogWrite(PIN, PWM);
}

1 лайк

:slight_smile:
В начале было Слово, и Слово было у Бога, и

Слово было Бог.

нет, в начале было

(для тех кто понимает, что тут написано)

Ерунда какая. PWM-генерацию не нужно поддерживать пинками.

Независимый хардварный генератор конфигурируется через указание значения duty. Задали 128 - он будет давать на ноге скважность 50% до момента отключения питания.

Верно, в первоначальном тексте была опечатка. К сожалению, здесь редактирование сообщения постфактум недоступно.

Речь идет о создании PID регулятора, управляющего двигателем для создания мощного сервопривода.
PWM понадобится изменять, постоянная скважность не годится.

Я об этом написал что ли?

неправда

у меня создается впечатление, что вы вообще не понимаете, ни слова в том, что пишете

Да, я не понимаю, чем запуск хардверного генератора через duty лучше AnalogWrite(), я много чего не понимаю, поэтому и пишу вопросы на форуме. Надеясь, что здесь не поляна троллей, а сообщество взаимопомощи и наставничества.

Может и ерунда. Только я описал реальное поведение устройства. Возможно, учтя его, другие сохранят механизм целым при отладке.

Оставь надежду, всяк сюда входящий (с)

2 . Форум - место общения по интересам. Эти интересы не имеют ничего общего с желанием помочь студентам делать курсовики. Если Вы хотите получить помощь, постарайтесь вести себя так, чтобы возникло желание Вам помочь.

Драйвер Pololulu имеет выходы CS, которые как я понимаю можно использовать для обратнгой связи по току. Но о пользе этого мало где написано. Отыскал из внятного только видео https://youtu.be/yFH8key-t_M и код к нему. Но там нет пояснения принципов и критериев подбора коэффициента обратной связи по току, в коде только три набора PID коэффициентов (для обратной связи по углу, скорости и по току) для ручного подбора.

Видимо обратная связь по CS полезна для задачи удержания скорости. Каждый мотор имеет свою зависимость потребляемого тока от частоты вращения при заданном напряжении. Тогда, зная эту зависимость и заложив ее в программу, имея на входе заданную частоту вращения, измеренную частоту по энкодеру, напряжение на выходе как осредненный ШИМ, и ток на моторе через обратную связь, можно определить добавочное напряжение, приводящее к достижению заданной частоты. Но для задачи удержания угла пользы от этой обратной связи я не вижу. Она есть?

Хм, как мне себя вести, чтобы у вас возникло желание мне помочь? Я себя неправильно веду?