ODrive移植keil(九)—— 抗齿槽效应算法

2023-12-13 12:17:53

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

在这里插入图片描述

一、齿槽效应

1.1、齿槽效应的定义

  • 在永磁电机中,即使定子中没有电流通过,也会存在一个电磁转矩,这个转矩叫齿槽力矩(Cogging Torque)。
  • 用手转动电机,会感觉到它从当前点“跳跃”并“稳定”在另一个点,电机有“一格一格”的顿挫感(俗称颗粒感)。
  • 当电机低速转动时,表现为“一顿一顿”,
  • 当电机高速转动时,电机的振动和噪声会更大。某疆早期的2312电机齿槽效应非常大,后来的电机齿槽效应明显变小了。
    在这里插入图片描述
    ?

1.2、产生原因

  • 在磁极与铁心垂直的位置(0°和180°)磁阻最大,转矩为0,称之为“不稳定的平衡点”
  • 在磁极与铁心正对的位置(90°和270°)磁阻最小,转矩为0,称之为“稳定的平衡点”,如果没有较大负载施加的话,转子可以永久保持在这个位置
  • 在两个平衡点之间,磁阻转矩非线性变化,最大值一般是在趋近于定子齿的某一位置。

在这里插入图片描述

?

1.3、解决办法

1、斜槽
在这里插入图片描述

斜槽所带来的缺点有:会降低感应电动势的基波幅值,进而降低输出功率和输出转矩;电机的漏感和杂散损耗增加,降低电机效率;增加了工艺复杂度。
?

2、磁环代替磁片
在这里插入图片描述

早期云台电机有些使用的是磁片,有齿槽效应但比较微弱。现在的云台电机基本都已升级为磁环。
磁环的缺点:铁氧体材质磁性上限低,所以不能做大扭矩的电机,目前主要应用在云台电机上。
?
3、抗齿槽算法
通过编码器调制电机的电流驱动,以补偿一些齿槽转矩波动,并使用电子驱动技术对其进行平滑处理。
目前已知的并且开源的只有ODrive的技术,老外“人确实不错”!
?

4、网上看到一篇专业文章:《齿槽转矩削弱方法及多目标联合仿真优化》https://zhuanlan.zhihu.com/p/549569418
?
?

二、硬件接线

ODrive中默认的抗齿槽算法采样点3600个,AS5047P的ABZ接口只有4000cpr,分辨率太低,而SPI接口是14bit,相当于16384cpr,所以使用SPI接口。

在这里插入图片描述

驱动板 购买链接:某宝购买
电机 购买链接:某宝购买
?

三、ODrive官方代码操作

用官方代码操作,验证控制效果,并获取配置参数,

3.1、固件版本v0.5.1

因为v0.5.1的教程最丰富,所以我一般用v0.5.1的版本操作,
代码移植自v0.5.6,所以本文所有涉及源代码的地方都截图自v0.5.6,
0.5.1和0.5.6的抗齿槽算法功能完全一样,涉及到的抗齿槽源码也完全一样。

在这里插入图片描述

?

3.2、抗齿槽校准原理

  • 功能很高大上,但出乎意料的是代码非常简单,核心代码就下面这点,
    算法设置了3600个采样点,电机转到指定位置后保存当前的vel_integrator_torque_,
    在这里插入图片描述

  • 使用的时候,直接把保存的采样值赋给力矩
    在这里插入图片描述

  • 简单的说,就是校准的时候让电机转到指定位置,保持稳定并记录下当前的力矩;使用的时候直接输出保存的力矩,电机快速稳定的转到指定位置。
    ?

3.3、校准注意事项

  • 网上没有讲解抗齿槽操作的教程,我之前操作过很多次都没有成功,
  • 阅读代码,可以看出抗齿槽效应的使用只针对位置模式的梯形轨迹模式,选择其它模式无效。
    在这里插入图片描述
  • 配置为对应模式,但抗齿槽校准的时候电机始终转不动,即使把位置环P参数和速度环PI参数设置很大还是转不动。后来想想,因为梯形轨迹有上升斜率,限制了每次的最大输出,所以电机转不动。
    在这里插入图片描述
  • 设置为直通模式,没有了输出限制,电机就能转动了。所以,在抗齿槽校准前配置为“直通模式”,校准完以后再配置回“梯形轨迹模式”。
  • index初始化为0,所以抗齿槽校准是从位置0开始。为减少意外可以在配置完位置模式后先让电机转到位置0,再开始校准。
    在这里插入图片描述

3.4、校准操作

在这里插入图片描述
在这里插入图片描述


