Драйвер двигателей и сервопривод, взаимное влияние
- Войдите на сайт для отправки комментариев
Столкнулся с проблемой, которой ранее не наблюдал при подобных схемных решениях.
К драйверу DRV8835 подключены два коллекторных двигателя, управление с Ардуино через d4 и d5, к d6 подключен сервопривод типа SG90. К выводам каждого двигателя припаян керамический конденсатор 0,1мкФ. Питание драйвера, Ардуино и серво от одного стабилизатора 5в (U1), питание двигателей от другого (U3).
При подаче ШИМ на d5 серво начинает дергаться, при этом двигатели резко меняют направление движения и скорость. Через несколько секунд серво прекращает дергаться и двигатели приходят в норму - вращаются с заданной скоростью в заданном направлении. Потом опять.
Если серво отключить, выдернув его из разъема на плате, то двигатели ведут себя нормально.
Лечил установкой емкостей 0,1 между выводами двигателей и корпусом, между d6 и землей - изменений нет.
Помогла установка резисторов в цепи подключения двигателей - R25, R26 на схеме. Сначала поставил 22 Ом, проблема ушла. Через какое-то время снова всё дергается, увеличил сопротивления до 39 Ом - проблема ушла, но снова вернулась )) Поставил 47 Ом, пока работает... Но не пойму природу явления и как с ним бороться, что-то я может не то делаю.
Кто сталкивался с подобным, что скажите?
Серва через что крутится?
Навскидку: D5 и D6 - один таймер (#0). Для эксперимента можно перекинуть PWM драйвера мотора на D11/D3 (timer #2).
Используется стандартная библиотека серво, пробовал и библ-ку серво 2 и совсем без библиотек управлять, то же самое.
Серва через что крутится?
Навскидку: D5 и D6 - один таймер (#0). Для эксперимента можно перекинуть PWM драйвера мотора на D11/D3 (timer #2).
d3 используется под софт сериал, d11 на SPI, не могу их задействовать
А, ну где софтсериал, там жди подставы от Servo.h.
Крутите сервы вручную, без таймеров в библиотеках.
А, ну где софтсериал, там жди подставы от Servo.h.
Крутите сервы вручную, без таймеров в библиотеках.
Пробовал без библиотек, вид в профиль тот же.
d3 используется под софт сериал, d11 на SPI, не могу их задействовать
вы хотя бы ради проверки попробуйте - на время откажитесь от сериала и СПИ. как проверите - тогда будете думать
d3 используется под софт сериал, d11 на SPI, не могу их задействовать
вы хотя бы ради проверки попробуйте - на время откажитесь от сериала и СПИ. как проверите - тогда будете думать
от SPI не могу, через него команды подаются (nRF24).
Сейчас попробую в скетче отключить софт сериал.
Пробовал без библиотек, вид в профиль тот же.
...каким образом?
Пробовал без библиотек, вид в профиль тот же.
...каким образом?
Как то так
Сейчас поставил R25 47 Ом, R26 56 Ом.
Отключил софт сериал в скетче, управляю серво без библиотеки, как указал в посте выше. Вроде работает, но так уже было - работало, работало и потом начало дергаться.
Хотелось бы понять причину, что на что влияет. Дело в серве, как я думаю, ибо при ее физическом удалении, проблем не возникает.
В принципе верно. Но, если есть аттаченные обработчики прерываний, то они будут соваться в delayMicroseconds() и выдержка будет неточной
Есть ещё одна гипотеза - проблема с питанием. Смотрю, что с каждым постом всё больше потребителей появляется - проверьте, нет ли просадки на U1.
Проверить - в серве ли дело очень просто: один короткий скетч, который крутит серву туда-сюда и включает PWM на D5.
Погонял двигатели несколько минут, было норм, а потом на максимальном ШИМ опять серво задергалось.
U1 - 5В, 1А. Тут тока с запасом, столько потребителей нет. Nano+драйвер+серво.
Когда кручу серво, проблемы нет, она крутится и двигатели работают. Проблема в хаотично возникающем самопроизвольном её подергивании, причину которого не пойму.
Самое действенное - подсесть осциллографом на сервопин. Если там всё чисто, а серва дёргается - проблема в ней. Мошт там позиционирующий резистор при тряске мотором начинает контактом шуметь.
Самое действенное - подсесть осциллографом на сервопин. Если там всё чисто, а серва дёргается - проблема в ней. Мошт там позиционирующий резистор при тряске мотором начинает контактом шуметь.
Дело хорошее, только осцилла нет.
Сервы менял. Штатная установлена в корпус между двигателями, в глубокой теории можно предположить влияние близко расположенных двигателей на неё. Но, подключал другие серво, располагал их далеко от двигателей. Всё равно дёргаются.
А если серву переписать на аппаратный таймер, который независит отпрограммы и прерываний? Запрограмировать первый таймер на 20 мс и шим 50 процентов и к выходу серву? Что будет?
А если серву переписать на аппаратный таймер, который независит отпрограммы и прерываний? Запрограмировать первый таймер на 20 мс и шим 50 процентов и к выходу серву? Что будет?
Не совсем понял всю глубину вашей мысли )) Можно попроще и на пальцах ?)
Железный таймер предлагает перестроить так, чтобы он давал каждые 20мс пульс ногой на заданное кол-во микросекунд.
Перекинул серво на А2, погонял двигатели, пока нормально. Посмотрим что будет завтра )
Заодно установил на плате монитор питания типа INA219 и поправил скетч под него.
Что заметил - сама схема без нагрузок (серво, двигатели, светодиоды) потребляет 50мА, при уровне ШИМ на двигатели 150, потребление составляет 260мА (это с двумя двигателими), при уровне ШИМ 200 - потребление 230мА, при уровне ШИМ 250 - потребление 190мА.
Странно как-то.
Уменьшил сопротивление в цепи двигателей до 33 Ом, погонял, проблема ушла. Надеюсь, совсем.
Всё равно хотелось бы понять природу взаимного влияния d6 на d5 и d4. Может, когда-нибудь узнаю.