This document describes the status messages format of the ESCx controller.
- All listed datagram types are multicast
- All listed payloads use big-endian format
Relative Units
To optimize communication bandwidth, some data uses relative units and ranges instead of floating-point values. Ranges represent real units (Volts, Amps) and are transmitted in the Range and Reference message. Current range applies to all current values, and voltage range applies to all voltage values.
Converting relative units to absolute values:
VMEAS = (relative value / 32767) * VRANGE
Use the specified range when provided in the message description.
Range Examples:
Voltage and current ranges remain constant for each specification. With a single controller type, ranges can be hardcoded.
Example:
| Controller Voltage Range | Urange |
|---|
| 60V | 60 |
| 80V | 80 |
| 100V | 100 |
| Controller Current Range | Irange |
|---|
| 100A | 100 |
| 400A | 400 |
| 600A | 600 |
Motor voltage scaling
The motor voltage fields of Motor 1 and Motor 3 are phase-to-phase amplitudes. On VECTOR the driver multiplies the q-axis and d-axis phase voltages by √3 before transmission, so that a fully open driver reports the supply voltage and the value spans the whole Urange:
| Field | Transmitted value |
|---|
| Motor 3, bytes 2-3 | √3 · voltageq |
| Motor 3, bytes 6-7 | √3 · voltaged |
| Motor 1, bytes 2-3 | √3 · √(voltageq² + voltaged²), the phase-to-phase stator voltage from the motor measurements |
The /driver/motor/voltageq and /driver/motor/voltaged states themselves (terminal, siliWatch) are phase-to-neutral amplitudes and therefore read √3 ≈ 1.732 times lower than the CAN fields. Example: voltageq = 13.97 V on the terminal corresponds to 24.2 V in Motor 3 bytes 2-3.
/driver/motor/voltage exists only on BLDC. On VECTOR the Motor 1 voltage field is computed from voltageq and voltaged as above and has no terminal counterpart.
- On VECTOR, both voltage fields of Motor 3 change sign together with the direction inversion (negative
/driver/ipeak), whereas the voltaged state does not.
- The current fields are not scaled: Motor 3 carries
currentqf and currentdf exactly as read on the terminal, Motor 1 carries their amplitude.
Status Message - Range and Reference
Controller sendingCAN ID: 0x0D8(27 << 3) + 0 controller address|DLC: 8
| Datagram byte | Value / type | Description |
|---|
| 0-1 | uint16 | Urange - voltage range |
| 2-3 | uint16 | Irange - current range |
| 4-5 | uint16 | Uref - resolved voltage reference [V] (parameter /driver/uref, see tip below) |
| 6-7 | uint16 | Iref - current reference [A] (parameter /driver/iref) |
The Uref field carries the resolved voltage reference [V] (the voltage actually used by the driver), not the raw uref parameter. With uref = 0 it streams the available bus voltage; hosts that read this field back as the parameter value must be updated.
Status Message - Driver State 1
Controller sendingCAN ID: 0x0D0(26 << 3) + 0 controller address|DLC: 8
| Datagram byte | Value / type | Description |
|---|
| 0 | bit 0-3 | /driver/enable (power stage state, 0 = hi-Z) |
| 0 | bit 4-7 | Driver algorithm (BLDC: bit4 enabled, VECTOR: bit5 enabled) |
| 1 | uint8 | /driver/stat |
| 2 | uint8 | /driver/mode |
| 3 | int8 | /driver/temp |
| 4-5 | uint16 | /driver/limit |
| 6-7 | uint16 | /driver/error |
Status Message - Driver State 2
Controller sendingCAN ID: 0x120(36 << 3) + 0 controller address|DLC: 8
| Datagram byte | Value / type | Description |
|---|
| 0-1 | int16 | /driver/cmd (-32767 to 32767) |
| 2-3 | uint16 | /driver/totallimit (0 to 65535) |
| 4-5 | uint16 | /driver/ptctemp [-] (no scaling) |
| 6 | uint8 | /driver/iqmult on VECTOR, /driver/imult on BLDC (0 to 255) |
| 7 | uint8 | /driver/uqmult on VECTOR, /driver/umult on BLDC (0 to 255) |
Status Message - Supply 1
Controller sendingCAN ID: 0x0E0(28 << 3) + 0 controller address|DLC: 8
| Datagram byte | Value / type | Description |
|---|
| 0-1 | int16 | /driver/supply/currentf in relative units |
| 2-3 | int16 | /driver/supply/voltage in relative units |
| 4-7 | int32 | /driver/supply/cap [mAh] |
Status Message - Motor 1
Controller sendingCAN ID: 0x0F0(30 << 3) + 0 controller address|DLC: 8
| Datagram byte | Value / type | Description |
|---|
| 0-1 | int16 | Motor current amplitude in relative units. VECTOR: √(currentqf² + currentdf²), BLDC: |/driver/motor/current| |
| 2-3 | int16 | Motor voltage amplitude in relative units, phase-to-phase (see Motor voltage scaling). VECTOR: √3 · √(voltageq² + voltaged²), BLDC: |/driver/motor/voltage| |
| 4-7 | int32 | /driver/energy [J] |
Status Message - Motor 2
Controller sendingCAN ID: 0x0F8(31 << 3) + 0 controller address|DLC: 8
| Datagram byte | Value / type | Description |
|---|
| 0-1 | int16 | /driver/powerf (VECTOR) or /driver/power (BLDC) in relative units. Range: Urange*Irange. |
| 2-3 | int16 | Mechanical angle [radian]. Range: 3.14. |
| 4-5 | int16 | /driver/motor/rpmf. Range: int16 * 8. |
| 6-7 | int16 | /driver/motor/odo. Range: 1. |
Status Message - Motor 3
Controller sendingCAN ID: 0x100(32 << 3) + 0 controller address|DLC: 8
| Datagram byte | Value / type | Description |
|---|
| 0-1 | int16 | /driver/motor/currentqf in relative units. BLDC: /driver/motor/current |
| 2-3 | int16 | √3 · /driver/motor/voltageq in relative units, phase-to-phase (see Motor voltage scaling). BLDC: /driver/motor/voltage |
| 4-5 | int16 | /driver/motor/currentdf in relative units. BLDC: always 0 |
| 6-7 | int16 | √3 · /driver/motor/voltaged in relative units, phase-to-phase (see Motor voltage scaling). BLDC: always 0 |
Status Message - Motor 4
Controller sendingCAN ID: 0x108(33 << 3) + 0 controller address|DLC: 8
| Datagram byte | Value / type | Description |
|---|
| 0-1 | int16 | Rthermistor [ohm] |
| 2-3 | int16 | /driver/motor/mres [mohm] |
| 4-5 | int16 | Actual motor torque [Nm] * 100 |
| 6-7 | int16 | Maximum possible torque [Nm] * 100 |