//odrive固件版本v0.5.1,电源电压12V,5008电机+AS5047P编码器
//位置模式,梯形轨迹,抗齿槽校准操作
//20231207,loop222@郑州

odrv0.erase_configuration()
odrv0.config.dc_max_positive_current = 30
odrv0.config.dc_max_negative_current = -5.0
odrv0.axis0.motor.config.motor_type = MOTOR_TYPE_HIGH_CURRENT
odrv0.axis0.motor.config.pole_pairs = 7
odrv0.axis0.motor.config.calibration_current = 6
odrv0.axis0.encoder.config.mode = ENCODER_MODE_SPI_ABS_AMS
odrv0.axis0.encoder.config.abs_spi_cs_gpio_pin = 1
odrv0.axis0.encoder.config.cpr = 2**14
odrv0.axis0.controller.config.control_mode = CONTROL_MODE_POSITION_CONTROL
odrv0.axis0.controller.config.vel_limit = 20
odrv0.axis0.controller.config.pos_gain = 50
odrv0.axis0.controller.config.vel_gain = 0.05
odrv0.axis0.controller.config.vel_integrator_gain = 0.5
odrv0.axis0.controller.config.input_mode =INPUT_MODE_TRAP_TRAJ
odrv0.axis0.trap_traj.config.vel_limit = 10
odrv0.axis0.trap_traj.config.accel_limit = 20
odrv0.axis0.trap_traj.config.decel_limit = 20
odrv0.axis0.controller.config.anticogging.calib_pos_threshold = 72
odrv0.axis0.controller.config.anticogging.calib_vel_threshold = 72
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_pos = 0      //转到位置0
odrv0.axis0.controller.config.input_mode = INPUT_MODE_PASSTHROUGH  //设置为直通模式
odrv0.axis0.controller.start_anticogging_calibration()   //开始抗齿槽校准
odrv0.axis0.controller.config.input_mode =INPUT_MODE_TRAP_TRAJ   //校准完成,切换回梯形轨迹模式

odrv0.axis0.motor.config.pre_calibrated = True
odrv0.axis0.controller.config.anticogging.pre_calibrated = True
odrv0.axis0.config.startup_encoder_offset_calibration = True
odrv0.axis0.config.startup_closed_loop_control = True
odrv0.save_configuration()
odrv0.reboot()

odrv0.axis0.controller.input_pos = 0.5
odrv0.axis0.controller.input_pos = 0.2
odrv0.axis0.controller.input_pos = 1.8
odrv0.axis0.controller.input_pos = -0.3
odrv0.axis0.controller.input_pos = -1.5
odrv0.axis0.controller.input_pos = 0

?

四、移植后的代码操作

  • 在MyProject.h文件中设置参数,下图:
    在这里插入图片描述

  • 编译烧写,

  • 发送指令“C”,3秒钟后电机“嘀”一声,然后正转8个电角度,反转8个电角度,同时串口打印校准参数。

  • 发送指令“G”,电机闭环,

  • 发送指令“K0”,电机转到位置0,

  • 发送指令“D”,开始抗齿槽校准。校准时间不确定,校完为止,校准完成后电机回到位置0,
    代码中已做了改进,校准时切换直通模式,校准完成后恢复梯形轨迹模式,电机不再“腾”的一下回到位置0,
    校准成功后LED指示灯开始闪烁,方便观察是否校准成功(上电后默认LED不亮)。
    在这里插入图片描述

  • 此时可以输入指令查看电机转动效果,“K0.5”或者“K0.9”。

  • 如需保存参数,发送指令“A1”,表示已经校准;发送指令“B1”,表示上电进入闭环模式。
    移植后的代码可以跳过上电检测,直接进入闭环,上一节代码中有说明。

  • 发送指令“F”,保存,

  • 发送指令“R”,重启。

演示视频:https://www.bilibili.com/video/BV1XG411v7hM/?vd_source=33c70ef3713ea86e5385ac1e62223bcf

五、总结

  • 5008电机的齿槽效应小,改善效果不明显,用齿槽效应大的电机测试,改善效果还是很明显的。
    在这里插入图片描述
  • 位置环P参数和速度环PI参数,影响了抗齿槽的校准速度和运行效果,如果效果不理想可以调试这3个参数,
  • 对于齿槽效应大的电机可以放宽校准误差,特别是 ANTIcogging_pos_threshold 参数,以加快校准速度,
  • 尽管如此,仍然存在有转到指定位置后电机左右摆动不稳定的情况,大概是当前算法还不够完美。

?
?
(完)
?
?
?

文章来源:https://blog.csdn.net/loop222/article/details/134847403
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。