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