Управление корректором фар по шине LIN

Шина LIN это не только сбор данных с датчиков и блоков переключателей, но и управление исполнительными механизмами. В этой статье мы рассмотрим управление приводами корректора фар автомобиля KIA Ceed JD, которое осуществляется по шине LIN. В конце статьи обязательно посмотрите видео!

Для эксперимента нам была предоставлена дорогим подписчиком Павлом с Drive2 начинка фары автомобиля, представляющая собой линзу с двумя сервоприводами.  Павел может помочь Вам достать любые запчасти для КИА, рекомендуем.

Сервоприводами фары управляет система AFLS, которая получает по шине CAN данные угла поворота руля и  скорость автомобиля, а по аналоговым каналам приходит информация с датчиков высоты кузова.

На схеме мы можем видеть что обе фары управляются по одному проводу шины LIN. В общей сумме к шине подключено четыре сервопривода. Два для коррекции по горизонтали и два по вертикали.

Разобранный блок управления системы AFLS выглядит так:

Черный провод — Масса, Красный — зажигание +12 В, Зеленый — шина LIN. Так же на плате можно увидеть драйвер и синфазный фильтр CAN шины.

Собрав на столе схему: Блок управления AFLS + фара+источник питания мы ожидали какой-нибудь реакции приводов линзы, но увы ничего не происходило, Поэтому было решено разобрать один из приводов и выяснить какой контроллер там стоит.

Сервопривод

Разобрав сервопривод мы обнаружили там контроллер AMIS-30621

AMIS-30621 это серийный контроллер шаговых моторов управляемый и конфигурируемый по шине LIN. Найти документацию труда не составило.

Скорость работы LIN составила 19200 бод, тип контрольной суммы Enhaced.

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

Итак, для того чтобы мотор зашевелился необходимо спросить его статус, задать начальные параметры мотора и дать команду на движение до заданной позиции. Для решения этой задачи разберемся с механизмом отправки команд по шине LIN.

Мастер (блок управления AFLS) отправляет команду в формате полного пакета, т.е. и ID и тело пакета (Response) передаются мастером:

0x3C  xx xx xx xx xx xx xx xx, где xx данные команды

Затем Master посылает Master-запрос или просто один ID =0x7D и ожидает ответ от Slave.

0x7D  xx xx xx xx xx xx xx xx,  где  xx данные ответа отправляемы SLAVE узлом.

Обратите внимание, что в документацию на шину LIN и драйвер ID ответа будет указан как 3D а не 7D, поскольку в документации указывается ID без рассчитанных битов защиты.

Теперь обратимся к содержимому команд.

Команда GetFullStatus

Как мы видим для конфигурирования каждого мотора необходимо обращаться по определенному адресу — третий байт пакета, как же мы его узнаем? Адрес мотора задается уровнями на пинах микросхемы AMIS-30621: HW0, HW1 и HW2 непосредственно на плате драйвера, но для того чтобы до них добраться необходимо разобрать фару, линзу и корпус драйвера. Попробуем этого избежать и подключим анализатор LIN к связке AFLS+привод к которым подведено питание и они соединены каналом шины LIN. Получив стартовый лог мы увидим по каким адресам проходят команды

Мы видим что мастер отправляет команды по четырем адресам 0x80, 0x90, 0xA0 и 0xB0.  Таким образом отправив команду  GetFullStatus  с каждым адресом по очереди, мы определим адрес привода к которому мы подключились.

Для реализации протокола обмена мы доработали программу LIN-LAB  добавив функцию автоматической отправки запроса 0x7D после команды 0x3C

Сформируем команду GetFullStatus для сервопривода имеющего адрес 0xB0,  установим флаг Send master request 0x3D (0x7D) after 0x3X  . Отправив эту команду мы получим ответ сервопривода.

 

Теперь следуя логике инициализации мотора после нам необходимо подать команду задания начальных параметров мотора, мы так же найдем ее в логе среди команд посылаемых блоком управления. Эта команда имеет код  0x09 но следуя документации мы должны установить старший бит байта команды в 1, таким образом код команды примет вид 0x89 и в логе нам нужно искать ее

Подсмотрим необходимые параметры в логе обмена между блоком управления AFLS и фарой:

