以下内容使用 固件版本 fw-v0.4.11 硬件版本 v3.6-56V 进行编写测试。
指令前缀说明 :
指令 = [值]
Enter 即可对属性进行赋值操作。如:odrv0.config.brake_resistance = 2 Enter[float],当前 DC 供电电压,单位为 [V]
[uint64_t],ODrive 硬件序列号
[uint8_t],硬件主版本号
[uint8_t],硬件次版本号
[uint8_t],硬件变种版本,用来细分硬件电压版本,如 56v 电压版本此值为 56,24v 电压版本此值为 24
[uint8_t],固件主版本号
[uint8_t],固件次版本号
[uint8_t],固件修正版本号
[uint8_t],固件版本是否官方发布,如果为官方发布版本此值为 0,否则为 1
[bool],用来查看启动后配置是否被正确加载,如果配置加载正确此值为 True,否则为 False
[bool],用来表示当前制动电阻控制信号是否使能
[uint32_t],测试用,用来测试属性的读写是否正常
测试用,用来测试函数执行是否正常,返回值为内部静态变量加上函数输入的 delta 值
获取当前虚拟示波器数组索引对应的值,固件中默认为采集 DC 电压,想要采集其它的需要自行修改固件源码,index 范围为 [0~127]
获取GPIO端口采集到的电压,单位为[v],仅在 GPIO 端口 1、2、3、4 支持 ADC 输入
将配置保存到内部 FLASH 内
擦除 FLASH 中的配置,下次重新启动后所有配置变为默认配置
重启 ODrive 硬件
使 ODrive 进入 DFU 模式
[float],制动电阻的阻值,单位为 [ohm],如果不使用或不接制动电阻设置为 0 即可
[bool],是否启用 uart
[bool],是否启用 i2c 而非 can
[bool],是否启用 USB 通信支持 ascii 控制协议
[float],设置低电压报警阈值,当 DC 电压低于此值将停止并报错
[float],设置过压报警阈值,当 DC 电压高于此值将停止并报错
设置 GPIO 1 作为 PWM 输入时和被控制量的映射,如果希望 PWM 输入控制 axis0 电机的转速输入 odrv0.config.gpio1_pwm_mapping.endpoint = odrv0.axis0.controller._remote_attributes[‘vel_setpoint’]
如果希望解除映射可以输入 odrv0.config.gpio1_pwm_mapping.endpoint = None
映射被控制量的最小值,当 PWM duty 为 1 ms 时,被控量为此值
映射被控制量的最大值,当 PWM duty 为 2 ms 时,被控量为此值
设置 GPIO 2 作为 PWM 输入时和被控制量的映射,如果希望 PWM 输入控制 axis0 电机的转速输入 odrv0.config.gpio2_pwm_mapping.endpoint = odrv0.axis0.controller._remote_attributes[‘vel_setpoint’]
如果希望解除映射可以输入 odrv0.config.gpio2_pwm_mapping.endpoint = None
映射被控制量的最小值,当 PWM duty 为 1 ms 时,被控量为此值
映射被控制量的最大值,当 PWM duty 为 2 ms 时,被控量为此值
设置 GPIO 3 作为 PWM 输入时和被控制量的映射,如果希望 PWM 输入控制 axis0 电机的转速输入 odrv0.config.gpio3_pwm_mapping.endpoint = odrv0.axis0.controller._remote_attributes[‘vel_setpoint’]
如果希望解除映射可以输入 odrv0.config.gpio3_pwm_mapping.endpoint = None
映射被控制量的最小值,当 PWM duty 为 1 ms 时,被控量为此值
映射被控制量的最大值,当 PWM duty 为 2 ms 时,被控量为此值
设置 GPIO 4 作为 PWM 输入时和被控制量的映射,如果希望 PWM 输入控制 axis0 电机的转速输入 odrv0.config.gpio4_pwm_mapping.endpoint = odrv0.axis0.controller._remote_attributes[‘vel_setpoint’]
如果希望解除映射可以输入 odrv0.config.gpio4_pwm_mapping.endpoint = None
映射被控制量的最小值,当 PWM duty 为 1 ms 时,被控量为此值
映射被控制量的最大值,当 PWM duty 为 2 ms 时,被控量为此值
设置 GPIO 3 作为 模拟输入时和被控制量的映射,如果希望模拟输入控制 axis0 电机的转速输入 odrv0.config.gpio3_analog_mapping.endpoint = odrv0.axis0.controller._remote_attributes[‘vel_setpoint’]
如果希望解除映射可以输入 odrv0.config.gpio3_analog_mapping.endpoint = None
映射被控制量的最小值,当输入电压为 0 v 时,被控量为此值
映射被控制量的最大值,当输入电压为 3.3 v 时,被控量为此值
设置 GPIO 4 作为 模拟输入时和被控制量的映射,如果希望模拟输入控制 axis0 电机的转速输入 odrv0.config.gpio4_analog_mapping.endpoint = odrv0.axis0.controller._remote_attributes[‘vel_setpoint’]
如果希望解除映射可以输入 odrv0.config.gpio4_analog_mapping.endpoint = None
映射被控制量的最小值,当输入电压为 0 v 时,被控量为此值
映射被控制量的最大值,当输入电压为 3.3 v 时,被控量为此值
[uint32_t],系统启动后运行时间,单位为 [ms]
[uint32_t],获取未分配的内存堆历史最小值,单位为 [Bytes],用来调试堆栈分配
[uint32_t],获取 axis0 线程未分配的栈内存历史最小值,单位为 [Bytes],用来调试堆栈分配
[uint32_t],获取 axis1 线程未分配的栈内存历史最小值,单位为 [Bytes],用来调试堆栈分配
[uint32_t],获取通讯线程未分配的栈内存历史最小值,单位为 [Bytes],用来调试堆栈分配
[uint32_t],获取USB线程未分配的栈内存历史最小值,单位为 [Bytes],用来调试堆栈分配
[uint32_t],获取UART线程未分配的栈内存历史最小值,单位为 [Bytes],用来调试堆栈分配
[uint32_t],获取USB IRQ线程未分配的栈内存历史最小值,单位为 [Bytes],用来调试堆栈分配
[uint32_t],获取未分配的栈内存历史最小值,单位为 [Bytes],用来调试堆栈分配
[uint32_t],usb 接收数据包计数
[uint32_t],usb 发送数据包计数
[uint32_t],usb 发送过载数据包计数
[uint8_t],i2c 地址
[uint32_t],i2c 地址匹配计数
[uint32_t],i2c 数据包接收计数
[uint32_t],i2c 错误计数
[uint8_t],can 总线节点 ID
[uint32_t],can 发送完成计数
[uint32_t],can 发送中断计数
[uint32_t],can 接收数据帧计数
[uint32_t],can 接收ACK帧计数
[uint32_t],can 错误计数
[uint32_t],can 丢失数据帧计数
[enum],axis0 错误代码
ERROR_NONE = 0x00,
ERROR_INVALID_STATE = 0x01, //
ERROR_DC_BUS_UNDER_VOLTAGE = 0x02,
ERROR_DC_BUS_OVER_VOLTAGE = 0x04,
ERROR_CURRENT_MEASUREMENT_TIMEOUT = 0x08,
ERROR_BRAKE_RESISTOR_DISARMED = 0x10, //
ERROR_MOTOR_DISARMED = 0x20, //
ERROR_MOTOR_FAILED = 0x40, // Go to motor.hpp for information, check odrvX.axisX.motor.error for error value
ERROR_SENSORLESS_ESTIMATOR_FAILED = 0x80,
ERROR_ENCODER_FAILED = 0x100, // Go to encoder.hpp for information, check odrvX.axisX.encoder.error for error value
ERROR_CONTROLLER_FAILED = 0x200,
ERROR_POS_CTRL_DURING_SENSORLESS = 0x400,
ERROR_WATCHDOG_TIMER_EXPIRED = 0x800,
[bool],step/dir 是否使能
[enum],axis0 当前状态
AXIS_STATE_UNDEFINED = 0, //
AXIS_STATE_IDLE = 1, //
AXIS_STATE_STARTUP_SEQUENCE = 2, //
AXIS_STATE_FULL_CALIBRATION_SEQUENCE = 3, //
AXIS_STATE_MOTOR_CALIBRATION = 4, //
AXIS_STATE_SENSORLESS_CONTROL = 5, //
AXIS_STATE_ENCODER_INDEX_SEARCH = 6, //
AXIS_STATE_ENCODER_OFFSET_CALIBRATION = 7, //
AXIS_STATE_CLOSED_LOOP_CONTROL = 8, //
AXIS_STATE_LOCKIN_SPIN = 9, //
AXIS_STATE_ENCODER_DIR_FIND = 10,
[enum],命令 axis0 进入某个状态
AXIS_STATE_UNDEFINED = 0, //
AXIS_STATE_IDLE = 1, //
AXIS_STATE_STARTUP_SEQUENCE = 2, //
AXIS_STATE_FULL_CALIBRATION_SEQUENCE = 3, //
AXIS_STATE_MOTOR_CALIBRATION = 4, //
AXIS_STATE_SENSORLESS_CONTROL = 5, //
AXIS_STATE_ENCODER_INDEX_SEARCH = 6, //
AXIS_STATE_ENCODER_OFFSET_CALIBRATION = 7, //
AXIS_STATE_CLOSED_LOOP_CONTROL = 8, //
AXIS_STATE_LOCKIN_SPIN = 9, //
AXIS_STATE_ENCODER_DIR_FIND = 10,
[uint32_t],axis0 内部循环计数
[enum],电机锁定运行状态
LOCKIN_STATE_INACTIVE = 0,
LOCKIN_STATE_RAMP = 1,
LOCKIN_STATE_ACCELERATE = 2,
LOCKIN_STATE_CONST_VEL = 3,
axis0 看门狗手动喂狗
[bool],用来设置启动后是否自动进行电机校准
[bool],用来设置启动后是否自动进行编码器索引搜索
[bool],用来设置启动后是否自动进行编码器偏移校准
[bool],用来设置启动后是否自动进入闭环控制
[bool],用来设置启动后是否自动进入无感控制
[bool],是否启用 step/dir
[float],step/dir 每步对应电机移动距离,距离单位为编码器计数
[float],axis0 内部看门狗超时时间设置,单位为 [s]
[uint16_t],axis0 step 对应的 GPIO
[uint16_t],axis0 dir 对应的 GPIO
[float],电机开环旋转校准编码器时的电机电流,单位为 [A]
[float],电机开环旋转校准编码器时电流爬升到设置的电机电流所需的时间,单位为 [s]
[float],电机开环旋转校准编码器时转速爬升的距离,单位为 [rad]
[float],电机开环旋转校准编码器时转速爬升的加速度,单位为 [rad/s^2]
[float],电机开环旋转校准编码器时设定的转速,单位为 [rad/s]
[float],电机无感模式开环启动的电机电流,单位为 [A]
[float],电机无感模式开环启动的电流爬升时间,单位为 [s]
[float],电机无感模式开环启动的爬升距离,单位为 [rad]
[float],电机无感模式开环启动的加速度,单位为 [rad/s^2]
[float],电机无感模式开环启动的目标速度,单位为 [rad/s]
[float],电机无感模式开环启动的运行距离,单位为 [rad]
[bool],是否将达到目标转速作为开环启动结束标志
[bool],是否将达到目标距离作为开环启动结束标志
[float],开环运行模式下的电机电流,单位为 [A]
[float],开环运行模式下的电流爬升时间,单位为 [s]
[float],开环运行模式下的转速爬升距离,单位为 [rad]
[float],开环运行模式下的转速爬升速度,单位为 [rad/s^2]
[float],开环运行模式下的转速,单位为 [rad/s]
[float],开环运行模式下的运行距离,单位为 [rad]
[bool],是否将达到设定转速作为开环运行模式的结束条件
[bool],是否将达到设定运行距离作为开环运行模式的结束条件
[bool],是否将检测到编码器索引信号作为开环运行模式的结束条件
[enum],电机错误代码
ERROR_NONE = 0,
ERROR_PHASE_RESISTANCE_OUT_OF_RANGE = 0x0001,
ERROR_PHASE_INDUCTANCE_OUT_OF_RANGE = 0x0002,
ERROR_ADC_FAILED = 0x0004,
ERROR_DRV_FAULT = 0x0008,
ERROR_CONTROL_DEADLINE_MISSED = 0x0010,
ERROR_NOT_IMPLEMENTED_MOTOR_TYPE = 0x0020,
ERROR_BRAKE_CURRENT_OUT_OF_RANGE = 0x0040,
ERROR_MODULATION_MAGNITUDE = 0x0080,
ERROR_BRAKE_DEADTIME_VIOLATION = 0x0100,
ERROR_UNEXPECTED_TIMER_CALLBACK = 0x0200,
ERROR_CURRENT_SENSE_SATURATION = 0x0400,
ERROR_INVERTER_OVER_TEMP = 0x0800,
ERROR_CURRENT_UNSTABLE = 0x1000
[enum],电机PWM输出状态
ARMED_STATE_DISARMED = 0,
ARMED_STATE_WAITING_FOR_TIMINGS = 1,
ARMED_STATE_WAITING_FOR_UPDATE = 2,
ARMED_STATE_ARMED = 3,
[bool],电机是否已校准
[float],电机 B 相测量的电流,单位为 [A]
[float],电机 C 相测量的电流,单位为 [A]
[float],电机 B 相电流偏移量,单位为 [A]
[float],电机 C 相电流偏移量,单位为 [A]
[float],DRV8301 电流采样运放放大倍数的倒数
[flaot],由于温度升高而自动计算的电流限制值,单位为 [A]
[float],获取 axis0 mos管附近温度值,单位为 [℃]
[float],电流PI环的 P 值,此值根据电机相电感,相电阻自动计算生成,也可手动在此处调整,但是无法保存到FLASH,重启后手动设置的值将会消失
[float],电流PI环的 I 值,此值根据电机相电感,相电阻自动计算生成,也可手动在此处调整,但是无法保存到FLASH,重启后手动设置的值将会消失
[float],直轴电流环PI控制中的积分项,一般用来查看调试使用
[float],交轴电流环PI控制中的积分项,一般用来查看调试使用
[float],axis0 电机电流,此值为 Iq + Id,单位为 [A]
[float],最终输出到 SVM 的 Valpha
[float],最终输出到 SVM 的 Vbeta
[float],电流环控制输入的目标交轴电流值,单位为 [A]
[float],通过电流采样获取的交轴电流值,单位为 [A]
[float],通过电流采样获取的直轴电流值,单位为 [A]
[float],电流采样后对直轴交轴的电流低通滤波系数,默认为 1 不启用低通滤波,设置为 0 将完全截至,此值无法保存到 FLASH,重启后恢复为默认值 1
[float],根据设定的最大电流值和当前温度自动计算得出的当前最大允许电流,单位为 [A]
[float],根据实时计算的最大允许电流和设定的允许波动范围计算出的过流阈值,单位为 [A],超过此值将停止电机并报错 ERROR_CURRENT_SENSE_SATURATION
[enum],axis0 DRV8301 芯片内部错误代码
DRV8301_FaultType_NoFault = (0 << 0), //!< No fault
DRV8301_FaultType_FETLC_OC = (1 << 0), //!< FET Low side, Phase C Over Current fault
DRV8301_FaultType_FETHC_OC = (1 << 1), //!< FET High side, Phase C Over Current fault
DRV8301_FaultType_FETLB_OC = (1 << 2), //!< FET Low side, Phase B Over Current fault
DRV8301_FaultType_FETHB_OC = (1 << 3), //!< FET High side, Phase B Over Current fault
DRV8301_FaultType_FETLA_OC = (1 << 4), //!< FET Low side, Phase A Over Current fault
DRV8301_FaultType_FETHA_OC = (1 << 5), //!< FET High side, Phase A Over Current fault
DRV8301_FaultType_OTW = (1 << 6), //!< Over Temperature Warning fault
DRV8301_FaultType_OTSD = (1 << 7), //!< Over Temperature Shut Down fault
DRV8301_FaultType_PVDD_UV = (1 << 8), //!< Power supply Vdd Under Voltage fault
DRV8301_FaultType_GVDD_UV = (1 << 9), //!< DRV8301 Vdd Under Voltage fault
DRV8301_FaultType_GVDD_OV = (1 << 10) //!< DRV8301 Vdd Over Voltage fault
[bool],电机是否已经校准,设置为 True 时认为以下电机参数有效可用,如果不想每次重启重新校准电机参数可以设置为 True
[int32_t],电机极对数,可以查看电机数据手册或者数一下永磁体个数来获取极对数,极对数 = 电机永磁体个数 / 2
[float],电机校准时的电流大小,单位为 [A]
[float],电机校准自动检测相电阻时最大电压,单位为 [v]
[float],电机相电感,单位为 [H],此值会在执行电机校准后自动更新,如果您有详细的电机参数可以手动设置此值
[float],电机相电阻,单位为 [Ohm],此值会在执行电机校准后自动更新,如果您有详细的电机参数可以手动设置此值
[int32_t],电机运行方向,0 无效,1 和编码器方向一致 -1 和编码器方向相反,无感模式下需要手动设置方向,有感模式下会在编码器校准中自动设置
[enum],电机类型
MOTOR_TYPE_HIGH_CURRENT = 0,
MOTOR_TYPE_GIMBAL = 2
[float],电机最大运行电流,单位为 [A]
[float],超过电机最大运行电流的容忍度,如:此值设置为 1.2 表示当实际电流达到 1.2 倍的 current_lim 时停止电机并报错
[float],axis0 mos 驱动桥温度区间下限,单位为 [℃],当温度高于此温度时会开始降低最大允许电流,根据此温度和 inverter_temp_limit_upper 计算出限制的强度
[float],axis0 mos 驱动桥温度区间上限,单位为 [℃],根据此温度和 inverter_temp_limit_lower 计算出限制电机电流的强度
[float],电机运行的电流范围,单位为 [A],根据此值来自动调整电流采样运放的增益,设置后需要保存配置并重启才能生效
[float],电流控制环的控制带宽,用来自动计算电流环 PI 参数,加减速比较缓慢的电机此参数应该越低
[enum],axis0 控制器错误代码
ERROR_NONE = 0,
ERROR_OVERSPEED = 0x01,
[float],电机目标位置,单位为编码器计数为单位,此值将直接作为位置控制环中的输入值
[float],电机目标转速,单位为 [count/s],此值将直接作为速度控制环中的输入值
[float],速度控制环中的实时误差积分
[float],电机目标电流,单位为 [A],此值将直接作为电流控制环中的输入值
[float],电机转速爬升目标,单位为 [rad/s],只有 odrv0.axis0.controller.vel_ramp_enable 设置为 True 时才有效
[bool],是否启用转速爬升功能,转速爬升速率通过 odrv0.axis0.controller.config.vel_ramp_rate 进行设置
设置目标位置,pos_setpoint 目标位置,vel_feed_forward 速度前馈,current_feed_forward 电流前馈
设置目标转速,vel_setpoint 目标转速,current_feed_forward 电流前馈
设置目标电流,current_setpoint 目标电流
梯形轨迹模式下转动到目标位置,pos_setpoint 目标位置,以编码器计数为单位
梯形轨迹模式下转动目标距离,displacement 转动距离,以编码器计数为单位,from_goal_point 是否以上次设定的目标位置为起点
开始 anticogg 校准,此项功能目前不可用,处于验证阶段
[enum],控制模式
CTRL_MODE_VOLTAGE_CONTROL = 0,
CTRL_MODE_CURRENT_CONTROL = 1,
CTRL_MODE_VELOCITY_CONTROL = 2,
CTRL_MODE_POSITION_CONTROL = 3,
CTRL_MODE_TRAJECTORY_CONTROL = 4
[float],位置环增益
[float],速度环增益
[float],速度环积分增益
[float],最大转速,单位为 [counts/s] ,当转速超过此值将会报错 ERROR_OVERSPEED
[float],最大转速波动容忍度,如:此值设定为 1.2 时表示当转速超过设定的最大转速值得 1.2 倍才会触发 ERROR_OVERSPEED
[float],转速爬升时得爬升速率,单位为 [(counts/s) / s]
[bool],是否启用环形控制模式,此模式对于连续的增量位置移动很有用。 例如,机器人会无限期滚动,或者挤出机马达或传送带会以受控的增量无限期地移动。在常规位置模式下,pos_setpoint
将增长到非常大的值,并且由于浮点舍入而失去精度
[enum],编码器错误代码
ERROR_NONE = 0,
ERROR_UNSTABLE_GAIN = 0x01,
ERROR_CPR_OUT_OF_RANGE = 0x02,
ERROR_NO_RESPONSE = 0x04,
ERROR_UNSUPPORTED_ENCODER_MODE = 0x08,
ERROR_ILLEGAL_HALL_STATE = 0x10,
ERROR_INDEX_NOT_FOUND_YET = 0x20,
[bool],编码器是否准备就绪
[bool],是否检测到编码器索引信号
[int32_t],编码器累计计数,当编码器计数增加或减少时此值将累加编码器计数值的变化量
[int32_t],编码器累计计数在 cpr 范围内的值
[float],编码器当前插补值
[float],通过编码器计算得到的当前电角度,范围为 -pi~+pi
[float],当前预测到的位置值,单位为 [counts]
[float],当前约束在 cpr 范围内的位置值,单位为 [counts]
[uint8_t],当前霍尔信号状态,位码表示
[float],当前估算转速,单位为 [count/s]
[float],执行编码器偏移校准时的中间值,用来调试使用
手动设置当前编码器计数值
[enum],编码器类型
MODE_INCREMENTAL = 0,
MODE_HALL = 1,
MODE_SINCOS = 2,
[bool],是否使用编码器索引信号
[bool],是否只在 lockin 匀速运行时检测索引信号
[bool],编码器是否事先已被校准
[bool],是否将索引信号位置设置为编码器计数0的位置
[int32_t],编码器转动每圈脉冲数,注意和编码器手册中的每转产生的脉冲数(PPR)区分,cpr = PPR * 4
[int32_t],编码器和转子电角度之间的相位差,进行编码器偏移校准之后此项自动更新
[float],编码器和转子电角度之间的相位差浮点部分,进行编码器偏移校准之后此项自动更新
[bool],是否启用根据转速插补编码器相位
[float],编码器更新带宽,设置后立即生效,使用的编码器分辨率越高此项应该约高
[float],通过编码器cpr检查所需的精度,用于在执行编码器偏移校准时编码器的实际输出计算的移动距离和电机开环步进移动距离之间允许的最大误差,超过此误差将报错 ERROR_CPR_OUT_OF_RANGE
[float],编码器偏移校准时转动的距离,单位为 [rad],此值越大校准精度相对越高,但是同时校准所需的时间越长
[float],编码器偏移校准时的转动速度,单位为 [rad/s]
[bool],是否只在方向被设置的情况下运行索引搜索
[bool],是否检测错误的霍尔信号
[enum] 无感观测器错误代码
ERROR_NONE = 0,
ERROR_UNSTABLE_GAIN = 0x01,
[float],无感观测器输出相位,单位为 [rad]
[float],无感观测器锁相环输出的位置,单位为 [rad]
[float],无感观测器估算的转速,单位为 [rad/s]
[float],无感观测器的增益,单位为 [rad/s]
[float],无感观测器的锁相环带宽,单位为 [rad/s]
[float],电机磁链,单位为 [V / (rad/s)],观测器需要使用此参数进行观测,可以通过公式 {5.51328895422 / ( *
[float],梯形轨迹控制模式下的最高转速,单位为 [count/s]
[float],梯形轨迹控制模式下加速时的加速度,单位为 [count/s^2]
[float],梯形轨迹控制模式下减速时的加速度,单位为 [count/s^2]
[float],梯形轨迹控制模式下加减速时的电流前馈,单位为 [A/(count/s^2)]
如果您有任何问题或疑问,欢迎您加入ODrive社区或QQ群 851421965 进行交流。