本文主要是介绍ODrive移植keil(六)—— 测量电阻电感和电流环PI参数整定,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
- 一、硬件接线
- 二、程序演示
- 2.1、官方代码操作
- 2.2、移植后的代码操作
- 三、测量原理
- 3.1、测量电阻
- 3.2、测量电感
- 四、代码说明
- 五、电流环PI参数整定
ODrive、VESC和SimpleFOC 教程链接汇总:请点击
一、硬件接线
驱动板 购买链接:某宝购买
电机 购买链接:某宝购买
二、程序演示
2.1、官方代码操作
请先将驱动板刷机v0.5.6版本,当然也可以v0.5.1版本,结果是一样的,
按照标准ODrive操作,下图:
odrv0.erase_configuration()
odrv0.axis0.motor.config.motor_type = MOTOR_TYPE_HIGH_CURRENT
odrv0.axis0.motor.config.calibration_current = 5
odrv0.save_configuration()
odrv0.reboot() //v0.5.1版本需要这个指令odrv0.axis0.requested_state = AXIS_STATE_MOTOR_CALIBRATION
odrv0.axis0.error
odrv0.axis0.motor.config.phase_resistance
odrv0.axis0.motor.config.phase_inductance
只是测量电阻电感,不需要配置太多参数,
1、测量的电机一定要Hign_Current类型,云台电机不需要检测,会报错,
2、校准电流如果设置太大,电机可能会发热,太小测不准。
2.2、移植后的代码操作
-
在MyProject.h文件中设置参数,下图:
-
编译烧写,
-
发送指令“C”(不需要回车换行),3秒钟后电机“嘀”一声,校准完毕,打印测量结果,同时打印整定后的电流环PI参数。下图:
三、测量原理
3.1、测量电阻
测量电阻的原理很简单,下图:
在ODrive代码中,设定了测量电流 I,根据检测到的电流不断调整 U,大概3秒钟,最终稳定电流到设定值,
3.2、测量电感
我没有找到理论依据,只能讲下ODrive的测量过程:
1、施加固定电压 R_calib_max_voltage(默认为2),
2、输出电压交替调整方向,相当于电感上的电压一下正一下负,
3、待稳定后,测量相邻两次电流差为 dI,相邻两次间隔时间为dt,如下公式求出电感。
4、因为线圈两端的电压交替变换,使得电机产生振动,发出“嘀”的一声。
四、代码说明
电阻电感测量的相关代码在motor.c文件中,可自行查看,上面也讲过了原理,所以就不再细说,
此处主要讲下测量函数调用的过程,这也是我迷惑了我很久的部分,
4.1、主循环中等待3秒,下图:
4.2、测量工作在中断中进行,下图:
4.3、电流变换和SVPWM也在更新中断中,所以会与测量函数产生冲突,用标志位的方式处理,下图:
4.4、看上面这几行代码,也许你会觉得并没有特别之处,
但在官方代码中,电阻电感测量部分的变量和函数全部被打包为“类”,代码运行直接调用类,函数被函数指针指向后调用,非常具有隐蔽性,所以很长时间里,只是看到代码运行好像是这个逻辑,但却不明白怎么实现的:
最初移植的时候,我也用函数指针实现中断中的函数运行,但是发现函数指针太不直观了,非常容易被忽视和忘记更改指针,所以用了标志位的方法,不高级但却实用。
五、电流环PI参数整定
1、电流环的PI参数通过电阻电感计算生成,
2、电阻电感测量时肯定会有误差,如果不同电路,不同MOS测试,误差肯定更大,
3、但闭环控制的效果非常好,没有因为误差导致失控,
4、把PI参数放入SimpleFOC代码中,没有任何改善,
5、我尝试查找电流环能够如此稳定的原因,并希望用来改善SimpleFOC的控制效果,但没有实现,
6、只能说ODrive的架构和算法相得益彰,拆开就失效了。
(完)
这篇关于ODrive移植keil(六)—— 测量电阻电感和电流环PI参数整定的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!