Приветствую.
Собираю серпопривод из двигателя с редуктором от шуруповерта, потенциометра, драйвера двигателя (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);
}
По задумке, когда кнопка на пульте нажата, привод должен вращаться с заданным напряжением, когда отпущена - остановиться.
В реальности, когда кнопка нажата, привод действительно начинает вращаться (а драйвер раздражающе гудеть). Но после этого отпущенная кнопка никак на продолжение не влияет! Привод продолжает вращаться до “сворачивания шеи” потенциометру. Кто-нибудь может подсказать, почему так происходит, и как это победить?
После дополнения условия при значении else явным указанием на изменение режима драйвера двигателя:
if (RC3_pulseDuration > 1700) {
analogWrite(PIN, PWM);
}
else {
analogWrite(PIN, 0);
}
при отпускании кнопки привод стал останавливаться, как и положено.
Отсюда следует вывод - пропускание блока выполнения при состоянии условия else, подразумевающее “ничего не делать” (в данном случае не слать PWM в драйвер двигателя), не останавливает этот запущенный ранее драйвер двигателя. Его надо тормозить принудительно.
Ерунда какая. PWM-генерацию не нужно поддерживать пинками.
Независимый хардварный генератор конфигурируется через указание значения duty. Задали 128 - он будет давать на ноге скважность 50% до момента отключения питания.
Речь идет о создании PID регулятора, управляющего двигателем для создания мощного сервопривода.
PWM понадобится изменять, постоянная скважность не годится.
Да, я не понимаю, чем запуск хардверного генератора через duty лучше AnalogWrite(), я много чего не понимаю, поэтому и пишу вопросы на форуме. Надеясь, что здесь не поляна троллей, а сообщество взаимопомощи и наставничества.
2 . Форум - место общения по интересам. Эти интересы не имеют ничего общего с желанием помочь студентам делать курсовики. Если Вы хотите получить помощь, постарайтесь вести себя так, чтобы возникло желание Вам помочь.
Драйвер Pololulu имеет выходы CS, которые как я понимаю можно использовать для обратнгой связи по току. Но о пользе этого мало где написано. Отыскал из внятного только видео https://youtu.be/yFH8key-t_M и код к нему. Но там нет пояснения принципов и критериев подбора коэффициента обратной связи по току, в коде только три набора PID коэффициентов (для обратной связи по углу, скорости и по току) для ручного подбора.
Видимо обратная связь по CS полезна для задачи удержания скорости. Каждый мотор имеет свою зависимость потребляемого тока от частоты вращения при заданном напряжении. Тогда, зная эту зависимость и заложив ее в программу, имея на входе заданную частоту вращения, измеренную частоту по энкодеру, напряжение на выходе как осредненный ШИМ, и ток на моторе через обратную связь, можно определить добавочное напряжение, приводящее к достижению заданной частоты. Но для задачи удержания угла пользы от этой обратной связи я не вижу. Она есть?