Odrive开发笔记

Odrive开发笔记


把从一开始做odrive驱动无刷电机的所有过程都记录下来

接线

1. 首先,接线最好不要杜邦线,用这个带接口的硅胶线比较好。
2. 编码器:
编码器选择的是as5047p,用的是ab的接法,淘宝老板说没有i相,也就是没有索引值。
spi的接了没弄通,果断接ab了。
如果要接spi的话(两个编码器),cs片选是要用两个gpio口接出来到两个编码器上,另外的就该接什么就是什么了,像MISO这些,用两根线引出来接到两个编码器上。(看到论坛上是说MOSI要接3v3,有人又说不用,也不清楚该听谁的)
编码器上的跳线一定要记得接,否则编码器是没有通电的。还要注意看一下,在那个JP1处(这里只针对as5047p编码器),中间那个才是选通道,左右两边是5和3.3v。也就是说,如果板子通3.3v,就把中间和右边的3.3v连一起就行。
对了,还有一个,as5047p的datasheet上说,当不用spi通信时,是需要将MOSI等上拉的,但是我觉得可能不用,当然我还是接了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OOE7ADqo-1627454644898)(./home/luo/Documents/Markdown/ODrive/图片1.png)]

3.电机:
电机的话,我不知道我的型号,还有极数很重要,不过暂时也没太懂这个概念的含义。编码器要放在电机上,距离有要求,我这个是5-8mm。
电机的接线没有什么讲究的,直接三相往上接,在校准的时候odrive会调整的,至少对于我做的时候是这样的。\

配置

配置是个问题,可能要调一段时间,我感觉官方的没有那么清晰。
主要是配置以下几个方面:
以下是我结合了多方面总结的配置,包括CSDN上的帖子,淘宝老板的教授,odrive官方的文档
可能不一定适用每个人,有些参数可能不一样,有些参数可以不用设置,用默认的即可。但有些我没设置的我也还是摆出来\

1.主板参数配置 odrv0.config

配置耗散电阻
我的是50W 0.47RJ
odrv0.config.brake_resistance = 0.47
配置低压保护阈值
当电压低于保护阈值时,将停止电机并报错。
odrv0.config.dc_bus_undervoltage_trip_level = 8.0
配置过压保护阈值
当电压高于保护阈值时,将停止电机并报错,这个要看odrive板子上标的
odrv0.config.dc_bus_overvoltage_trip_level = 56.0
配置过流保护阈值
当电流高于保护阈值时,将停止电机并报错。
odrv0.config.dc_max_positive_current = 20.0
配置反向过流保护阈值
当电机制动在母线上产生的反向电流高于此值时,将停止电机并报错。
odrv0.config.dc_max_negative_current = -3.0
配置回充电流值
如果使用的电池供电,可以根据电池组承受的回充电流大小进行配置。使用开关电源供电时,此项配置为0。
这项的默认值也为0。
odrv0.config.max_regen_current = 0

2.电机参数配置

配置电机极对数
转子极数除以2,就是电机极对数。这个参数要多去了解以下了,我也不是很清楚。
odrv0.axis0.motor.config.pole_pairs = 2
配置电机校准时的电流
此电流值在进行电机参数校准和编码器偏移校准时使用。
odrv0.axis0.motor.config.calibration_current = 1.5
配置电机校准时的电压
此电压值在进行电机参数校准和编码器偏移校准时使用。
odrv0.axis0.motor.config.resistance_calib_max_voltage = 2.0
配置电机类型
这里配置为大电流电机
odrv0.axis0.motor.config.motor_type = MOTOR_TYPE_HIGH_CURRENT
配置电机运行的最大电流限制,这个要看自己的电机参数
odrv0.axis0.motor.config.current_lim = 3.0
配置电机电流采样范围
odrv0.axis0.motor.config.requested_current_range = 10.0

3.编码器参数配置

