Синхронизация двигателей

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем Flutter, 5 май 2015.

  1. Flutter

    Flutter Нуб

    Здравствуйте. У меня стандартная платформа для робота-автомобиля, управляемая двумя моторами, через драйвер L298.

    Беда в том, что моторы вращаются с разной скоростью, и никак не удаётся заставить ехать робота прямо. С помощью ШИМ удалось подобрать коэффициент, чтобы он ехал более-менее ровно, но всё равно движение робота достаточно непредсказуемо.

    Думаю, что это задача весьма стандартная и наверняка многие её как-то решали.

    Буду благодарен, если поделитесь своим опытом.
     
  2. XCB

    XCB Гик

    наверно самое правильное решение - установка энкодеров, на многие платформы такая установка предусмотрена.
     
  3. vvr

    vvr Инженерище

    все моторы и редукторы разные, поэтому без синхронизации и установки следящей системы всегда будет уводить в сторону.
    или энкодеры или один мотор на движение, другой на руление...
     
  4. Flutter

    Flutter Нуб

    Приделал к моторам энкодеры (диски такие с дырочками). Теперь думаю как интерпретировать их показания, чтобы ровно рулить? Есть какие-то готовые решения?
     
  5. geher

    geher Гуру

    Я как-то искал готовое. Ничего не нашел.
     
  6. Unixon

    Unixon Оракул Модератор

    Считать и корректировать скорость вращения. Задаете разным двигателям одинаковую скорость, измеряете интервалы времени между импульсами каждого отдельного энкодера, отношение между интервалами времени с разных энкодеров дает поправочный коэффициент на задаваемую скорость. Ждете пока относительная погрешность не свалится под порог. Пишете автоматический тест. Калибруетесь сначала в холостом режиме, потом под нагрузкой. Снимаете показания для каждого значения скважности ШИМ, потом аппроксимируете эту зависимость какой-нибудь функцией.
     
  7. acos

    acos Официальный гик Администратор

    Если без энкодеров, то один из самых простых способов которые я видел, такой:
    Берем потенциометр, выставляем его на середину и подключаем к аналоговому входу. Потом выставляем скорость на максимум, в коде пишем, чтобы значение с потенциометра отнималось от скорости одного из моторов, смотря в какую сторону повернуть крутилку. Ну и запускаем платформу. вращением потенциометра добиваемся, чтобы платформа ехала прямо. Более бустрый мотор должен стать медленнее, а медленный - на максимуме. Делим значение шим, что получилось при уравнивании быстрого мотора на 255 (шим медленного мотора), получаем коэффициент. Потом желаемую скорость быстрого мотора всегда домножаем на этот коэффициент и все. Коэффициент можно в EEPROM хранить. Примерно так мы сделали в коде катера, только вместо потенциометра кнопки стрелы использовали
    http://wiki.amperka.ru/projects:bottleboat
     
  8. Flutter

    Flutter Нуб

    Заметил, что скорость моторов меняется от времени работы (и от заряда батарей), так что в функцию аппроксимировать наверно не получится. Попробую сделать подбор скорости на ходу, если что-нибудь выйдет из этого.
     
  9. geher

    geher Гуру

    А еще частенько бывает, что различается не столько скорость моторов на марше, сколько переходные процессы при запуске и остановке. В результате при постоянной скорости тележка едет в основном почти прямо, а при старте, остановке или значительном изменении скорости ее немного разворачивает.
    Так что, действительно, функция может и не помочь.
    Надо постоянно следить за разницей в показаниях энкодеров и корректировать скорости моторов. Причем если тупо реагировать на каждое отклонение в один-два импульса, то тележка поедет зигзагами.
    А еще надо как-то обрабатывать "правильные" повороты, обусловленные командой оператора или алгоритмом движения, когда разница в количестве импульсов обоснована и должна быть в определенных пределах, определяемых характеристиками желаемого поворота.
     
  10. SerhioRamos

    SerhioRamos Нуб

    А может можно поставить компас и при изменении градуса поворота - изменять скорость вращения соответствующего двигателя?
    Я думаю сейчас решать этот же самый вопрос..
     
  11. Unixon

    Unixon Оракул Модератор

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

    Unixon Оракул Модератор

    Ну понятно, что в идеале там будет что-то типа ПИД-регулятора, обновляющего свое состояние после каждого импульса энкодера, но начать можно и с чего-то попроще.
     
  13. altex

    altex Гик

  14. Flutter

    Flutter Нуб

    Тоже была такая мысль, но выяснилось, что компас, особенно на ходу, даёт довольно большую погрешность.
     
  15. Flutter

    Flutter Нуб

    Написал функцию подбора коэффициента по показаниям энкодеров, но работает всё равно нестабильно. На этапе разгона успевает градусов на 20 повернуть, а ещё коэффициент достаточно сильно меняется по времени (может быть подсевшие аккумуляторы виноваты, заряжу перепроверю).