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