配置编码器类型
配置电机编码器类型为增量式编码器。增量型的宏定义为0,这个可以看官方文档。
odrv0.axis0.encoder.config.mode = ENCODER_MODE_INCREMENTAL
配置编码器分辨率
odrv0.axis0.encoder.config.cpr = 4000
对于我的编码器as5047p来说是4000。as5047p也要看是什么进制的,2和10进制也不一样
这个参数的意思是转一圈记多少数
配置编码带宽
默认值是1000,我暂时不知道什么用的
odrv0.axis0.encoder.config.bandwidth = 1000
配置编码器校准时电机运行电流
odrv0.axis0.config.calibration_lockin.current = 5
配置编码器校准时电流上升时间
odrv0.axis0.config.calibration_lockin.ramp_time = 0.4
配置电流上升时电机转动距离,这个也是默认值,其实可以不用动
odrv0.axis0.config.calibration_lockin.ramp_distance = 3.1415927410125732
还有一些没用到的我就不写,基本很多都是可以用默认值的,因为我也不知道意思暂时,
只要最后能先驱动电机转,这些就以后需要时再研究。

4.控制器参数配置

配置控制模式
设置为位置控制模式
odrv0.axis0.controller.config.control_mode = CONTROL_MODE_POSITION_CONTROL
更多的控制模式在官方的文档里都有,我记得位置环是3,速度环是2.这些都是宏定义哈
配置电机最大转速
圈/秒
odrv0.axis0.controller.config.vel_limit = 300
配置位置环增益
odrv0.axis0.controller.config.pos_gain = 30
这几个gain很重要,我后面电机进入闭环时不停震动,就是靠调这几个值弄好的。
配置速度环增益
odrv0.axis0.controller.config.vel_gain = 0.01
odrv0.axis0.controller.config.vel_integrator_gain = 0.2
配置输入模式
配置为梯形轨迹模式
odrv0.axis0.controller.config.input_mode = INPUT_MODE_TRAP_TRAJ
配置梯形模式电机转速
odrv0.axis0.trap_traj.config.vel_limit = 30
配置梯形模式电机加/减速度
odrv0.axis0.trap_traj.config.accel_limit = 5
odrv0.axis0.trap_traj.config.decel_limit = 5
电机超速设置
odrv0.axis0.controller.config.vel_limit_tolerance = 9999   #无穷大

配置完之后记得保存和重启

odrv0.save_configuration()
odrv0.reboot()
还要记得很重要的指令
dump_errors(odrv0)//这个是检查错误的,dump倾倒出来嘛
所有的参数设置指令,你不赋值就是查看当前值是多少,
甚至可以直接输入ENCODER_MODE_INCREMENTAL等,来看这些宏的值

进入校准测试

检测电机参数
odrv0.axis0.requested_state = AXIS_STATE_MOTOR_CALIBRATION
检测电机参数,执行这条命令后大约2秒,应听到电机发出“哔”声音。
设置预先校准
odrv0.axis0.motor.config.pre_calibrated = True
表示电机已校准下次重新启动后可以直接使用上次校准的结果。
编码器偏移校准
odrv0.axis0.requested_state = AXIS_STATE_ENCODER_OFFSET_CALIBRATION
电机将正向转一圈,再反向转一圈。
注意:等待电机停止转动后,再执行后续指令。

到上面那一步完成后,你的校准就算完成了。我用的是稍微高级一点的电源,可以显示当前的电压,电流。 在校准时,是可以看到电流变化的,那就证明我的确实在校准了,但是你也可以通过上面说的比如电机会哔哔的响,还有是否转动来判断是否正在进行校准。对了,每做完一步记得dump error来看一下是否出错了。

设置闭环运行模式
odrv0.axis0.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL
我进入闭环模式后电流大小就翻倍了,我每次是根据这个来看自己是否真的进入了闭环。
好像如果进入了闭环模式你就转不动你的电机了,可以通过这个方法来看你的电机是否进入了闭环模式。
进入闭环后你可以直接试试下面的转动指令,这样的话就能证明你是否真的能驱动电机了。
控制电机正向转50圈
odrv0.axis0.controller.input_pos = 50
控制电机反向转50圈
odrv0.axis0.controller.input_pos = 0

