本文主要是结合本店电机,通过配置的参数,快速实现对电机的控制。
店铺链接:https://item.taobao.com/item.htm?ft=t&id=643573104607



注意:速度PID只用了P参数,只是为了让电机转起来,非最佳配置
//5008电机AS5047P_ABI接口,接在M0上,电源电压12V,24V用以下配置也可以
odrv0.vbus_voltage //查看电压
odrv0.erase_configuration() //清除之前的配置,恢复默认配置
odrv0.axis0.motor.config.motor_type = MOTOR_TYPE_HIGH_CURRENT //设置电机类型
odrv0.axis0.encoder.config.mode = ENCODER_MODE_INCREMENTAL //选择编码器类型
odrv0.axis0.encoder.config.cpr = 4000 //默认8192,AS5047P=4000,TLE5012B=16384
odrv0.axis0.controller.config.vel_gain = 0.05 //默认0.167,速度环P参数
odrv0.axis0.controller.config.vel_integrator_gain = 0 //默认0.33333,速度环I参数
odrv0.axis0.controller.config.vel_limit = 100 //默认2,限制最大转速
odrv0.axis0.controller.config.input_mode = INPUT_MODE_VEL_RAMP //为2,速度爬升模式,否则速度变化时“噔”一声
odrv0.axis0.controller.config.vel_ramp_rate = 100 //默认1,非常小,加速度
odrv0.axis0.motor.config.pole_pairs = 7 //默认7
odrv0.axis0.motor.config.calibration_current = 5 //默认10,10=0.88A,5=0.3A(万用表测母线电流)
odrv0.save_configuration() //保存参数
odrv0.reboot() //重启
odrv0.axis0.requested_state = AXIS_STATE_FULL_CALIBRATION_SEQUENCE //电机校准,2秒后“哔”一声,然后正反转一圈
odrv0.axis0.error //查看是否有错误
odrv0.axis0.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL //设置为速度模式
odrv0.axis0.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL //进入闭环,电流会增加约50mA
odrv0.axis0.controller.input_vel = 10 //速度限制会影响最大转速
odrv0.axis0.controller.input_vel = 0
odrv0.axis0.requested_state = AXIS_STATE_IDLE //进入空闲模式
SPI接M0端子,进入闭环后电机稍微动一下就报错,查看错误:ENCODER_ERROR_ABS_SPI_COM_FAIL,
百度后找到这个:https://www.bilibili.com/read/cv12631507/。
应该跟ODrive的电源是通过M0的DRV8301降压有关,用M1接口控制不再报错。
注意:速度PID只用了P参数,只是为了让电机转起来,非最佳配置

