我今天编写并验证了在arduino上的无刷电机闭环速度代码能否在我的无刷电机上跑的起来,其中的知识点和碰到的问题用笔记的形式保存下来,防止以后会忘记。
首先我们得知道foc闭环速度是什么,foc速度环通过闭环控制的方式,精确控制电机的转速,从而提高电机的性能和效率。
速度闭环和位置闭环的最大区别就是,位置闭环的编码器的反馈量返回的是角度,而速度闭环的编码器反馈量是速度。
编码器是怎么获得我们的转速的,首先速度的获取也是基于角度的获取的。是我们此时测出的角度与上次测得的角度来转换我们所得到的一个速度。我们来看看我们的SimpleFOC库中实现对速度的获取。先来看看在我们的loop代码中,获取角度是基于motor.loopFOC()这段函数。
我们可以在updata()中能可以直接得到我们的角度。我们可以点进去看一下。也是比较朴素的一段代码。这是通过IIC去读的角度值。
下面是获取角速度的代码,我也没仔细看,知道这是获取角速度的函数就行了。本质上就是(这次的角度值 - 上一次测得的角度值) / 这一段时间。
其实明白个原理就行了,接下来我们来看代码怎么写的,和其中的一些注意。虽然网上的代码有很多,可以直接复用一下,但是还是要根据我们硬件的情况来做一些修改。
这些IIC和一些PWM引脚就按自己的硬件来。我用的是SimpleFOC库,好处就是对我这种新手挺友好。我接下来就对其中一些重要配置说一下。
首先注意的是,写的是闭环速度模式,所以我们要将运动控制模式设置成velocity。
再根据我们的硬件调试出我们合适的速度PID,让我们的电机在运动过程中不会产生剧烈的抖动。调PID的话我用的是simpleFOCStudio,网上有很多教程,调试代码也是用的灯哥的,开源的也是非常好用。
最后一点就是它的速度低通滤波,在调试过程中,当电机速度低的时候,电机会发出噪声,这时候就要用到我们的低通滤波了,可以通过调试我们的低通滤波可以改善这种情况。
差不多就这些点了。