上面的都没有问题,就要设一下开机启动项了:

odrv0.axis0.config.startup_motor_calibration = True //启动是自动进行校准    
odrv0.axis0.config.startup_encoder_index_search = False   
odrv0.axis0.config.startup_encoder_offset_calibration = True//偏移校准
odrv0.axis0.config.startup_closed_loop_control = True//进入闭环

到上面的所有都完成后,就证明你完成了odrive驱动电机的初步调试\

官网上还提供了以下的两个操作,这个就是你可以把你之前设置的东西用一个文件的形式保存下来,然后你也可以直接在文件里该配置,然后在把配置文件烧录进去。你也可以用git来记录你每一次更改的动作,我就是这样,还是很方便的。不会git的小伙伴可以去廖雪峰的教程看看,我也是新手上路,不过是真的好用。
To save the configuration to a file on the PC, run odrivetool backup-config my_config.json
To restore the configuration form such a file, run odrivetool restore-config my_config.json

用python来控制odrive

电机控制介绍

在进入python控制之前,有一些东西是必须知道和理清的
要重点看官方文档的General–Control Structure & Tuning板块。
odrive:利用了PID闭环控制
电流环,速度环和位置环

位置环

位置换在odrive上calibrate之后,odrv0.axis0.controller.input_pos = 1,这个1就是一圈。但是,一般来说,1代表的是码盘位,比如说分辨率是4096,那么就是1/4096。

我之前有一个这样的疑惑,就是当你本次设置位置转动50,当你再次设置50的时候,电机就不会转动了,为什么呢?不应该是转了50圈,然后再转50圈就行了吗?

这就是因为这个位置环的控制和我想象的不一样。这个是位置的控制,不是圈数控制,也就是50是我要转到50的位置,100就是要转到100的位置,而这个数是可以一直加下去的。

前面说odrive校准之后50才是50圈,而一般来说是码盘位,所以就会有一个参数来记录转了一个整圈后就加1,这就是i相,但我(as5047p)这里没有。

位置环对于3D打印机来说非常重要,需要一直返回位置信息。我用odrive控制电机最终用在小车上,所以位置环对我来说不是很重要。

速度环

我用在小车上,速度环对我来说就很重要。但其实速度环很简单。
首先将控制模式配置为速度环

odrv0.axis0.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL

然后校准后,进入闭环模式,直接设置速度就行了。

odrv0.axis0.controller.input_vel = 50
设置完后,你就会看到你的电机在以这个速度一直转。
这个速度是可以设置一个limit的。

这样就又有一个疑惑,我在控制位置环的时候,这个电机的转动速度是怎么控制的呢?
Odrive是PID控制,最外圈的是位置环,再是速度环,再是电流环,这些在官方文档里都有写。
当你控制位置环时,odrive根据你的梯形电信号的一些参数(包括电平持续时间,斜边的斜率等,想象以下一个梯形的电平信号),还有一些其他等等参数,最后算出一个合适的速度,反馈给速度环,再反馈给电流环最后以一个速度到达你设定的位置。这就实现了环环相扣。所以你可以通过设置了梯形的一些参数来改变位置环的速度(我还不会哈哈哈)

我用在的是小车上,所以在我的控制里,就直接去掉了位置环了。这也是官方里有说的,当你只用了内环的某个部分,外环就不会参与控制了。(这个去掉只是指你没用上而已,不是说代码上就要做什么调整)

版权声明:本文为CSDN博主「D_Latch」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/D_Latch/article/details/119179932

Odrive开发笔记


把从一开始做odrive驱动无刷电机的所有过程都记录下来

接线

