Registers¶
This page documents all motor registers available in the DaMiao motor.
How it works?¶
Register Persistence (Write vs Store)
write and store are two different operations:
- Write (
write_register): update register value in RAM immediately (runtime only). - Store (
store_parameters): persist current runtime register values to flash (survives power cycle).
Python API (damiao_motor/core/motor.py)
Use these methods on DaMiaoMotor:
write_register(rid, value)to write one register at runtime (RAM).- Most
set_*helper methods (for exampleset_control_mode,set_speed_loop_kp,set_can_timeout) internally callwrite_register. store_parameters()to store current runtime parameters to flash.set_can_baud_rate(...)writes register35and then calls store automatically.
# Write to register (RAM, immediate but NOT persistent)
motor.write_register(25, 20.0) # KP_ASR
# Store current runtime parameters to flash (persistent)
motor.store_parameters()
Web GUI (Write vs Store)
- Editing a register in the Web GUI performs a runtime write first.
- Click
Store Parametersto store current runtime values to flash. - In current implementation, changing register
7(MST_ID) or8(ESC_ID) also triggers store automatically.

CLI
From current CLI implementation:
| Command | Write action (RAM) | Store behavior (flash) |
|---|---|---|
damiao set-motor-id |
Writes register 8 (ESC_ID) |
Yes (calls store_parameters()) |
damiao set-feedback-id |
Writes register 7 (MST_ID) |
Yes (calls store_parameters()) |
damiao set-can-timeout |
Writes register 9 (TIMEOUT, 1 register unit = 50 microseconds) |
Yes (calls store_parameters()) |
Other CLI control commands (send-cmd-*, set-zero-command, set-zero-position) do not call store, so parameter changes are not persisted.
CAN Baud Rate Codes
The CAN_BAUD_RATE_CODES dictionary maps baud rate codes to actual baud rates:
| Code | Baud Rate |
|---|---|
| 0 | 125,000 (125K) |
| 1 | 200,000 (200K) |
| 2 | 250,000 (250K) |
| 3 | 500,000 (500K) |
| 4 | 1,000,000 (1M) |
from damiao_motor import CAN_BAUD_RATE_CODES
# Access baud rate codes
for code, baud_rate in CAN_BAUD_RATE_CODES.items():
print(f"Code {code}: {baud_rate} bps")
Usage Examples
from damiao_motor import DaMiaoController
controller = DaMiaoController(channel="can0")
motor = controller.add_motor(motor_id=0x01, feedback_id=0x00, motor_type="4340")
# Read a specific register
value = motor.get_register(0x00) # Read UV_Value
# Check if read was successful
if value is not None:
print(f"Value: {value}")
# Write to a register (only RW registers can be written)
motor.write_register(7, 0x01) # Set MST_ID to 1 (RAM)
# Store to keep the change after power cycle
motor.store_parameters()
from damiao_motor import REGISTER_TABLE
# Access register information
for register_id, info in REGISTER_TABLE.items():
print(f"Register {register_id:2d} (0x{register_id:02X}): "
f"{info.variable:12s} - {info.description} "
f"[{info.access}]")
Safety Notes
Register Safety
- Some registers affect motor behavior immediately
- Always verify register values before writing
- Read-only (RO) registers cannot be written
- Refer to motor firmware documentation for detailed register behavior
- Test register changes in a safe environment
Register Table¶
| ID | Variable | Description | Access | Range | Type |
|---|---|---|---|---|---|
| 0 | UV_Value |
Under-voltage protection value (see UNDER_VOLTAGE 0x9) |
RW | (10.0, 3.4E38] | float |
| 1 | KT_Value |
Torque coefficient \(K_T\) used in MIT mode | RW | [0.0, 3.4E38] | float |
| 2 | OT_Value |
Over-temperature protection value (see MOS/ROTOR over-temp) | RW | [80.0, 200) | float |
| 3 | OC_Value |
Over-current protection value (see OVER_CURRENT 0xA) |
RW | (0.0, 1.0) | float |
| 4 | ACC |
Acceleration | RW | (0.0, 3.4E38) | float |
| 5 | DEC |
Deceleration | RW | [-3.4E38, 0.0) | float |
| 6 | MAX_SPD |
Maximum speed | RW | (0.0, 3.4E38] | float |
| ID | Variable | Description | Access | Range | Type |
|---|---|---|---|---|---|
| 7 | MST_ID |
Feedback ID | RW | [0, 0x7FF] | uint32 |
| 8 | ESC_ID |
Receive ID | RW | [0, 0x7FF] | uint32 |
| 9 | TIMEOUT |
Timeout alarm time (1 register unit = 50 microseconds; see LOST_COMM 0xD) |
RW | [0, 2^32-1] | uint32 |
| 10 | CTRL_MODE |
Control mode | RW | [1, 4] | uint32 |
| ID | Variable | Description | Access | Range | Type |
|---|---|---|---|---|---|
| 11 | Damp |
Motor viscous damping coefficient | RO | / | float |
| 12 | Inertia |
Motor moment of inertia | RO | / | float |
| 13 | hw_ver |
Reserved | RO | / | uint32 |
| 14 | sw_ver |
Software version number | RO | / | uint32 |
| 15 | SN |
Reserved | RO | / | uint32 |
| 16 | NPP |
Motor pole pairs | RO | / | uint32 |
| 17 | Rs |
Motor phase resistance | RO | / | float |
| 18 | Ls |
Motor phase inductance | RO | / | float |
| 19 | Flux |
Motor flux linkage value | RO | / | float |
| 20 | Gr |
Gear reduction ratio | RO | / | float |
| ID | Variable | Description | Access | Range | Type |
|---|---|---|---|---|---|
| 21 | PMAX |
Position mapping range | RW | (0.0, 3.4E38] | float |
| 22 | VMAX |
Speed mapping range | RW | (0.0, 3.4E38] | float |
| 23 | TMAX |
Torque mapping range | RW | (0.0, 3.4E38] | float |
PMAX / VMAX / TMAX Defaults
Registers 21 (PMAX), 22 (VMAX), and 23 (TMAX) are writable and can be changed with register writes (API/CLI/GUI).
Recommended Practice
These mapping limits should normally stay at their default motor-type values.
The SDK uses motor-type presets in damiao_motor/core/motor.py (MOTOR_TYPE_PRESETS, built from _MOTOR_LIMIT_PARAM) for command encoding and feedback decoding.
If motor register mapping limits are changed without keeping SDK limits consistent, command/feedback scaling can become inconsistent.
Default values in code (_MOTOR_LIMIT_PARAM):
| Motor type | PMAX | VMAX | TMAX |
|---|---|---|---|
3507 |
12.566 | 50 | 5 |
4310 |
12.5 | 30 | 10 |
4310P |
12.5 | 50 | 10 |
4340 |
12.5 | 10 | 28 |
4340P |
12.5 | 10 | 28 |
6006 |
12.5 | 45 | 20 |
8006 |
12.5 | 45 | 40 |
8009 |
12.5 | 45 | 54 |
10010L |
12.5 | 25 | 200 |
10010 |
12.5 | 20 | 200 |
H3510 |
12.5 | 280 | 1 |
G6215 |
12.5 | 45 | 10 |
H6220 |
12.5 | 45 | 10 |
JH11 |
12.5 | 10 | 12 |
6248P |
12.566 | 20 | 120 |
| ID | Variable | Description | Access | Range | Type |
|---|---|---|---|---|---|
| 24 | I_BW |
Current loop control bandwidth | RW | [100.0, 10000.0] | float |
| 25 | KP_ASR |
Speed loop Kp (used in POS_VEL, VEL, FORCE_POS) | RW | [0.0, 3.4E38] | float |
| 26 | KI_ASR |
Speed loop Ki (used in POS_VEL, VEL, FORCE_POS) | RW | [0.0, 3.4E38] | float |
| 27 | KP_APR |
Position loop Kp (used in POS_VEL, FORCE_POS) | RW | [0.0, 3.4E38] | float |
| 28 | KI_APR |
Position loop Ki (used in POS_VEL, FORCE_POS) | RW | [0.0, 3.4E38] | float |
| ID | Variable | Description | Access | Range | Type |
|---|---|---|---|---|---|
| 29 | OV_Value |
Overvoltage protection value (see OVER_VOLTAGE 0x8) |
RW | TBD | float |
| 30 | GREF |
Gear torque efficiency | RW | (0.0, 1.0] | float |
| 31 | Deta |
Speed loop damping coefficient | RW | [1.0, 30.0] | float |
| 32 | V_BW |
Speed loop filter bandwidth | RW | (0.0, 500.0) | float |
| ID | Variable | Description | Access | Range | Type |
|---|---|---|---|---|---|
| 33 | IQ_c1 |
Current loop enhancement coefficient | RW | [100.0, 10000.0] | float |
| 34 | VL_c1 |
Speed loop enhancement coefficient | RW | (0.0, 10000.0] | float |
| ID | Variable | Description | Access | Range | Type |
|---|---|---|---|---|---|
| 35 | can_br |
CAN baud rate code | RW | [0, 4] | uint32 |
| 36 | sub_ver |
Sub-version number | RO | / | uint32 |
| ID | Variable | Description | Access | Range | Type |
|---|---|---|---|---|---|
| 50 | u_off |
U-phase offset | RO | - | float |
| 51 | v_off |
V-phase offset | RO | - | float |
| 52 | k1 |
Compensation factor 1 | RO | - | float |
| 53 | k2 |
Compensation factor 2 | RO | - | float |
| 54 | m_off |
Angle offset | RO | - | float |
| 55 | dir |
Direction | RO | - | float |
| ID | Variable | Description | Access | Range | Type |
|---|---|---|---|---|---|
| 80 | p_m |
Motor position | RO | - | float |
| 81 | xout |
Output shaft position | RO | - | float |