Установка параметров мотора:

3C  8   80 89 80 D6 68 03 00 AE 84    CRC= 84     горизонт   1

3C  8   80 89 90 D6 68 03 00 AE 74    CRC= 74     горизонт   2

3C  8   80 89 A0 D6 48 04 00 AE 83    CRC= 83    вертикаль 1

3C  8   80 89 B0 D6 48 04 00 AE 73    CRC= 73    вертикаль 2

Обращаем внимание на то, что моторы вертикального и горизонтального приводов получают разные начальные параметры, но для упрощения эксперимента мы будем использовать одинаковую инициализацию для вертикали и горизонтали.

Мотор проинициализирован, теперь можно подавать команды на движение. Попробуем сформировать команду сами следуя документации.

Команда SetPosition

Обратите внимание что желаемая позиция мотора задается 16 битным значением –двумя байтами. Кроме того эта команда позволяет управлять одновременно двумя моторами.В логе мы можем найти эту команду передаваемую блоком AFLS:

 3C  8   80 8B 80 00 00 90 00 00 E2     CRC= E2   горизонт обеих фар в 0x0000

3C  8   80 8B A0 00 00 B0 00 00 A2   CRC= A2   вертикаль обеих фар в 0x0000

Мы видим что передается команда одновременно на два мотора, сначала на горизонтальные с адресами 0x80 и 0x90, а затем на вертикальные с адресами 0xA0 и 0xB0.

Поскольку у нас на столе была одна фара мы изменили команду таким образом

3C  8   80 8B B0 05 FF 00 00 00

При помощи этой команды мы даем команду мотору с адресом 0xB0 повернуть вал на позицию 05 FF, и после отправки шток привода действительно начал движение. Но, возникает следующая проблема: После достижения заданной позиции шток возвращается в исходное положение. Для того чтобы этого не происходило необходимо постоянно обмениваться данными с драйвером мотора, иначе он считает, что работа завершена и пора возвращаться на исходную позицию. Для поддержания связи можно использовать передачу запроса 0x7D с периодом 1 секунда. В таком случае мотор не будет возвращаться в исходное состояние.

Для отправки большого числа разных пакетов мы так же доработали программу.

В левой части мы задаем запрос 0x7D передающийся с периодом 1сек для поддержания связи. Теперь имея удобный механизм работы с большим количеством пакетов попробуем работать одновременно с двумя приводами линзы, для этого:

  • -Запустим процесс поддержания связи посылая запрос 0x7D c периодом 1сек. Отправка именно этого запроса позволит нам убить двух зайцев—поддержание связи и отсутствие необходимости отправки запроса 0x7D после команд GetFullStatus
  • — Проинициализируем оба мотора, зададим их начальные параметры последовательно передав команды:
  1. 3C  8  80 81 90 00 00 00 00 00   -запрос GetFullStatus мотора 0x90 горизонтального привода
  2. 3C 8 80 81 B0 00 00 00 00 00  -запрос  GetFullStatus  мотора 0xB0 вертикального привода
  3. 3C 8 80 89 90 D6 48 04 00 AE  -Команда SetMotorParam для мотора 0x90
  4. 3C 8 80 89 B0 D6 48 04 00 AE  -Команда SetMotorParam для мотора 0xB0

Обратите внимание на то, что мотор на запрос GetFullStatus отвечает ДВУМЯ пакетами!   Т.е. если эти данные для нас важны, то после отправки GetFullStatus необходимо отправить 7D два раза. Если же мы отправляем GetFullStatus только для запуска мотора, то достаточно одного раза.

Теперь можно подавать команду на движение:

3C  8   80 8B 90 05 FF B0 05 FF

Эта команда приводит в движение штоки горизонтального и вертикального приводов нашей фары до позиции 0x05FF.

Таким весьма нетривиальным способом можно управлять не только приводами фар но и другими, например приводами заслонок печек.  Описанную методику мы опробовали и на живом автомобиле, как это происходило смотрите видео и качайте новую версию  LIN-Lab.

Материалы:
Версия программы LIN-Lab используемая в этой статье — ссылка

Документация на драйвер AMIS-30621 — ссылка

Видео