//5008电机AS5047P_SPI接口,接在M1上,电源电压12V,24V也可以
odrv0.erase_configuration() //清除之前的配置,恢复默认配置
odrv0.axis1.motor.config.motor_type = MOTOR_TYPE_HIGH_CURRENT //设置电机类型
odrv0.axis1.encoder.config.abs_spi_cs_gpio_pin = 4 //选择CS引脚
odrv0.axis1.encoder.config.mode = ENCODER_MODE_SPI_ABS_AMS //设置编码器类型
odrv0.axis1.encoder.config.cpr = 2**14 //14bit
odrv0.axis1.controller.config.vel_gain = 0.05 //默认0.167,速度环P参数
odrv0.axis1.controller.config.vel_integrator_gain = 0 //默认0.33333,速度环I参数
odrv0.axis1.controller.config.vel_limit = 50 //默认2,限制最大转速
odrv0.axis1.controller.config.input_mode = INPUT_MODE_VEL_RAMP //为2,速度爬升模式,否则速度变化时“噔”一声
odrv0.axis1.controller.config.vel_ramp_rate = 100 //默认1,非常小,加速度
odrv0.axis1.motor.config.pole_pairs = 7 //默认7
odrv0.axis1.motor.config.calibration_current = 5 //默认10,10=0.88A,5=0.3A(万用表测母线电流)
odrv0.save_configuration() //保存参数
odrv0.reboot() //重启
odrv0.axis1.requested_state = AXIS_STATE_FULL_CALIBRATION_SEQUENCE //电机校准,2秒后“哔”一声,然后正反转一圈
odrv0.axis1.error //查看是否有错误
odrv0.axis1.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL //设置为速度模式
odrv0.axis1.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL //进入闭环,电流会增加约50mA
odrv0.axis1.controller.input_vel = 10 //设置速度,速度限制会影响最大转速
odrv0.axis1.controller.input_vel = 0
odrv0.axis1.requested_state = AXIS_STATE_IDLE //进入空闲模式
去掉编码器接线,就是无感控制
//无感模式配置,5008电机,KV335
odrv0.erase_configuration() //清除之前的配置,恢复默认配置
odrv0.axis0.motor.config.motor_type = MOTOR_TYPE_HIGH_CURRENT //默认0,就是HIGH_CURRENT,设置电机类型
odrv0.axis0.controller.config.vel_gain = 0.02 //默认0.167,速度环P参数
odrv0.axis0.controller.config.vel_integrator_gain = 0.00 //默认0.33333,速度环I参数
odrv0.axis0.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL //设置为速度模式
odrv0.axis0.controller.config.vel_limit = 100 //默认2,限制最大转速
odrv0.axis0.controller.config.input_mode = INPUT_MODE_VEL_RAMP //为2,速度爬升模式
odrv0.axis0.controller.config.vel_ramp_rate = 100 //默认1,非常小,加速度
odrv0.axis0.motor.config.current_lim = 20 //默认10
odrv0.axis0.motor.config.direction = 1 //默认0,设定电机转向,必须配置
odrv0.axis0.sensorless_estimator.config.pm_flux_linkage = 5.51328895422 / (7 * 335) //永磁磁链配置,极对数=7,KV335
odrv0.axis0.motor.config.calibration_current = 5 //默认10,5=0.38A
odrv0.save_configuration()
odrv0.reboot()
odrv0.axis0.requested_state = AXIS_STATE_MOTOR_CALIBRATION //电机校准,2秒后“哔”一声结束
odrv0.axis0.error //查看是否有错误
odrv0.axis0.controller.input_vel = 10
odrv0.axis0.requested_state = AXIS_STATE_SENSORLESS_CONTROL //电机启动并运行,vel=10
odrv0.axis0.controller.input_vel = 50 //设置目标速度,最大速度为限制速度
odrv0.axis0.controller.input_vel = 0
odrv0.axis0.requested_state = AXIS_STATE_IDLE //进入空闲模式,重新启动需

//3505电机AS5047P_ABI接口,接在M0上,电源电压12V
odrv0.erase_configuration() //清除之前的配置,恢复默认配置
odrv0.axis0.motor.config.motor_type = MOTOR_TYPE_HIGH_CURRENT //设置电机类型
odrv0.axis0.encoder.config.mode = ENCODER_MODE_INCREMENTAL //选择编码器类型
odrv0.axis0.encoder.config.cpr = 4000 //默认8192,AS5047P=4000,TLE5012B=16384
odrv0.axis0.controller.config.vel_gain = 0.03 //默认0.167,速度环P参数
odrv0.axis0.controller.config.vel_integrator_gain = 0 //默认0.33333,速度环I参数
odrv0.axis0.controller.config.vel_limit = 100 //默认2,限制最大转速
odrv0.axis0.controller.config.input_mode = INPUT_MODE_VEL_RAMP //为2,速度爬升模式,否则速度变化时“噔”一声
odrv0.axis0.controller.config.vel_ramp_rate = 100 //默认1,非常小,加速度
odrv0.axis0.motor.config.pole_pairs = 10 //默认7,3505电机10对极
odrv0.axis0.motor.config.calibration_current = 4 //默认10,4=0.33A(万用表测母线电流)
odrv0.save_configuration() //保存参数
odrv0.reboot() //重启
odrv0.axis0.requested_state = AXIS_STATE_FULL_CALIBRATION_SEQUENCE //电机校准,2秒后“哔”一声,然后正反转一圈
odrv0.axis0.error //查看是否有错误
odrv0.axis0.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL //设置为速度模式
odrv0.axis0.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL //进入闭环,电流会增加约50mA
odrv0.axis0.controller.input_vel = 10 //速度限制会影响最大转速
odrv0.axis0.controller.input_vel = 0
odrv0.axis0.requested_state = AXIS_STATE_IDLE //进入空闲模式

