前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ODrive配置云台电机GIMBLE_TYPE

ODrive配置云台电机GIMBLE_TYPE

作者头像
全栈程序员站长
发布于 2022-07-26 00:31:05
发布于 2022-07-26 00:31:05
2.7K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

文章目录
  • 0.前言
  • 1.硬件介绍
    • 1.1.硬件
    • 1.2.接线
  • 2.配置参数
    • 2.1.基本配置
    • 2.2.电机配置
    • 2.3.编码器配置
    • 2.4.控制器配置
    • 2.5.保存配置
  • 3.校准工作
    • 3.1.校准电机
    • 3.2.编码器校准
    • 3.3.保存校准结果
  • 4.切换电机类型
  • 5.控制电机运行
  • 6.重新启动自动进入闭环控制
  • 7.PID参数调节
    • 7.1.官网教程
    • 7.2.云台电机自己调参总结
  • 8.总结
    • 8.1.遇到的错误
      • 1.MOTOR_ERROR_PHASE_RESISTANCE_OUT_OF_RANGE
      • 2.ENCODER_ERROR_CPR_POLEPAIRS_MISMATCH
      • 3.CONTROLLER_ERROR_OVERSPEED
      • 4.ENCODER_ERROR_ABS_SPI_COM_FAIL
      • 5.ENCODER_ERROR_INDEX_NOT_FOUND_YET
      • 6.AXIS_ERROR_INVALID_STATE
    • 8.2.注意事项
      • 1.错误解决方式
      • 2.设置参数后经常save_configuration()

0.前言

​ ODrive比较适合大电流的无刷电机使用,对于云台电机(小电流低转速)并没有使用电流环(好像SimpleFOC也没有电流环)。并且网上仅有少数的大电流无刷电机的配置例程,没有小电流无刷电机的配置例程。今天踏了一遍这个坑,遇到了很多错误,最后也逐渐摸索出了解决方法。

​ 主要配置流程 参考博客

1.硬件介绍

1.1.硬件

  • ODrive 硬件版本:ODrive v3.6 56v电压版本 固件版本:fw-v0.5.1。这是目前(2021.04.04)最新版本的固件,也仅仅从0.5版本的固件开始才支持SPI接口的绝对值编码器。
  • 云台无刷电机 GB4315云台电机 配置24N28P,因此极对数是14;额定电压24V;额定转速150RPM(注意ODrive中的转速单位是r/s,不是r/min);额定电流0.92A;线电阻16.5欧姆。
  • 编码器 AS5048A,SPI接口的绝对值编码器。注意该电机配套两种编码器,还有一个是AS5600,但是不支持SPI接口,因此ODrive不能用。 另外,编码器有Interface和Output两种外接方式:Interface是通信接口,比如SPI、IIC等,ODrive直接通过通信协议读取编码器芯片内部的寄存器值得到数据;而Output属于脉冲输出,比如AB、ABZ、PWM等,ODrive通过定时器的编码器模式读取这些脉冲并计算数据。
  • 功率耗散电阻(可选) 50W 2R 黄金壳功率耗散电阻。

1.2.接线

​ 电机直接随意接三相即可。

​ 买来的电机上AS5048A编码器只给焊接了PWM接口的三根线,SPI接口没给焊,需要自己焊接。并且间距比较小,焊接的线要细一点。焊接后,接线注意:

  • 将编码器的VCC、GND、MOSI、MISO、CLK连接到ODrive对应的相同的引脚上;
  • 编码器的CS引脚接到1-8中的任意一个引脚上(但是默认1/2引脚是串口引脚,所以最好接到3-8上);
  • AS5048A是3.3V和5V电平兼容的,编码器的VCC接到ODrive的3.3V或者5V都可以。但是我最初接了3.3V,好像噪声有点大,又改成了5V(这个我也不确定有没有影响)
  • 编码器信号容易受到电机电源线的干扰,所以需要一定的处理。在ODrive官网和社区上,给出了几个方法: 参考:官网编码器 官网社区帖1 官网社区帖2 官网商店
    • 避免:尽可能避免编码器线太靠近电机线;尽量减小编码器和ODrive之间的连线长度;尽量不要使用带状电缆
    • 使用差分信号传输,但是需要在两端添加RS422收发器,比较麻烦
    • 使用屏蔽电缆,如屏蔽双绞线
    • 使用铁氧体磁环:铁氧体磁环可减少电容耦合噪声。可以帮助减少耦合回编码器线的噪声,并可以减少EMI辐射。我们建议通过此方法将相线(共)绕3圈,但如果不合适,也可以绕2圈。
    • SPI的编码器,请在CLK上串联一个20-50欧姆的电阻,该噪声更容易受到影响。

