Шаговый двигатель Stellaris RDK USB-последовательный интерфейс с приложением для ПК — пакетный формат

Я работаю с шаговым двигателем Stellaris RDK от TI-Luminary Micro. Переместите меня на правильный форум, если это необходимо. Я использую последовательный интерфейс USB для взаимодействия устройства с моим приложением, разработанным с использованием С#. В настоящее время я застрял в отправке команд управления из моего приложения. Я могу запустить и остановить шаговый двигатель, отправив следующие команды. Но я хотел бы установить целевые шаги в секунду. Я не могу понять, как сформировать пакет управления командой с требуемыми целевыми шагами. Поэтому любая помощь по этому поводу приветствуется.

код:

//To startMotor:

byte[] StartMotorRequest = new byte[] {0xff,0x07,0x13,0x14,0x00,0xcf,0xff,
0x04,0x30,0xcd,0xff,0x09,0x13,0x08,0x00,0xd0,0x30,0x0e,0xcf };
 _serialPort.Write(StartMotorRequest, 0, StartMotorRequest.Length);

//To StopMotor:

byte[] StopMotorRequest = new byte[] { 0xff,0x04,0x31,0xcc};
_serialPort.Write(StopMotorRequest, 0, StopMotorRequest.Length);

Спасибо,

Баладжи.Р


person Balaji R    schedule 19.03.2014    source источник


Ответы (1)


Stellaris — Контроллер шагового двигателя RDK — Последовательный интерфейс USB с компьютером — Детали использования

Вот простое руководство по сопряжению шагового двигателя с вашим приложением с использованием последовательного интерфейса USB.

Команды передаются моторному приводу в следующем формате:

{тег} {длина} {команда} {необязательный байт(ы) данных команды} {контрольная сумма

  • Байт {tag} равен 0xff.
  • Байт {length} содержит общую длину командного пакета, начиная с {тега} и заканчивая {контрольной суммой}. Максимальная длина пакета составляет 255 байт.
  • Байт {command} — это отправляемая команда. В зависимости от команды могут следовать необязательные байты данных команды.
  • Байт {checksum} — это значение, при котором сумма всех байтов в командном пакете (включая контрольную сумму) будет равна нулю. Это используется для проверки пакета команд и позволяет цели синхронизироваться с потоком команд, отправляемым хостом.
  • Значение байтов контрольной суммы можно рассчитать, вычитая все оставшиеся значения из нуля. то есть, если команда 0x01. Байт контрольной суммы можно рассчитать как [0-(ff+04+01)]= 0xfc.

Таким образом, команда 0x01 без байтов данных будет отправлена ​​следующим образом:

0xff 0x04 0x01 0xfc

Запуск двигателя с предопределенными целевыми шагами/секундами

CMD_RUN = 0x30 TAG_CMD = 0xff

Описание: Запускает двигатель на основе текущего набора параметров, если он еще не запущен.

Команда:

TAG_CMD 0x04 CMD_RUN {контрольная сумма}

CMD_SET_PARAM_VALUE

Описание: Задает значение параметра. Для параметров, значения которых превышают один байт, не обязательно указывать все байты значения параметра; байты значения, которые не предоставлены (т. е. более значащие байты), обрабатываются так, как если бы был передан ноль. Если предоставлено больше байтов, чем требуется для значения параметра, лишние байты игнорируются.

Команда:

TAG_CMD {длина} CMD_SET_PARAM_VALUE {параметр} {значение} [{значение} ...] {контрольная сумма}

PARAM_TARGET_POS 0x08

Описание: Определяет целевое положение двигателя.

PARAM_USE_ONBOARD_UI 0x1e

Описание: Указывает, должен ли встроенный пользовательский интерфейс быть активным или неактивным.


Пример кода на C# для запуска и остановки двигателя с предварительно загруженными целевыми шагами в секунду

private void InitializeSerialPort()
        {
            try
            {
                String ComPortName = ComPortCB.Text;
                ComPortName = ComPortName.Trim();
                _serialPort = new SerialPort(ComPortName, 115200, Parity.None, 8, StopBits.One);
                _serialPort.Handshake = Handshake.None;
                _serialPort.WriteTimeout = 500;
                _serialPort.ReadTimeout = 500;
                _serialPort.Open();
                _serialPort.Close();
                _SerialPortInitialization = true;
            }
            catch (NullReferenceException excpt)
            {
                MessageBox.Show(excpt.Message);
            }
        }

public static void StartStepperMotor()
        {
            try
            {
                if (!_serialPort.IsOpen)
                    _serialPort.Open();

                byte[] StartMotorRequest = new byte[] { 0xff, 0x04, 0x30, 0xcd };
                byte[] SetParamTargetPosition = new byte[] { 0xFF, 0x09, 0x13, 0x08, 0x00, 0x50, 0xC3, 0x00, 0xCA };

                byte[] GetDataItems;
                GetDataItems = new byte[] { 0xff, 0x06, 0x13, 0x1e, 0x00, 0xca };
                _serialPort.Write(GetDataItems, 0, GetDataItems.Length);

                _serialPort.Write(StartMotorRequest, 0, StartMotorRequest.Length);
                _serialPort.Write(SetParamTargetPosition, 0, SetParamTargetPosition.Length);
                //_serialPort.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error opening/writing to serial port :: " + ex.Message, "Error!");
            }
        }

public static void StopStepperMotor()
        {
            try
            {
                if (!_serialPort.IsOpen)
                    _serialPort.Open();

                byte[] StopMotorRequest = new byte[] { 0xff, 0x04, 0x31, 0xcc };
                _serialPort.Write(StopMotorRequest, 0, StopMotorRequest.Length);
                //_serialPort.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error opening/writing to serial port :: " + ex.Message, "Error!");
            }
        }

private void RotateStepperMotor(int RequiredAngle)
    {
        try
        {
            if (!_serialPort.IsOpen)
                _serialPort.Open();

            ushort Steps = RequiredAngle;
            byte TargetPositionLSB = (byte)(Steps & 0xFFu);
            byte TargetPositionMSB = (byte)((Steps >> 8) & 0xFFu);

            byte CheckSumByte;
            CheckSumByte = (byte)(0 - (0xFF + 0x09 + 0x13 + 0x08 + TargetPositionLSB + TargetPositionMSB));


            byte[] GetDataItems;
            GetDataItems = new byte[] { 0xff, 0x06, 0x13, 0x1e, 0x00, 0xca };
            _serialPort.Write(GetDataItems, 0, GetDataItems.Length);

            byte[] StartMotorRequest = new byte[] { 0xff, 0x04, 0x30, 0xcd };
            byte[] SetParamTargetPosition = new byte[] { 0xFF, 0x09, 0x13, 0x08, 0x00, TargetPositionLSB, TargetPositionMSB, 0x00, CheckSumByte };

            _serialPort.Write(StartMotorRequest, 0, StartMotorRequest.Length);
            _serialPort.Write(SetParamTargetPosition, 0, SetParamTargetPosition.Length);

            _serialPort.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error opening/writing to serial port :: " + ex.Message, "Error!");
        }

    }
person Balaji R    schedule 28.03.2014