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

Приветствую.
Собираю серпопривод из двигателя с редуктором от шуруповерта, потенциометра, драйвера двигателя (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);
}
По задумке, когда кнопка на пульте нажата, привод должен вращаться с заданным напряжением, когда отпущена - остановиться.
В реальности, когда кнопка нажата, привод действительно начинает вращаться (а драйвер раздражающе гудеть). Но после этого отпущенная кнопка никак на продолжение не влияет! Привод продолжает вращаться до “сворачивания шеи” потенциометру. Кто-нибудь может подсказать, почему так происходит, и как это победить?

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

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

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

  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);
}

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

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

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

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

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

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

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

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

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

неправда

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

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

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

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

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

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

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

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