另外

  1. 对于SPI的编码器,可以通过输入命令odrv0.<axis>.encoder.spi_error_rate来查看SPI信号的相关特性。如果它是1.0或接近1.0,则可能存在接线或电源问题。如果它是0.0或非常接近,那么您将获得良好的数据。如果介于两者之间,则您的数据断断续续。您可能需要使用示波器或逻辑分析仪,以检查编码器上是否未设置错误标志,以及波形是否正常。
  2. 最后我使用的是绕铁氧体磁环的方法,因为手头刚好有一个,而且也最简单。没使用磁环之前,输入命令odrv0.<axis>.encoder.spi_error_rate,得到的数值是0.6左右;使用磁环之后再输入此命令得到的值就是0.0了。(但是实际使用中电机不同,看位置的曲线,噪声还是比较大,虽然值比较小,但是波动很频繁,但是并没有影响电机的控制)

2.配置参数

注意:进行配置前建议首先执行一遍擦除配置odrv0.erase_configuration(),然后odrv0.reboot()重启 ODrive 以确保配置恢复为固件默认配置。

2.1.基本配置

这部分属于整个ODrive板子的配置,和电机无关,所以云台电机和大电流电机配置一样。

2.2.电机配置

这里需要注意,虽然说使用的是小电流的云台电机,但是经过我的测试,电机类型如果配置成云台电机的话,编码器校准总是失败。并且电机类型是云台电机,那么运行电机校准指令是没有任何反应的,而去看错误也不会报任何错误,此时就会很迷惑。实际是因为对于云台电机没使用电流环,所以就不用运行电机校准来检测电机的电阻和电感了。所以这里先配置成大电流电机,把电机的限制电流设小一点即可。最后等都配置好了,再把电机类型改成云台电机。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
resistance_calib_max_voltage > calibration_current*电机相电阻
resistance_calib_max_voltage <  0.5*电源电压

因为电机的线电阻16.5欧姆,所以相电阻8欧姆左右,所以校准电压要大于0.5*8=4V。电池电压12V,同时校准电压要小于0.5 *12=6V,所以这里设置为5V。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  odrv0.axis1.motor.config.resistance_calib_max_voltage = 5
  • 配置电机电流采样范围,注意:此值设置后需要重新启动才能生效。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  odrv0.axis1.motor.config.requested_current_range = 60

2.3.编码器配置

2.4.控制器配置

2.5.保存配置

​ 保存配置参数并重启 ODrive ,已使某些配置参数生效。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
odrv0.save_configuration()
odrv0.reboot()

3.校准工作

注意:进行参数校准前请确保电机转子能够自由旋转而且不能有偏载,即负载均匀和较弱的摩擦负载才行,重载或类似弹簧载荷不行,否则将影响参数自动校准

3.1.校准电机

3.2.编码器校准

注意由于使用的AS5048A是绝对编码器,没有索引信号,所以不用进行索引校准,直接进行偏移校准即可。

3.3.保存校准结果

​ 将自动检测的电机参数保存并重启,等待 ODrive 重新连接到 odrivetool。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
odrv0.save_configuration()
odrv0.reboot()

4.切换电机类型

这一步非常重要。因为之前为了成功进行编码器校准将电机设置成了大电流电机,这个时候如果直接进入闭环控制的话,电机的电流声音特别大,能明显听出来。估计这也是Odrive对云台电机不使用电流环的原因,因为电流的噪声太大了,加上电流环还不如不加。所以此时要把电机类型改为云台电机,然后保存配置,重启。此时再进入闭环,就会发现电机的电流声小了很多。

5.控制电机运行

6.重新启动自动进入闭环控制

注意由于使用的是绝对值编码器,所以每次重新启动后不需要进行编码器的索引校准(即无须寻找零点的位置)。如果使用的是ABZ的增量式编码器,那么每次开机后都需要进行编码器索引校准,就是一直朝着一个方向转直到找到Z相信号。

​ 可以添加自动进入闭环模式的功能,配置 ODrive 启动后自动进入闭环控制模式,然后保存配置,这样每次重新启动后电机自动进入闭环运行模式,我们只需要发送位置控制指令即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
odrv0.axis1.config.startup_closed_loop_control = True
odrv0.save_configuration()

7.PID参数调节

7.1.官网教程