1. 首先,接线最好不要杜邦线,用这个带接口的硅胶线比较好。
2. 编码器:
编码器选择的是as5047p,用的是ab的接法,淘宝老板说没有i相,也就是没有索引值。
spi的接了没弄通,果断接ab了。
如果要接spi的话(两个编码器),cs片选是要用两个gpio口接出来到两个编码器上,另外的就该接什么就是什么了,像MISO这些,用两根线引出来接到两个编码器上。(看到论坛上是说MOSI要接3v3,有人又说不用,也不清楚该听谁的)
编码器上的跳线一定要记得接,否则编码器是没有通电的。还要注意看一下,在那个JP1处(这里只针对as5047p编码器),中间那个才是选通道,左右两边是5和3.3v。也就是说,如果板子通3.3v,就把中间和右边的3.3v连一起就行。
对了,还有一个,as5047p的datasheet上说,当不用spi通信时,是需要将MOSI等上拉的,但是我觉得可能不用,当然我还是接了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OOE7ADqo-1627454644898)(./home/luo/Documents/Markdown/ODrive/图片1.png)]

3.电机:
电机的话,我不知道我的型号,还有极数很重要,不过暂时也没太懂这个概念的含义。编码器要放在电机上,距离有要求,我这个是5-8mm。
电机的接线没有什么讲究的,直接三相往上接,在校准的时候odrive会调整的,至少对于我做的时候是这样的。\

配置

配置是个问题,可能要调一段时间,我感觉官方的没有那么清晰。
主要是配置以下几个方面:
以下是我结合了多方面总结的配置,包括CSDN上的帖子,淘宝老板的教授,odrive官方的文档
可能不一定适用每个人,有些参数可能不一样,有些参数可以不用设置,用默认的即可。但有些我没设置的我也还是摆出来\

1.主板参数配置 odrv0.config

配置耗散电阻
我的是50W 0.47RJ
odrv0.config.brake_resistance = 0.47
配置低压保护阈值
当电压低于保护阈值时,将停止电机并报错。
odrv0.config.dc_bus_undervoltage_trip_level = 8.0
配置过压保护阈值
当电压高于保护阈值时,将停止电机并报错,这个要看odrive板子上标的
odrv0.config.dc_bus_overvoltage_trip_level = 56.0
配置过流保护阈值
当电流高于保护阈值时,将停止电机并报错。
odrv0.config.dc_max_positive_current = 20.0
配置反向过流保护阈值
当电机制动在母线上产生的反向电流高于此值时,将停止电机并报错。
odrv0.config.dc_max_negative_current = -3.0
配置回充电流值
如果使用的电池供电,可以根据电池组承受的回充电流大小进行配置。使用开关电源供电时,此项配置为0。
这项的默认值也为0。
odrv0.config.max_regen_current = 0

2.电机参数配置

配置电机极对数
转子极数除以2,就是电机极对数。这个参数要多去了解以下了,我也不是很清楚。
odrv0.axis0.motor.config.pole_pairs = 2
配置电机校准时的电流
此电流值在进行电机参数校准和编码器偏移校准时使用。
odrv0.axis0.motor.config.calibration_current = 1.5
配置电机校准时的电压
此电压值在进行电机参数校准和编码器偏移校准时使用。
odrv0.axis0.motor.config.resistance_calib_max_voltage = 2.0
配置电机类型
这里配置为大电流电机
odrv0.axis0.motor.config.motor_type = MOTOR_TYPE_HIGH_CURRENT
配置电机运行的最大电流限制,这个要看自己的电机参数
odrv0.axis0.motor.config.current_lim = 3.0
配置电机电流采样范围
odrv0.axis0.motor.config.requested_current_range = 10.0

3.编码器参数配置

