Поиск

PMS007c2


Вожусь с этим контроллером ШД. Довольно занятная штука. Очень грамотно сделано (надо бы вскрыть, посмотреть, что за микросхема-драйвер используется): двигатель при удержании вообще примерно комнатной температуры, да и сам контроллер не раскаляется, как некоторые!..
Правда, с протоколом пришлось помучиться. Благо, народ на форумах навел на путь истинный.

Вот такой мини-стенд я собрал дома для работы с железякой:

В принципе, второй подтягивающий резистор на 120Ом не очень-то нужен, я его вчера засунул, пока разбирался, что за проблема у меня на 250кбод (оказалось все банально: в CAN-сниффере я забыл вычитать единичку из значения регистра тайминга, поэтому получилось, что МК был настроен на 260кбод, вот и лезло огромное количество ошибок).
Часть настроек контроллера хранятся во флеш-памяти, только нужно не забывать их туда сохранить командой 0x2f 7 0x20 0 2 0 0 0. Т.к. работаем с SDO-параметрами, пишем на 0x600+ID, читаем с 0x580+Id. Еще читаем аварийные сообщения с 0x80+Id. Также я обратил внимание на то, что при включении контроллера на COB-ID 0x181 приходит посылка из шести нулей (какой-то PDO-объект).
Еще есть heartbeat-сообщения, по умолчанию они идут каждую секунду — COB-ID=0x700+Id, данные — один байт (состояние объекта в CANopen-понятии). Их можно вообще отключить командой 0x2b 0x17 0x10 0 0 0 0 0, а можно сделать пореже (эта команда — интервал между сообщениями, 0 означает бесконечность, все остальное — в миллисекундах). Скажем, 10 секунд: 0x2b 0x17 0x10 0 0x10 0x27 0 0.
Помимо всех этих штук в CANopen есть т.н. NMT-посылки, отправляемые на COB-ID=0. В их данных содержится два байта: новое состояние узла и его идентификатор. Скажем, чтобы перезапустить контроллер #1, нужно отправить команду 0x81 1 на идентификатор 0.

У контроллера очень много режимов (SDO #0x6005): позиция, скорость, синхронизация, ведомый за энкодером и движение по профилю положения или скорости. Мне нужен только режим по умолчанию. Задается он несколькими параметрами. И здесь важно не упустить, что параметр maximum speed (SDO #0x6003) хранится в оперативке и не дублируется во флеше! Т.е. каждый раз после перезапуска контроллера его нужно заново устанавливать. Посылаем 0x40 3 0x60 0 0 0 0 0 и видим, что действительно после перезапуска это нуль:

s 0x601 0x40 3 0x60 0 0 0 0 0
Message parsed OK 6928998 #0x0581 0x43 0x03 0x60 0x00 0x00 0x00 0x00 0x00

(надо доделать CAN-сниффер, чтобы им можно было из всяких утилит пользоваться — убрать это море отладочных сообщений).
Если сейчас дать команду движения (relative displacement, 0x6004, или absolute displacement, 0x601c), то вал вращаться не будет! Я с этим промучился целый день, пока на изиэлектрониксе не подсказали проверить max speed.
Итак, даем команду двигаться на 1000 шагов в плюс:

s 0x0601 0x23 4 0x60 0 0xe8 3 0 0
Message parsed OK 7212660 #0x0581 0x60 0x04 0x60 0x00 0x00 0x00 0x00 0x00

Мотор, понятное дело, никуда не спешит. Контроллер ждет установки команды max speed. Устанавливаем:

s 0x601 0x23 3 0x60 0 0 4 0 0
Message parsed OK 7290943 #0x0581 0x60 0x03 0x60 0x00 0x00 0x00 0x00 0x00

Повторяем предыдущую команду — и двигатель крутится! Ура!!!

Остается лишь разобраться с настройками микрошага, ускорений, поиграться с величиной максимальной скорости (в зависимости от нагрузки)…
eddy_em.livejournal.com

Добавить комментарий