//3505电机AS5047P_SPI接口,接在M1上,12V供电,
odrv0.erase_configuration() //清除之前的配置,恢复默认配置
odrv0.axis1.motor.config.motor_type = MOTOR_TYPE_HIGH_CURRENT //设置电机类型
odrv0.axis1.encoder.config.abs_spi_cs_gpio_pin = 4 //选择CS引脚
odrv0.axis1.encoder.config.mode = ENCODER_MODE_SPI_ABS_AMS //设置编码器类型
odrv0.axis1.encoder.config.cpr = 2**14 //14bit
odrv0.axis1.controller.config.vel_gain = 0.03 //默认0.167,速度环P参数
odrv0.axis1.controller.config.vel_integrator_gain = 0 //默认0.33333,速度环I参数
odrv0.axis1.controller.config.vel_limit = 100 //默认2,限制最大转速
odrv0.axis1.controller.config.input_mode = INPUT_MODE_VEL_RAMP //为2,速度爬升模式,否则速度变化时“噔”一声
odrv0.axis1.controller.config.vel_ramp_rate = 100 //默认1,非常小,加速度
odrv0.axis1.motor.config.pole_pairs = 10 //默认7
odrv0.axis1.motor.config.calibration_current = 4 //默认10,4=0.33A(万用表测母线电流)
odrv0.save_configuration() //保存参数
odrv0.reboot() //重启
odrv0.axis1.requested_state = AXIS_STATE_FULL_CALIBRATION_SEQUENCE //电机校准,2秒后“哔”一声,然后正反转一圈
odrv0.axis1.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL //设置为速度模式
odrv0.axis1.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL //进入闭环,电流会增加约50mA
odrv0.axis1.controller.input_vel = 10 //设置速度,速度限制会影响最大转速
odrv0.axis1.controller.input_vel = 0
odrv0.axis1.requested_state = AXIS_STATE_IDLE //进入空闲模式
//无感模式配置,3505电机,KV650,12V供电
odrv0.erase_configuration()
odrv0.axis0.motor.config.motor_type = MOTOR_TYPE_HIGH_CURRENT //默认0,就是HIGH_CURRENT
odrv0.axis0.controller.config.vel_gain = 0.01 //默认0.167,速度环P参数
odrv0.axis0.controller.config.vel_integrator_gain = 0.00 //默认0.33333,速度环I参数
odrv0.axis0.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL //设置为速度模式
odrv0.axis0.controller.config.vel_limit = 100 //默认2,限制最大转速
odrv0.axis0.controller.config.input_mode = INPUT_MODE_VEL_RAMP //为2,速度梯形轨迹模式
odrv0.axis0.controller.config.vel_ramp_rate = 100 //默认1,加速度。10非常小,
odrv0.axis0.motor.config.current_lim = 15 //默认10
odrv0.axis0.motor.config.pole_pairs = 10 //默认7
odrv0.axis0.motor.config.direction = 1 //默认0,设定电机转向
odrv0.axis0.sensorless_estimator.config.pm_flux_linkage = 5.51328895422 / (10 * 650) //永磁磁链配置,极对数=10,KV650
odrv0.axis0.motor.config.calibration_current = 4 //默认10,5=0.43A,4=0.32A(万用表观测电流)
odrv0.save_configuration()
odrv0.reboot()
odrv0.axis0.requested_state = AXIS_STATE_MOTOR_CALIBRATION //大约2秒后电机“哔”一声结束
odrv0.axis0.controller.input_vel = 10 //设置目标速度
odrv0.axis0.requested_state = AXIS_STATE_SENSORLESS_CONTROL //电机开始启动并运行,vel=10
odrv0.axis0.controller.input_vel = 50 //设置目标速度,最大速度为限制速度
odrv0.axis0.requested_state = AXIS_STATE_IDLE
//50=0.25A@12V
//转速到60或者更高时,电机会发生错误并停止,无论接M0或M1都是这样
//查看错误:dump_errors(odrv0)
不接放电电阻时提示:
axis:AXIS_ERROR_MOTOR_FAILED
motor:MOTOR_ERROR_CURRENT_LIMIT_VIOLATION
接放电电阻时提示:
axis:AXIS_ERROR_BRAKE_RESISTOR_DISARMED / AXIS_ERROR_MOTOR_FAILED
motor:MOTOR_ERROR_DC_BUS_OVER_REGEN_CURRENT
总之速度不能设置的太高,具体原因不清楚
//无感模式配置,3505电机,KV650,12V供电,接M1接口,和M0的接口效果一样
odrv0.erase_configuration()
odrv0.axis1.motor.config.motor_type = MOTOR_TYPE_HIGH_CURRENT //默认0,就是HIGH_CURRENT
odrv0.axis1.controller.config.vel_gain = 0.01 //默认0.167,速度环P参数
odrv0.axis1.controller.config.vel_integrator_gain = 0.00 //默认0.33333,速度环I参数
odrv0.axis1.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL //设置为速度模式
odrv0.axis1.controller.config.vel_limit = 100 //默认2,限制最大转速
odrv0.axis1.controller.config.input_mode = INPUT_MODE_VEL_RAMP //为2,速度梯形轨迹模式
odrv0.axis1.controller.config.vel_ramp_rate = 100 //默认1,加速度。10非常小
odrv0.axis1.motor.config.current_lim = 15 //默认10
odrv0.axis1.motor.config.pole_pairs = 10 //默认7
odrv0.axis1.motor.config.direction = 1 //默认0,设定电机转向
odrv0.axis1.sensorless_estimator.config.pm_flux_linkage = 5.51328895422 / (10 * 650) //永磁磁链配置,极对数=10,KV650
odrv0.axis1.motor.config.calibration_current = 4 //默认10,5=0.43A,4=0.32A(万用表观测电流)
odrv0.save_configuration()
odrv0.reboot()
odrv0.axis1.requested_state = AXIS_STATE_MOTOR_CALIBRATION //大约2秒后电机“哔”一声结束
odrv0.axis1.controller.input_vel = 10 //设置目标速度
odrv0.axis1.requested_state = AXIS_STATE_SENSORLESS_CONTROL //电机开始启动并运行,vel=10
odrv0.axis1.controller.input_vel = 50 //设置目标速度,最大速度为限制速度
odrv0.axis1.requested_state = AXIS_STATE_IDLE