配置编码器类型
配置电机编码器类型为增量式编码器。增量型的宏定义为0,这个可以看官方文档。
odrv0.axis0.encoder.config.mode = ENCODER_MODE_INCREMENTAL
配置编码器分辨率
odrv0.axis0.encoder.config.cpr = 4000
对于我的编码器as5047p来说是4000。as5047p也要看是什么进制的,2和10进制也不一样
这个参数的意思是转一圈记多少数
配置编码带宽
默认值是1000,我暂时不知道什么用的
odrv0.axis0.encoder.config.bandwidth = 1000
配置编码器校准时电机运行电流
odrv0.axis0.config.calibration_lockin.current = 5
配置编码器校准时电流上升时间
odrv0.axis0.config.calibration_lockin.ramp_time = 0.4
配置电流上升时电机转动距离,这个也是默认值,其实可以不用动
odrv0.axis0.config.calibration_lockin.ramp_distance = 3.1415927410125732
还有一些没用到的我就不写,基本很多都是可以用默认值的,因为我也不知道意思暂时,
只要最后能先驱动电机转,这些就以后需要时再研究。

4.控制器参数配置

配置控制模式
设置为位置控制模式
odrv0.axis0.controller.config.control_mode = CONTROL_MODE_POSITION_CONTROL
更多的控制模式在官方的文档里都有,我记得位置环是3,速度环是2.这些都是宏定义哈
配置电机最大转速
圈/秒
odrv0.axis0.controller.config.vel_limit = 300
配置位置环增益
odrv0.axis0.controller.config.pos_gain = 30
这几个gain很重要,我后面电机进入闭环时不停震动,就是靠调这几个值弄好的。
配置速度环增益
odrv0.axis0.controller.config.vel_gain = 0.01
odrv0.axis0.controller.config.vel_integrator_gain = 0.2
配置输入模式
配置为梯形轨迹模式
odrv0.axis0.controller.config.input_mode = INPUT_MODE_TRAP_TRAJ
配置梯形模式电机转速
odrv0.axis0.trap_traj.config.vel_limit = 30
配置梯形模式电机加/减速度
odrv0.axis0.trap_traj.config.accel_limit = 5
odrv0.axis0.trap_traj.config.decel_limit = 5
电机超速设置
odrv0.axis0.controller.config.vel_limit_tolerance = 9999   #无穷大

配置完之后记得保存和重启

odrv0.save_configuration()
odrv0.reboot()
还要记得很重要的指令
dump_errors(odrv0)//这个是检查错误的,dump倾倒出来嘛
所有的参数设置指令,你不赋值就是查看当前值是多少,
甚至可以直接输入ENCODER_MODE_INCREMENTAL等,来看这些宏的值

进入校准测试

检测电机参数
odrv0.axis0.requested_state = AXIS_STATE_MOTOR_CALIBRATION
检测电机参数,执行这条命令后大约2秒,应听到电机发出“哔”声音。
设置预先校准
odrv0.axis0.motor.config.pre_calibrated = True
表示电机已校准下次重新启动后可以直接使用上次校准的结果。
编码器偏移校准
odrv0.axis0.requested_state = AXIS_STATE_ENCODER_OFFSET_CALIBRATION
电机将正向转一圈,再反向转一圈。
注意:等待电机停止转动后,再执行后续指令。

到上面那一步完成后,你的校准就算完成了。我用的是稍微高级一点的电源,可以显示当前的电压,电流。 在校准时,是可以看到电流变化的,那就证明我的确实在校准了,但是你也可以通过上面说的比如电机会哔哔的响,还有是否转动来判断是否正在进行校准。对了,每做完一步记得dump error来看一下是否出错了。

设置闭环运行模式
odrv0.axis0.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL
我进入闭环模式后电流大小就翻倍了,我每次是根据这个来看自己是否真的进入了闭环。
好像如果进入了闭环模式你就转不动你的电机了,可以通过这个方法来看你的电机是否进入了闭环模式。
进入闭环后你可以直接试试下面的转动指令,这样的话就能证明你是否真的能驱动电机了。
控制电机正向转50圈
odrv0.axis0.controller.input_pos = 50
控制电机反向转50圈
odrv0.axis0.controller.input_pos = 0

上面的都没有问题,就要设一下开机启动项了:

odrv0.axis0.config.startup_motor_calibration = True //启动是自动进行校准    
odrv0.axis0.config.startup_encoder_index_search = False   
odrv0.axis0.config.startup_encoder_offset_calibration = True//偏移校准
odrv0.axis0.config.startup_closed_loop_control = True//进入闭环

