# CAN Protocol (Chassis)
Reset
SenderReceiverCAN IDDLCPeriod(ms)
ControllerMotor driver0x0505XX00 XX: driver id, can be 1 or 2 or 3 8/
datafunctiondata typedescription
byte\[0\]/uint8Fixed value 0x55
byte\[1\]/uint8Fixed value 0x55
byte\[2\]/uint8Fixed value 0x55
byte\[3\]/uint8Fixed value 0x55
byte\[4\]/uint8Fixed value 0x55
byte\[5\]/uint8Fixed value 0x55
byte\[6\]/uint8Fixed value 0x55
byte\[7\]/uint8Fixed value 0x55
Driver mode switch
SenderReceiverCAN IDDLCPeriod(ms)
ControllerMotor driver0x0505XX01 XX: driver ID. Can be 1 or 2 or 38/
datafunctiondata typedescription
byte\[0\]modeuint82-open loop mode 3-velocity loop mode 4-position velocity loop mode 5-current loop mode 6-velocity current loop mode 7-position velocity current loop mode Note: typically the velocity current loop mode should be used. If you want to switch mode, you need to send reset first
byte\[1\]/uint8Fixed value 0x55
byte\[2\]/uint8Fixed value 0x55
byte\[3\]/uint8Fixed value 0x55
byte\[4\]/uint8Fixed value 0x55
byte\[5\]/uint8Fixed value 0x55
byte\[6\]/uint8Fixed value 0x55
byte\[7\]/uint8Fixed value 0x55
Open loop mode control
SenderReceiverCAN IDDLCPeriod(ms)
ControllerMotor driver0x0505XX02 XX: driver ID. Can be 1 or 2 or 3 810ms
datafunctiondata typedescription
byte\[0\]pwm\_duty \[15:8\]int16range \[-3000,3000\]
byte\[1\]pwm\_duty \[7:0\]
byte\[2\]/uint8Fixed value 0x55
byte\[3\]/uint8Fixed value 0x55
byte\[4\]/uint8Fixed value 0x55
byte\[5\]/uint8Fixed value 0x55
byte\[6\]/uint8Fixed value 0x55
byte\[7\]/uint8Fixed value 0x55
Velocity mode control
SenderReceiverCAN IDDLCPeriod(ms)
ControllerMotor driver0x0505XX03 XX: driver ID. Can be 1 or 2 or 3 810ms
datafunctiondata typedescription
byte\[0\]pwm\_duty \[15:8\]int16range \[-3000,3000\]
byte\[1\]pwm\_duty \[7:0\]
byte\[2\]velocity \[15:8\]int16unit: rpm, range \[-500,500\]
byte\[3\]velocity \[7:0\]
byte\[4\]/uint8Fixed value 0x55
byte\[5\]/uint8Fixed value 0x55
byte\[6\]/uint8Fixed value 0x55
byte\[7\]/uint8Fixed value 0x55
Position velocity mode control
SenderReceiverCAN IDDLCPeriod(ms)
ControllerMotor driver0x0505XX04 XX: driver ID. Can be 1 or 2 or 3 810ms
datafunctiondata typedescription
byte\[0\]pwm\_duty \[15:8\]int16range \[-3000,3000\]
byte\[1\]pwm\_duty \[8:0\]
byte\[2\]velocity \[15:8\]int16unit: rpm, range \[-500,500\]
byte\[3\]velocity \[8:0\]
byte\[4\]position\[31:24\]int32range \[-4096,4096\]
byte\[5\]position\[23:16\]
byte\[6\]position\[15:8\]
byte\[7\]position\[7:0\]
Current loop mode control
SenderReceiverCAN IDDLCPeriod(ms)
ControllerMotor driver0x0505XX05 XX: driver ID. Can be 1 or 2 or 3 810ms
datafunctiondata typedescription
byte\[0\]current \[15:8\]int16unit: 10mA, range \[-7000,7000\]
byte\[1\]current \[7:0\]
byte\[2\]/uint8Fixed value 0x55
byte\[3\]/uint8Fixed value 0x55
byte\[4\]/uint8Fixed value 0x55
byte\[5\]/uint8Fixed value 0x55
byte\[6\]/uint8Fixed value 0x55
byte\[7\]/uint8Fixed value 0x55
Velocity current mode control
SenderReceiverCAN IDDLCPeriod(ms)
ControllerMotor driver0x0505XX06 XX: driver ID. Can be 1 or 2 or 3 810ms
datafunctiondata typedescription
byte\[0\]current \[15:8\]int16unit: 10mA, range \[-7000,7000\]
byte\[1\]current \[7:0\]
byte\[2\]velocity \[15:8\]int16unit: rpm, range \[-500,500\]
byte\[3\]velocity \[7:0\]
byte\[4\]/uint8Fixed value 0x55
byte\[5\]/uint8Fixed value 0x55
byte\[6\]/uint8Fixed value 0x55
byte\[7\]/uint8Fixed value 0x55
Position velocity current mode control
SenderReceiverCAN IDDLCPeriod(ms)
ControllerMotor driver0x0505XX07 XX: driver ID. Can be 1 or 2 or 3 810ms
datafunctiondata typedescription
byte\[0\]current \[15:8\]int16unit: 10mA, range \[-7000,7000\]
byte\[1\]current \[8:0\]
byte\[2\]velocity \[15:8\]int16unit: rpm, range \[-500,500\]
byte\[3\]velocity \[8:0\]
byte\[4\]position\[31:24\]int32range \[-4096,4096\]
byte\[5\]position\[23:16\]
byte\[6\]position\[15:8\]
byte\[7\]position\[7:0\]
Set motor acceleration or deceleration
SenderReceiverCAN IDDLCPeriod(ms)
ControllerMotor driver0x0505XX30 XX: driver ID. Can be 1 or 2 or 3 8/
datafunctiondata typedescription
byte\[0\]open loop acc \[15:8\]uint16if you set 1000,it means that the PWM duty cycle value takes 1 second to go from 0 to 1000
byte\[1\]open loop acc \[7:0\]
byte\[2\]open loop dec \[15:8\]uint16if you set 1000,it means that the PWM duty cycle value takes 1 second to go from 1000 to 0
byte\[3\]open loop dec \[7:0\]
byte\[4\]velocity loop acc\[15:8\]uint16if you set 100,it means that the rpm value takes 10 second to go from 0 rpm to 1000 rpm
byte\[5\]velocity loop acc \[7:0\]
byte\[6\]velocity loop dec\[15:8\]uint16if you set 100,it means that the rpm value takes 10 second to go from 1000 rpm to 0 rpm
byte\[7\]velocity loop dec \[7:0\]
set velocity loop(without current loop)PID param cmd
SenderReceiverCAN IDDLCPeriod(ms)
ControllerMotor driver0x0505XX40 XX: driver ID. Can be 1 or 2 or 3 8The driver has default parameters that are sent when they need to be modified
datafunctiondata typedescription
byte\[0\]P \[31:24\]floatProportion param
byte\[1\]P\[23:16\]
byte\[2\]P\[15:8\]
byte\[3\]P\[7:0\]
byte\[4\]I \[31:24\]floatIntegral param
byte\[5\]I\[23:16\]
byte\[6\]I\[15:8\]
byte\[7\]I\[7:0\]
set position loop(without current loop)PID cmd
SenderReceiverCAN IDDLCPeriod(ms)
ControllerMotor driver0x0505XX41 XX: driver ID. Can be 1 or 2 or 3 8The driver has default parameters that are sent when they need to be modified
datafunctiondata typedescription
byte\[0\]P \[31:24\]floatproportion param
byte\[1\]P\[23:16\]
byte\[2\]P\[15:8\]
byte\[3\]P\[7:0\]
byte\[4\]D \[31:24\]floatdifferential param
byte\[5\]D\[23:16\]
byte\[6\]D\[15:8\]
byte\[7\]D\[7:0\]
set current loop PID cmd
SenderReceiverCAN IDDLCPeriod(ms)
ControllerMotor driver0x0505XX42 XX: driver ID. Can be 1 or 2 or 3 8The driver has default parameters that are sent when they need to be modified
datafunctiondata typedescription
byte\[0\]P \[31:24\]floatproportion param
byte\[1\]P\[23:16\]
byte\[2\]P\[15:8\]
byte\[3\]P\[7:0\]
byte\[4\]I \[31:24\]floatIntegral param
byte\[5\]I\[23:16\]
byte\[6\]I\[15:8\]
byte\[7\]I\[7:0\]
set velocity loop(with current loop)PID cmd
SenderReceiverCAN IDDLCPeriod(ms)
ControllerMotor driver0x0505XX43 XX: driver ID. Can be 1 or 2 or 3 8The driver has default parameters that are sent when they need to be modified
datafunctiondata typedescription
byte\[0\]P \[31:24\]floatproportion param
byte\[1\]P\[23:16\]
byte\[2\]P\[15:8\]
byte\[3\]P\[7:0\]
byte\[4\]I \[31:24\]floatIntegral param
byte\[5\]I\[23:16\]
byte\[6\]I\[15:8\]
byte\[7\]I\[7:0\]
set position loop(with current loop)PID cmd
SenderReceiverCAN IDDLCPeriod(ms)
ControllerMotor driver0x0505XX44 XX: driver ID. Can be 1 or 2 or 3 8The driver has default parameters that are sent when they need to be modified
datafunctiondata typedescription
byte\[0\]P \[31:24\]floatproportion param
byte\[1\]P\[23:16\]
byte\[2\]P\[15:8\]
byte\[3\]P\[7:0\]
byte\[4\]D \[31:24\]floatdifferential param
byte\[5\]D\[23:16\]
byte\[6\]D\[15:8\]
byte\[7\]D\[7:0\]
motor position velocity current feedback
SenderReceiverCAN IDDLCPeriod(ms)
Motor driverController0x0505XXB1 XX: driver ID. Can be 1 or 2 or 3 810ms
datafunctiondata typedescription
byte\[0\]current \[15:8\]int16unit: 10mA
byte\[1\]current \[8:0\]
byte\[2\]velocity \[15:8\]int16unit: rpm
byte\[3\]velocity \[8:0\]
byte\[4\]position\[31:24\]int32unit: qc
byte\[5\]position\[23:16\]
byte\[6\]position\[15:8\]
byte\[7\]position\[7:0\]
Driver status feedback
SenderReceiverCAN IDDLCPeriod(ms)
Motor driverController0x0505XXB2 XX: driver ID. Can be 1 or 2 or 3 8100ms
datafunctiondata typedescription
byte\[0\]pwm duty \[15:8\]int16
byte\[1\]pwm duty \[8:0\]
byte\[2\]voltage \[15:8\]uint16unit: 0.01V
byte\[3\]voltage \[8:0\]
byte\[4\]MOSFET temperatureuint8unit: ℃
byte\[5\]motor temperatureuint8unit: ℃
byte\[6\]erroruint80-normal 1-voltage over low 2-voltage over high 3-mosfet overtemperature 4-motor overtemperature 5-motor over current 6-encoder disconnect 7-encoder feedback direction is incorrect 8-encoder leads are not secure 9- hall sensor is abnormal
byte\[7\]warninguint8bit0-can watchdog timeout bit1-there is a gap in the Hall sensor
vcu error feedback
SenderReceiverCAN IDDLCPeriod(ms)
VCUController0x011101BA8100ms
datafunctiondata typedescription
byte\[0\]reverseuint80
byte\[1\]reverseuint80
byte\[2\]reverseuint80
byte\[3\]erroruint8bit0-Low battery warm bit1-Low battery error bit2-reverse bit3-emergency stop
byte\[4\]reverseuint80
byte\[5\]reverseuint80
byte\[6\]reverseuint80
byte\[7\]reverseuint80
VCU ctrl mode switch
SenderReceiverCAN IDDLCPeriod(ms)
VCUController0x011101118/
datafunctiondata typedescription
byte\[0\]VCU mode uint80-standby 1-reverse 2-VCU CAN mode 3-free mode 4-passthrough mode Note: After powering on, it is in passthrough mode by default
byte\[1\]reverseuint80
byte\[2\]reverseuint80
byte\[3\]erroruint80
byte\[4\]reverseuint80
byte\[5\]reverseuint80
byte\[6\]reverseuint80
byte\[7\]reverseuint80
### Velocity current mode example #### 1. Switch to velocity current mode
CAN ID: 0x05050101, Data: 06 55 55 55 55 55 55 55
#### 2. Set target velocity to 500 rpm, current to 30000mA
CAN ID: 0x05050106, Data: 0B B8 01 F4 55 55 55 55