​ 调整电动机控制器是释放ODrive潜力的必不可少的步骤。通过调整,控制器可以快速响应系统中的干扰或变化(例如施加的外力或设定值的变化)而不会变得不稳定。正确设置三个调整参数(称为增益)可确保ODrive能够以最有效的方式控制电动机。这三个值是:

  • <axis>.controller.config.pos_gain = 20.0 [(转/秒)/转]
  • <axis>.controller.config.vel_gain = 0.16[Nm /(转/秒)]
  • <axis>.controller.config.vel_integrator_gain = 0.32 [Nm /(((圈/秒)* s)]

即将推出的功能将启用自动调整。在此之前,这里是一个粗略的调整过程:

  • vel_integrator_gain增益设置为0
  • 确保您的系统稳定。如果不是,请减少所有收益,直到获得收益为止。
  • vel_gain每次迭代增加约30%,直到电机出现振动。
  • 退回vel_gain至振动值的50%。
  • pos_gain每次迭代增加大约30%,直到您看到一些过冲。
  • 退缩,pos_gain直到不再有超调为止。
  • 积分器可以设置为0.5 * bandwidth * vel_gain,其中bandwidth是系统的总跟踪带宽。假设您的调整使它以100ms的建立时间(从设定值更改到系统到达新设定值的时间)跟踪命令;这意味着带宽为1 /(100ms)= 1 /(0.1s)= 10hz。在这种情况下,您应该设置vel_integrator_gain = 0.5 * 10 * vel_gain

liveplotter工具在拨入这些值时可能会非常有用。要显示绘制位置设定值与测量位置值之间关系的图形,请在ODrive工具中运行以下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
start_liveplotter(lambda:[odrv0.axis1.encoder.pos_estimate, odrv0.axis1.controller.pos_setpoint])

7.2.云台电机自己调参总结

  1. 按照官网步骤,先把速度环Ki设置为0,把位置环的Kp设置成一个比较小的值,比如5。
  2. 逐渐增大速度环的Kp,直到电机出现震动。实际随着Kp的增大,电流声越来越大,最后会高频震动。
  3. 将速度环Kp减小,然后按照公式设置速度环的Ki。
  4. 逐步调大位置环的Kp,直到达到要求。调试中可以给一个Kp,再给一个位置目标,看阶跃响应。

注意

  • 我测试发现电流声的大小和位置环的Kp无关,和速度环的Kp有关,把速度环Kp减小,电流声就会小很多。
  • 按理说应该位置环的Kp越大越有超调,可实际发现Kp比较小的时候,电机很软,此时反而有超调。感觉是因为此时电机太软了,到了目标位置有点控制不住。实际此时我把位置环的Kp调的比较大(100左右),电机很硬,位置环的超调反而很小。

8.总结

8.1.遇到的错误

1.MOTOR_ERROR_PHASE_RESISTANCE_OUT_OF_RANGE

​ 电机相电阻超出范围。多数是因为电机的接线有问题,此时可以关闭ODrive,用万用表测量ODrive上的端子的线电阻和电机参数中的是否一致。可以使用以下命令查看电阻和电感:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
odrv0.axis1.motor.config.phase_resistance
odrv0.axis1.motor.config.phase_inductance
2.ENCODER_ERROR_CPR_POLEPAIRS_MISMATCH

​ 编码器CPR值和电机极对数匹配错误。这里首先检查设置的编码器值和电机极对数值是否正确。我一开始遇到这个问题,查看后发现这两个值并没有错误。后来发现还是编码器校准没有成功的原因。因为一开始我把电机配成了云台电机,然后进行编码器偏移校准的时候,电机只会左右转很小的范围(几度那样),相当于抖几下。这时候电机其实并没有正确完成编码器的校准。正常的编码器校准,电机会左右转动大概半圈,这样基本上就是完成了编码器校准。

​ 这个时候的解决办法就是如前所述把电机先配置为大电流电机,当所有的校准都完成后,再把电机的类型改成云台电机。

3.CONTROLLER_ERROR_OVERSPEED

​ 电机超速。原因我猜是因为启动时SPI类型的编码器的噪声很大导致的,解决方法前面配置的时候就说过,就是把电机的最大转速设置的非常高,但是最大电流有限制,所以电机也不会转的很快。

4.ENCODER_ERROR_ABS_SPI_COM_FAIL

​ SPI编码器失败。这个具体什么原因不知道,感觉还是因为SPI的编码器不稳定,因为我时常会出现原来正常,后来突然不能用了,就是报出了这个错误。大体可以从一下几个方面检查:

  • 检查SPI编码器接线。因为ODrive上SPI编码器接口不是连在一起的,很容易导致线松动。最好的方式是确认连线无误后就用少量的热熔胶将编码器和ODrive的接线固定住。
  • 可以通过输入命令odrv0.<axis>.encoder.spi_error_rate来查看SPI信号的相关特性。如果它是1.0或接近1.0,则可能存在接线或电源问题。如果它是0.0或非常接近,那么您将获得良好的数据。如果介于两者之间,则您的数据断断续续。
  • 编码器校准原因,重启,再次进行编码器校准。
  • 清除错误,重启再试一试
5.ENCODER_ERROR_INDEX_NOT_FOUND_YET

​ 编码器索引信号尚未找到。此错误常在执行编码器偏移校准的时候出现,有两个原因:

​ 1.在编码器校准的时候执行了索引校准命令,然后又去执行偏移校准。实际上由于使用的是绝对值编码器,所以无须进行索引校准,就算进行了也找不到,此时再去进行偏移校准自然会报错。

​ 2.编码器配置中的odrv0.axis1.encoder.config.use_index = True,这里配置成仍旧使用索引信号,所以后面会出错。将此配置改成False即可。

6.AXIS_ERROR_INVALID_STATE

​ 电机轴的非法状态。此时通常是因为命令顺序跳跃造成的,比如尚未进行电机校准或者编码器校准,就要进入闭环模式。在ODrive官网的故障排除的地方有讲解。

8.2.注意事项

1.错误解决方式
  • 进入ODrive官网,找到故障排除的分类,进去查看对应类型的错误。
  • Google搜索出错的类型,这时候通常会出现ODrive社区中的帖子。
2.设置参数后经常save_configuration()

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/127882.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
路由模式 - direct
package com.shi.rout; import java.io.IOException; import java.util.concurrent.TimeoutException; im
用户5927264
2019/08/01
6610
路由模式 - direct
订阅模式 - fanout
package com.shi.ps; import java.io.IOException; import java.util.concurrent.TimeoutException; impo
用户5927264
2019/08/01
4990
订阅模式 - fanout
Work模式
模式是一个生产者多个消费者模式,一个消息只能别一个消费者消费 package com.shi.work; import java.io.IOException; import java.util.c
用户5927264
2019/08/01
4230
Work模式
rabbitMQ-simple 简单模式
1 导入依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchem
用户5927264
2019/08/01
2020
rabbitMQ-simple 简单模式
RabbitMq七种工作模式,java实战案例分享,别再说你不会!
最简单的一个消费者和一个生产者模式,生产者生成消息,消费者监听消息,若是消费者监听到它所需要的消息,就会消费该消息,这种消息是次性的,被消费了就没有了。
Java程序猿
2021/03/26
4750
RabbitMQ详解解答【面试+工作】
如果安装rabbitMQ首先安装基于erlang语言支持的OTP软件,然后在下载rabbitMQ软件进行安装(安装过程都是下一步,在此不在说了)
Java帮帮
2018/09/29
1.5K0
RabbitMQ详解解答【面试+工作】
RabbitMQ 七种队列模式应用场景案例分析(通俗易懂)
> 公众号:[Java小咖秀](https://t.1yb.co/jwkk),网站:[javaxks.com](https://www.javaxks.com)
Java小咖秀
2021/04/09
1.5K0
RabbitMQ 七种队列模式应用场景案例分析(通俗易懂)
RabbitMQ 七种队列模式应用场景案例分析(通俗易懂)
做最简单的事情,一个生产者对应一个消费者,RabbitMQ相当于一个消息代理,负责将A的消息转发给B 应用场景: 将发送的电子邮件放到消息队列,然后邮件服务在队列中获取邮件并发送给收件人 工作队列模式(Work queues)
程序员小强
2021/04/29
3640
RabbitMQ 七种队列模式应用场景案例分析(通俗易懂)
RabbitMQ极速入门
消息中间件是目前比较流行的一个中间件,其中RabbitMQ更是占有一定的市场份额,主要用来做异步处理、应用解耦、流量削峰、日志处理等等方面。
sowhat1412
2020/11/05
1K0
RabbitMQ极速入门
RabitMQ&Java使用说明
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而群集和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。
俺也想起舞
2020/07/01
4700
RabbitMQ详解(三)------RabbitMQ的五种队列
  上一篇博客我们介绍了RabbitMQ消息通信中的一些基本概念,这篇博客我们介绍 RabbitMQ 的五种工作模式,这也是实际使用RabbitMQ需要重点关注的。
IT可乐
2018/07/24
8270
RabbitMQ详解(三)------RabbitMQ的五种队列
RabbitMQ系列(五)Topic模型
上一篇文章《RabbitMQ系列(四)通信模型之路由模型》中,简单的介绍了一下RabbitMQ的路由模型。这篇文章来学习一下RabbitMQ中的topic模型,Topic 模型是 RabbitMQ 的高级模型之一,Topic 模型使用了通配符的概念,可以匹配更灵活的路由规则。topic模式相当于是对路由模式的一个升级,topic模式主要就是在匹配的规则上可以实现模糊匹配。
Jensen_97
2023/07/20
2200
springboot-RabbitMQ发送短信
Kafka不管是消费成功还是失败,都不会立即从mq服务端中移除,使用offset记录消息消费情况
阿超
2022/08/16
9.1K0
springboot-RabbitMQ发送短信
RabbitMQ使用教程(超详细)
下载地址:http://www.rabbitmq.com/download.html
全栈程序员站长
2022/07/21
2.8K1
RabbitMQ使用教程(超详细)
RabbitMQ六种工作模式
2.Work queue 生产者传入多个消费者进行处理,每条消息只能被一个消费者拿到。
你的益达
2020/09/30
4730
RabbitMQ六种工作模式
RabbitMQ Topic(通配符)工作模式
红色 Queue:绑定的是 usa.# ,因此凡是以 usa. 开头的 routing key 都会被匹配到 黄色 Queue:绑定的是 #.news ,因此凡是以 .news 结尾的 routing key 都会被匹配,
兰舟千帆
2022/08/03
4620
RabbitMQ Topic(通配符)工作模式
RabbitMQ In JAVA 介绍及使用
  RabbitMQ是开源的消息中间件,它是轻量级的,支持多种消息传递协议,可以部署在分布式和联合配置中,以满足高级别、高可用性需求。并且可在许多操作系统和云环境上运行,并为大多数流行语言提供了广泛的开发工具。(这里只介绍JAVA下的RabbitMQ的使用,感兴趣的可以查看官方文档:http://www.rabbitmq.com/getstarted.html);
2019/02/21
7460
RabbitMQ In JAVA 介绍及使用
【RabbitMQ】RabbitMQ应用
官方安装指南:https://www.rabbitmq.com/install-rpm.html
瑞新
2021/11/08
1.9K0
MQ教程 | RabbitMQ 简单队列 hello world [Java版](三)
那么我们根据以上的模型,咱们抽取出 3 个对象 生产者(用户发送消息) 队列(中间件):类似于容器(存储消息) 消 费者(获取队列中的消息)
Tinywan
2019/07/16
7520
MQ教程 | RabbitMQ 简单队列 hello world [Java版](三)
05-RabbitMQ控制台入门及其Java简单操作
路由键: 就是指发送到Exchange的消息, 通过路由键的匹配规则, 分发到指定的Queue
彼岸舞
2022/10/06
2550
05-RabbitMQ控制台入门及其Java简单操作
相关推荐
路由模式 - direct
更多 >
LV.0
这个人很懒,什么都没有留下~
目录
  • 文章目录
  • 0.前言
  • 1.硬件介绍
    • 1.1.硬件
    • 1.2.接线
  • 2.配置参数
    • 2.1.基本配置
    • 2.2.电机配置
    • 2.3.编码器配置
    • 2.4.控制器配置
    • 2.5.保存配置
  • 3.校准工作
    • 3.1.校准电机
    • 3.2.编码器校准
    • 3.3.保存校准结果
  • 4.切换电机类型
  • 5.控制电机运行
  • 6.重新启动自动进入闭环控制
  • 7.PID参数调节
    • 7.1.官网教程
    • 7.2.云台电机自己调参总结
  • 8.总结
    • 8.1.遇到的错误
      • 1.MOTOR_ERROR_PHASE_RESISTANCE_OUT_OF_RANGE
      • 2.ENCODER_ERROR_CPR_POLEPAIRS_MISMATCH
      • 3.CONTROLLER_ERROR_OVERSPEED
      • 4.ENCODER_ERROR_ABS_SPI_COM_FAIL
      • 5.ENCODER_ERROR_INDEX_NOT_FOUND_YET
      • 6.AXIS_ERROR_INVALID_STATE
    • 8.2.注意事项
      • 1.错误解决方式
      • 2.设置参数后经常save_configuration()
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档