到上面的所有都完成后,就证明你完成了odrive驱动电机的初步调试\

官网上还提供了以下的两个操作,这个就是你可以把你之前设置的东西用一个文件的形式保存下来,然后你也可以直接在文件里该配置,然后在把配置文件烧录进去。你也可以用git来记录你每一次更改的动作,我就是这样,还是很方便的。不会git的小伙伴可以去廖雪峰的教程看看,我也是新手上路,不过是真的好用。
To save the configuration to a file on the PC, run odrivetool backup-config my_config.json
To restore the configuration form such a file, run odrivetool restore-config my_config.json

用python来控制odrive

电机控制介绍

在进入python控制之前,有一些东西是必须知道和理清的
要重点看官方文档的General–Control Structure & Tuning板块。
odrive:利用了PID闭环控制
电流环,速度环和位置环

位置环

位置换在odrive上calibrate之后,odrv0.axis0.controller.input_pos = 1,这个1就是一圈。但是,一般来说,1代表的是码盘位,比如说分辨率是4096,那么就是1/4096。

我之前有一个这样的疑惑,就是当你本次设置位置转动50,当你再次设置50的时候,电机就不会转动了,为什么呢?不应该是转了50圈,然后再转50圈就行了吗?

这就是因为这个位置环的控制和我想象的不一样。这个是位置的控制,不是圈数控制,也就是50是我要转到50的位置,100就是要转到100的位置,而这个数是可以一直加下去的。

前面说odrive校准之后50才是50圈,而一般来说是码盘位,所以就会有一个参数来记录转了一个整圈后就加1,这就是i相,但我(as5047p)这里没有。

位置环对于3D打印机来说非常重要,需要一直返回位置信息。我用odrive控制电机最终用在小车上,所以位置环对我来说不是很重要。

速度环

我用在小车上,速度环对我来说就很重要。但其实速度环很简单。
首先将控制模式配置为速度环

odrv0.axis0.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL

然后校准后,进入闭环模式,直接设置速度就行了。

odrv0.axis0.controller.input_vel = 50
设置完后,你就会看到你的电机在以这个速度一直转。
这个速度是可以设置一个limit的。

这样就又有一个疑惑,我在控制位置环的时候,这个电机的转动速度是怎么控制的呢?
Odrive是PID控制,最外圈的是位置环,再是速度环,再是电流环,这些在官方文档里都有写。
当你控制位置环时,odrive根据你的梯形电信号的一些参数(包括电平持续时间,斜边的斜率等,想象以下一个梯形的电平信号),还有一些其他等等参数,最后算出一个合适的速度,反馈给速度环,再反馈给电流环最后以一个速度到达你设定的位置。这就实现了环环相扣。所以你可以通过设置了梯形的一些参数来改变位置环的速度(我还不会哈哈哈)

我用在的是小车上,所以在我的控制里,就直接去掉了位置环了。这也是官方里有说的,当你只用了内环的某个部分,外环就不会参与控制了。(这个去掉只是指你没用上而已,不是说代码上就要做什么调整)

版权声明:本文为CSDN博主「D_Latch」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/D_Latch/article/details/119179932

生成海报
点赞 0

D_Latch

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

基于8051单片机实现电子时钟+数字秒表设计

概述 电子时钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显 示直观、无机械传动装置等优点,因而得到广泛应用。随着人们生活环境的不断改善和美化,在许

OV7670摄像头模块资料

OV7670摄像头模块资料 一、实物图和原理图 二、模块简介 OV7670 是 OV( OmniVision)公司生产的 CMOS VGA 图像传感器。该传感器体积小、工作电压低,提供单片 VGA

汇编实现LED点亮

汇编点亮一个LED MCS-51单片机 也许C语言人人都会,但使用汇编语言就不一定了。 使用汇编语言点亮一个LED灯 程序: ORG 0000H MAIN:CLR P2.0 LJMP MAINEND 注释如下&#