请参考2.2.1,TLE5012B的ABI接口配置与AS5047P的ABI接口配置,除了CPR需要修改,其它参数配置相同。
请参考2.2.3。

//2808电机AS5047P_ABI接口,接在M0上,电源电压12V
odrv0.erase_configuration() //清除之前的配置,恢复默认配置
odrv0.axis0.motor.config.motor_type = MOTOR_TYPE_HIGH_CURRENT //设置电机类型
odrv0.axis0.encoder.config.mode = ENCODER_MODE_INCREMENTAL //选择编码器类型
odrv0.axis0.encoder.config.cpr = 4000 //默认8192,AS5047P=4000,TLE5012B=16384
odrv0.axis0.controller.config.vel_gain = 0.03 //默认0.167,速度环P参数
odrv0.axis0.controller.config.vel_integrator_gain = 0 //默认0.33333,速度环I参数
odrv0.axis0.controller.config.vel_limit = 100 //默认2,限制最大转速
odrv0.axis0.controller.config.input_mode = INPUT_MODE_VEL_RAMP //为2,速度爬升模式,否则速度变化时“噔”一声
odrv0.axis0.controller.config.vel_ramp_rate = 100 //默认1,非常小,加速度
odrv0.axis0.motor.config.pole_pairs = 7 //默认7
odrv0.axis0.motor.config.calibration_current = 5 //默认10,10=0.88A,5=0.38A(万用表测母线电流)
odrv0.save_configuration() //保存参数
odrv0.reboot() //重启
odrv0.axis0.requested_state = AXIS_STATE_FULL_CALIBRATION_SEQUENCE //电机校准,2秒后“哔”一声,然后正反转一圈
odrv0.axis0.error //查看是否有错误
odrv0.axis0.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL //设置为速度模式
odrv0.axis0.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL //进入闭环,电流会增加约50mA
odrv0.axis0.controller.input_vel = 10 //速度限制会影响最大转速
odrv0.axis0.controller.input_vel = 0
odrv0.axis0.requested_state = AXIS_STATE_IDLE //进入空闲模式

