Stellaris - 步进电机控制器 RDK- 带计算机的 USB 串行接口 - 使用详情
这是使用 USB 串行接口将步进电机与应用程序连接的简单教程。
命令以以下格式发送到电机驱动器:
{tag} {length} {command} {可选命令数据字节} {checksum}
- {tag} 字节为 0xff。
- {length} 字节包含命令包的总长度,以 {tag} 开始,以 {checksum} 结束。最大数据包长度为 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!");
}
}