ODrive、VESC和SimpleFOC 教程链接汇总:请点此链接
说明
本文主要结合本店的驱动器和电机,快速实现对电机的控制。
- 关于ODrive的操作教程网上有很多,本节只是尽可能用最少的配置让电机转起来,不保证参数为最佳设置,
- ODrive版本v0.5.1,
- ABZ和ABI的叫法不同,指的都是一种编码器。
一、5008航模电机标配AS5047P
ODrive 购买链接:https://item.taobao.com/item.htm?ft=t&id=644329838237,图锐科技
电机 购买链接:https://item.taobao.com/item.htm?ft=t&id=643573104607,图锐科技
1.1、接ABZ接口
//5008电机AS5047P_ABI接口,接在M0上,电源电压12V,24V用以下配置也可以
odrv0.vbus_voltage //查看电压
odrv0.erase_configuration() //清除之前的配置,恢复默认配置
odrv0.config.dc_bus_overvoltage_trip_level = 56
odrv0.config.dc_max_positive_current = 30
odrv0.config.dc_max_negative_current = -5
odrv0.axis0.motor.config.motor_type = MOTOR_TYPE_HIGH_CURRENT //设置电机类型
odrv0.axis0.motor.config.pole_pairs = 7 //默认7
odrv0.axis0.motor.config.calibration_current = 5 //默认10,10=0.88A,5=0.3A(万用表测母线电流)
odrv0.axis0.encoder.config.mode = ENCODER_MODE_INCREMENTAL //选择编码器类型
odrv0.axis0.encoder.config.cpr = 4000 //AS5047P=4000,TLE5012B=16384
odrv0.axis0.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL //设置为速度模式
odrv0.axis0.controller.config.vel_gain = 0.02 //默认0.167,速度环P参数
odrv0.axis0.controller.config.vel_integrator_gain = 0.2 //默认0.33333,速度环I参数
odrv0.axis0.controller.config.vel_limit = 100 //默认2,限制最大转速
odrv0.axis0.controller.config.input_mode = INPUT_MODE_VEL_RAMP //速度爬升模式,否则速度变化时“噔”一声
odrv0.axis0.controller.config.vel_ramp_rate = 50 //默认1非常小
odrv0.save_configuration() //保存参数
odrv0.reboot() //重启
odrv0.axis0.requested_state = AXIS_STATE_FULL_CALIBRATION_SEQUENCE //电机校准,2秒后“哔”一声,然后正反转一圈
odrv0.axis0.error //查看是否有错误
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 //进入空闲模式
1.2、接SPI接口
-
用官方的ODrive板子:
SPI接M0端子,进入闭环后电机稍微动一下就报错,查看错误:ENCODER_ERROR_ABS_SPI_COM_FAIL,
百度后找到这个:https://www.bilibili.com/read/cv12631507/。
用M1接口控制好点,但是转速不能过高,否则也报错。
应该跟ODrive的电源是通过M0的DRV8301降压有关,或者单片机和两路DRV8301通过SPI通信,导致SPI复用过多。
(本人实际测试,仅对我测试的板子负责) -
本店改版后的ODrive,使用单独的电源芯片,并且SPI接口没有过多复用,不存在这个问题,M0/M1都能很好的转动。
//5008电机AS5047P_SPI接口,接在M0上,电源电压12V,24V也可以
odrv0.erase_configuration() //清除之前的配置,恢复默认配置
odrv0.config.dc_bus_overvoltage_trip_level = 56
odrv0.config.dc_max_positive_current = 30
odrv0.config.dc_max_negative_current = -5
odrv0.axis0.motor.config.motor_type = MOTOR_TYPE_HIGH_CURRENT //设置电机类型
odrv0.axis0.motor.config.pole_pairs = 7 //默认7
odrv0.axis0.motor.config.calibration_current = 5 //默认10,10=0.88A,5=0.3A(万用表测母线电流)
odrv0.axis0.encoder.config.mode = ENCODER_MODE_SPI_ABS_AMS //设置编码器类型
odrv0.axis0.encoder.config.abs_spi_cs_gpio_pin = 1 //选择CS引脚
odrv0.axis0.encoder.config.cpr = 2**14 //14bit
odrv0.axis0.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL //设置为速度模式
odrv0.axis0.controller.config.vel_gain = 0.02 //默认0.167,速度环P参数
odrv0.axis0.controller.config.vel_integrator_gain = 0.2 //默认0.33333,速度环I参数
odrv0.axis0.controller.config.vel_limit = 100 //默认2,限制最大转速
odrv0.axis0.controller.config.input_mode = INPUT_MODE_VEL_RAMP //速度爬升模式,否则速度变化时“噔”一声
odrv0.axis0.controller.config.vel_ramp_rate = 50 //默认1非常小
odrv0.save_configuration() //保存参数
odrv0.reboot() //重启
odrv0.axis0.requested_state = AXIS_STATE_FULL_CALIBRATION_SEQUENCE //电机校准,2秒后“哔”一声,然后正反转一圈
odrv0.axis0.error //查看是否有错误
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 //进入空闲模式
1.3、无感模式
去掉编码器接线,就是无感控制
//无感模式配置,5008电机,KV335,固件0.5.1
odrv0.erase_configuration() //清除之前的配置,恢复默认配置
odrv0.config.dc_bus_overvoltage_trip_level = 56
odrv0.config.dc_max_positive_current = 30
odrv0.config.dc_max_negative_current = -5
odrv0.axis0.motor.config.motor_type = MOTOR_TYPE_HIGH_CURRENT //设置电机类型
odrv0.axis0.motor.config.current_lim = 20 //默认10
odrv0.axis0.motor.config.direction = 1 //默认0,设定电机转向,必须配置
odrv0.axis0.motor.config.calibration_current = 5 //默认10,5=0.38A
odrv0.axis0.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL //设置为速度模式
odrv0.axis0.controller.config.vel_gain = 0.01 //默认0.167,速度环P参数
odrv0.axis0.controller.config.vel_integrator_gain = 0.05 //默认0.33333,速度环I参数
odrv0.axis0.controller.config.vel_limit = 100 //默认2,限制最大转速
odrv0.axis0.controller.config.input_mode = INPUT_MODE_VEL_RAMP //速度爬升模式
odrv0.axis0.controller.config.vel_ramp_rate = 50 //默认1非常小
odrv0.axis0.sensorless_estimator.config.pm_flux_linkage = 5.51328895422 / (7 * 335) //永磁磁链配置,极对数=7,KV335
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 //进入空闲模式
固件0.5.6和0.5.1的配置稍微有点差异,下面说下0.5.6版本的配置:
//无感模式配置,5008电机,KV335,固件0.5.6
odrv0.erase_configuration()
odrv0.config.dc_bus_overvoltage_trip_level = 56
odrv0.config.dc_max_positive_current = 30
odrv0.config.dc_max_negative_current = -5
odrv0.axis0.motor.config.motor_type = MOTOR_TYPE_HIGH_CURRENT
odrv0.axis0.motor.config.current_lim = 20 //默认10
//odrv0.axis0.encoder.config.direction = 1 //0.5.1版本是motor.config,在0.5.6 此句可以不配置
odrv0.axis0.motor.config.calibration_current = 5 //默认10,5=0.38A
odrv0.axis0.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL //设置为速度模式
odrv0.axis0.controller.config.vel_gain = 0.01 //默认0.167,速度环P参数
odrv0.axis0.controller.config.vel_integrator_gain = 0.05 //默认0.33333,速度环I参数
odrv0.axis0.controller.config.vel_limit = 100 //默认2,限制最大转速
odrv0.axis0.controller.config.input_mode = INPUT_MODE_VEL_RAMP //速度爬升模式
odrv0.axis0.controller.config.vel_ramp_rate = 50 //默认1非常小
odrv0.axis0.config.enable_sensorless_mode = True //0.5.6版本 需要配置为无感模式
odrv0.axis0.sensorless_estimator.config.pm_flux_linkage = 5.51328895422 / (7 * 335) //永磁磁链配置,极对数=7,KV335
odrv0.save_configuration()
odrv0.reboot()
odrv0.axis0.requested_state = AXIS_STATE_MOTOR_CALIBRATION //电机校准,2秒后“哔”一声结束
odrv0.axis0.error
odrv0.axis0.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL //进入闭环,电机转速约 9 turn/s
odrv0.axis0.controller.input_vel = 50 //设置目标速度,最大速度为限制速度
odrv0.axis0.controller.input_vel = 0
odrv0.axis0.requested_state = AXIS_STATE_IDLE //进入空闲模式
二、同时控制两个3505电机
ODrive 购买链接:https://item.taobao.com/item.htm?ft=t&id=644329838237,图锐科技
电机 购买链接:https://item.taobao.com/item.htm?ft=t&id=643573104607,图锐科技
//3505电机AS5047P_ABZ接口,电源电压12V
odrv0.erase_configuration()
odrv0.config.dc_bus_overvoltage_trip_level = 56
odrv0.config.dc_max_positive_current = 30
odrv0.config.dc_max_negative_current = -5
odrv0.axis0.motor.config.motor_type = MOTOR_TYPE_HIGH_CURRENT
odrv0.axis0.motor.config.pole_pairs = 10 //默认7,3505电机10对极
odrv0.axis0.motor.config.calibration_current = 4 //默认10,4=0.33A(万用表测母线电流)
odrv0.axis0.encoder.config.mode = ENCODER_MODE_INCREMENTAL //选择编码器类型
odrv0.axis0.encoder.config.cpr = 4000 //AS5047P=4000,TLE5012B=16384
odrv0.axis0.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL //设置为速度模式
odrv0.axis0.controller.config.vel_gain = 0.02 //默认0.167,速度环P参数
odrv0.axis0.controller.config.vel_integrator_gain = 0.2 //默认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 = 50 //默认1非常小
odrv0.axis1.motor.config.motor_type = MOTOR_TYPE_HIGH_CURRENT
odrv0.axis1.motor.config.pole_pairs = 10
odrv0.axis1.motor.config.calibration_current = 4
odrv0.axis1.encoder.config.mode = ENCODER_MODE_INCREMENTAL //选择编码器类型
odrv0.axis1.encoder.config.cpr = 16384
odrv0.axis1.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL
odrv0.axis1.controller.config.vel_gain = 0.02
odrv0.axis1.controller.config.vel_integrator_gain = 0.2
odrv0.axis1.controller.config.vel_limit = 100
odrv0.axis1.controller.config.input_mode = INPUT_MODE_VEL_RAMP
odrv0.axis1.controller.config.vel_ramp_rate = 50
odrv0.save_configuration() //保存参数
odrv0.reboot() //重启
odrv0.axis0.requested_state = AXIS_STATE_FULL_CALIBRATION_SEQUENCE //电机校准,2秒后“哔”一声,然后正反转一圈
odrv0.axis0.error //查看是否有错误
odrv0.axis0.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL //进入闭环,电流会增加约50mA
odrv0.axis1.requested_state = AXIS_STATE_FULL_CALIBRATION_SEQUENCE
odrv0.axis1.error
odrv0.axis1.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL
odrv0.axis0.controller.input_vel = 10 //速度限制会影响最大转速
odrv0.axis1.controller.input_vel = 10
odrv0.axis0.encoder.vel_estimate //读取实际转速
odrv0.axis1.encoder.vel_estimate //读取实际转速
三、霍尔电机
odrv0.erase_configuration()
odrv0.config.dc_bus_overvoltage_trip_level = 56
odrv0.config.dc_max_positive_current = 20
odrv0.config.dc_max_negative_current = -3
odrv0.axis0.motor.config.motor_type = MOTOR_TYPE_GIMBAL //60W以内肯定不是大电流
odrv0.axis0.motor.config.pole_pairs = 2 //默认7,内转子霍尔电机极对数
odrv0.axis0.motor.config.calibration_current = 2
odrv0.axis0.motor.config.current_lim = 20 //默认10
odrv0.axis0.encoder.config.mode = ENCODER_MODE_HALL
odrv0.axis0.encoder.config.cpr = 12
odrv0.axis0.encoder.config.bandwidth = 100
odrv0.axis0.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL
odrv0.axis0.controller.config.vel_gain = 0.02 //默认0.167抖动严重
odrv0.axis0.controller.config.vel_integrator_gain = 0 //默认0.33333,速度环I参数
odrv0.axis0.controller.config.vel_limit = 50 //默认2,限制最大转速
odrv0.axis0.controller.config.input_mode = INPUT_MODE_VEL_RAMP
odrv0.axis0.controller.config.vel_ramp_rate = 50 //默认1,非常小,加速度
odrv0.save_configuration()
odrv0.reboot()
odrv0.axis0.requested_state = AXIS_STATE_FULL_CALIBRATION_SEQUENCE
odrv0.axis0.error
odrv0.axis0.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL
odrv0.axis0.controller.input_vel = 10
四、轮毂电机
odrv0.erase_configuration()
odrv0.config.dc_bus_overvoltage_trip_level = 56
odrv0.config.dc_max_positive_current = 30
odrv0.config.dc_max_negative_current = -5
odrv0.axis0.motor.config.motor_type = MOTOR_TYPE_HIGH_CURRENT
odrv0.axis0.motor.config.pole_pairs = 15
odrv0.axis0.motor.config.calibration_current = 10
odrv0.axis0.motor.config.resistance_calib_max_voltage = 5 //默认2,配置电机校准时的电压
odrv0.axis0.motor.config.current_lim = 20 //默认10
odrv0.axis0.encoder.config.mode = ENCODER_MODE_HALL
odrv0.axis0.encoder.config.cpr = 90 //默认8192,15对极*6=90
odrv0.axis0.encoder.config.bandwidth = 100 //配置编码带宽
odrv0.axis0.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL //设置为速度模式
odrv0.axis0.controller.config.vel_gain = 0.2 //默认0.167,速度环P参数
odrv0.axis0.controller.config.vel_integrator_gain = 0.07 //默认0.33333,速度环I参数
odrv0.axis0.controller.config.vel_limit = 10 //默认2,限制最大转速
odrv0.axis0.controller.config.input_mode = INPUT_MODE_VEL_RAMP //速度
odrv0.axis0.controller.config.vel_ramp_rate = 5 //加速度
odrv0.save_configuration()
odrv0.reboot()
odrv0.axis0.requested_state = AXIS_STATE_FULL_CALIBRATION_SEQUENCE
odrv0.axis0.error
odrv0.axis0.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL
odrv0.axis0.controller.input_vel = 10
五、云台电机
odrv0.erase_configuration()
odrv0.config.dc_max_positive_current = 56
odrv0.config.dc_max_negative_current = -5.0
odrv0.axis0.motor.config.motor_type = MOTOR_TYPE_GIMBAL //云台电机
odrv0.axis0.motor.config.pole_pairs = 7 //电机极对数
odrv0.axis0.motor.config.calibration_current = 2.5 //设置越大电流越大电机发热严重;设置太小电机没劲校准失败
odrv0.axis0.encoder.config.mode = ENCODER_MODE_SPI_ABS_AMS //编码器类型AS5047P的spi接口
odrv0.axis0.encoder.config.abs_spi_cs_gpio_pin = 1 //选择CS引脚
odrv0.axis0.encoder.config.cpr = 2**14 //14bit
odrv0.axis0.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL //速度模式
odrv0.axis0.controller.config.vel_gain = 0.02 //速度环P参数
odrv0.axis0.controller.config.vel_integrator_gain = 0.5 //速度环I参数
odrv0.axis0.controller.config.vel_limit = 10 //限制最大转速600RPM
odrv0.axis0.controller.config.input_mode = INPUT_MODE_VEL_RAMP //速度爬升模式
odrv0.axis0.controller.config.vel_ramp_rate = 10 //速度爬升率
odrv0.save_configuration()
odrv0.reboot()
odrv0.axis0.requested_state = AXIS_STATE_FULL_CALIBRATION_SEQUENCE
odrv0.axis0.error //如果校准失败,修改calibration_current
odrv0.axis0.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL
odrv0.axis0.controller.input_vel = 5 //设置目标速度,5圈/秒
ODrive 购买链接:https://item.taobao.com/item.htm?ft=t&id=644329838237,图锐科技
电机 购买链接:https://item.taobao.com/item.htm?ft=t&id=643573104607,图锐科技
(完)