ODrive的操作演示——控制AS5047P、霍尔电机和轮毂电机



ODrive、VESC和SimpleFOC 教程链接汇总:请点此链接

说明

本文主要结合本店的驱动器和电机,快速实现对电机的控制。
在这里插入图片描述

ODrive 购买链接:某宝购买
电机 购买链接:某宝购买

  • 关于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                                 //进入空闲模式

//如果以上操作没有错误,可以保存校准参数,以后不用每次都校准(ABZ编码器必须每次上电校准)。
odrv0.axis0.motor.config.pre_calibrated = True        //True=上电跳过校准使能1
odrv0.axis0.encoder.config.pre_calibrated = True      //True=上电跳过校准使能2
odrv0.axis0.config.startup_closed_loop_control = False    //True=上电进入闭环,False=上电空闲状态
odrv0.save_configuration()
odrv0.reboot()

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                           //进入空闲模式

//如果以上操作没有错误,可以保存校准参数,以后不用每次都校准(ABZ编码器必须每次上电校准)。
odrv0.axis0.motor.config.pre_calibrated = True        //True=上电跳过校准使能1
odrv0.axis0.encoder.config.pre_calibrated = True      //True=上电跳过校准使能2
odrv0.axis0.config.startup_closed_loop_control = False    //True=上电进入闭环,False=上电空闲状态
odrv0.save_configuration()
odrv0.reboot()


固件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.axis0.controller.input_vel = 0    //停止

//如果以上操作没有错误,可以保存校准参数,以后不用每次都校准(ABZ编码器必须每次上电校准)。
odrv0.axis0.motor.config.pre_calibrated = True        //True=上电跳过校准使能1
odrv0.axis0.encoder.config.pre_calibrated = True      //True=上电跳过校准使能2
odrv0.axis0.config.startup_closed_loop_control = False    //True=上电进入闭环,False=上电空闲状态
odrv0.save_configuration()
odrv0.reboot()

四、轮毂电机

在这里插入图片描述

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.axis0.controller.input_vel = 0    //停止

//如果以上操作没有错误,可以保存校准参数,以后不用每次都校准(ABZ编码器必须每次上电校准)。
odrv0.axis0.motor.config.pre_calibrated = True        //True=上电跳过校准使能1
odrv0.axis0.encoder.config.pre_calibrated = True      //True=上电跳过校准使能2
odrv0.axis0.config.startup_closed_loop_control = False    //True=上电进入闭环,False=上电空闲状态
odrv0.save_configuration()
odrv0.reboot()

五、云台电机

在这里插入图片描述

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圈/秒
odrv0.axis0.controller.input_vel = 0  //停止

//如果以上操作没有错误,可以保存校准参数,以后不用每次都校准(ABZ编码器必须每次上电校准)。
odrv0.axis0.motor.config.pre_calibrated = True        //True=上电跳过校准使能1
odrv0.axis0.encoder.config.pre_calibrated = True      //True=上电跳过校准使能2
odrv0.axis0.config.startup_closed_loop_control = False    //True=上电进入闭环,False=上电空闲状态
odrv0.save_configuration()
odrv0.reboot()



ODrive 购买链接:https://item.taobao.com/item.htm?ft=t&id=644329838237,图锐科技
电机 购买链接:https://item.taobao.com/item.htm?ft=t&id=643573104607,图锐科技



(完)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值