//2808电机AS5047P_SPI接口,接在M1上,电源电压12V
odrv0.erase_configuration() //清除之前的配置,恢复默认配置
odrv0.axis1.motor.config.motor_type = MOTOR_TYPE_HIGH_CURRENT //设置电机类型
odrv0.axis1.encoder.config.abs_spi_cs_gpio_pin = 4 //选择CS引脚
odrv0.axis1.encoder.config.mode = ENCODER_MODE_SPI_ABS_AMS //设置编码器类型
odrv0.axis1.encoder.config.cpr = 2**14 //14bit
odrv0.axis1.controller.config.vel_gain = 0.03 //默认0.167,速度环P参数
odrv0.axis1.controller.config.vel_integrator_gain = 0 //默认0.33333,速度环I参数
odrv0.axis1.controller.config.vel_limit = 50 //默认2,限制最大转速
odrv0.axis1.controller.config.input_mode = INPUT_MODE_VEL_RAMP //为2,速度爬升模式,否则速度变化时“噔”一声
odrv0.axis1.controller.config.vel_ramp_rate = 100 //默认1,非常小,加速度
odrv0.axis1.motor.config.pole_pairs = 7 //默认7
odrv0.axis1.motor.config.calibration_current = 5 //默认10,10=0.88A,5=0.3A(万用表测母线电流)
odrv0.save_configuration() //保存参数
odrv0.reboot() //重启
odrv0.axis1.requested_state = AXIS_STATE_FULL_CALIBRATION_SEQUENCE //电机校准,2秒后“哔”一声,然后正反转一圈
odrv0.axis1.error //查看是否有错误
odrv0.axis1.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL //设置为速度模式
odrv0.axis1.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL //进入闭环,电流会增加约50mA
odrv0.axis1.controller.input_vel = 10 //设置速度,速度限制会影响最大转速
odrv0.axis1.controller.input_vel = 0
odrv0.axis1.requested_state = AXIS_STATE_IDLE //进入空闲模式
//无感模式配置,2808电机,KV630,12V供电,
odrv0.erase_configuration()
odrv0.axis0.controller.config.vel_gain = 0.01 //默认0.167,速度环P参数
odrv0.axis0.controller.config.vel_integrator_gain = 0 //默认0.33333,速度环I参数
odrv0.axis0.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL //设置为速度模式
odrv0.axis0.controller.config.vel_limit = 100 //默认2,限制最大转速
odrv0.axis0.controller.config.input_mode = INPUT_MODE_VEL_RAMP //为2,速度梯形轨迹模式
odrv0.axis0.controller.config.vel_ramp_rate = 100 //默认1,加速度。10非常小,半天才加速上去
odrv0.axis0.motor.config.current_lim = 20 //默认10
odrv0.axis0.motor.config.pole_pairs = 7 //默认7
odrv0.axis0.motor.config.direction = 1 //默认0,设定电机转向
odrv0.axis0.sensorless_estimator.config.pm_flux_linkage = 5.51328895422 / (7 * 630) //永磁磁链配置,极对数=7,KV630
odrv0.axis0.motor.config.calibration_current = 4 //默认10,4=0.37A(万用表观测电流)
odrv0.save_configuration()
odrv0.reboot()
odrv0.axis0.requested_state = AXIS_STATE_MOTOR_CALIBRATION //大约2秒后电机“哔”一声结束,0.45A
odrv0.axis0.error //查看是否有错误
odrv0.axis0.controller.input_vel = 10 //启动后的速度,不能太大,否则启动容易失败
odrv0.axis0.requested_state = AXIS_STATE_SENSORLESS_CONTROL //电机开始启动,vel=5
odrv0.axis0.controller.input_vel = 10 //设置目标速度,最大速度为限制速度
odrv0.axis0.requested_state = AXIS_STATE_IDLE

请参考2.4.1。TLE5012B的ABI接口配置与AS5047P的ABI接口配置,除了CPR需要修改,其它参数配置相同。
请参考2.4.3。