抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >


菜鸡的FOC踩坑记录/(ㄒoㄒ)/~~

前言

FOC简介

FOC即为矢量控制器,具体的介绍可以参考稚晖君的知乎博客【自制FOC驱动器】深入浅出讲解FOC算法与SVPWM技术 - 知乎 (zhihu.com),我这里就算转行做电控专业也写不这么好的博客,就不在这里献丑了。

我这里主要是记录和分享我在自己使用和编程实现FOC时遇到的问题和理解,博主并不是相关专业的,如文章有疏漏欢迎指出~

由于自己的无知和贫穷,在尝试做FOC时,Github一搜索,直接选择了成本较低的开源方案miniFOC,这也是我后面所有噩梦的开始。

复刻mini-FOC

由于只给了Gerber文件,为了方便后面对电路进行调整,看原理图也不复杂,我根据原理图自己走线复刻了一版,同时加入了下载口方便后面的调试,硬件电路可以参考我的github链接

在打样好电路后,就是无刷电机的选型,显然我完全不会选,淘宝无刷电机直接选择了一款,买到手后发现没有磁铁(mini-FOC使用磁编码器),于是网上随便买了一个磁铁,很显然,到这一步电机还是没转起来。

首先便是磁铁的分类,磁编码器的原理如下,是通过磁场来确定当前电机朝向的:

image-20230418231932485

但圆形磁铁根据充磁的不同分为径向充磁和厚度充磁(轴向充磁),厚度充磁NS级在上下,径向充磁才能作为磁编码器的磁铁,如下图所示。

image-20230418232051002

解决磁铁的问题后,在调PID时总是异常抖动,为了解决问题,开始了FOC原理的学习和代码的分析。

无电流环的FOC

首先,遇到的第一个问题就是这款FOC没有电流环,我当时学习原理是根据稚晖君的博客学习,虽说少了电流环理论上方便我分析,但对于当时的我来说,少的电流环对应哪一块,去掉后怎么分析完全不懂,在经过一段时间的摸爬滚打后,才稍微理解了其中的一部分原理。

无电流环意味着什么

在稚晖君的博客里,一开始便分析了电流环,电流环的结构图如下所示,给定Iq和Id的参考,就可以通过电流环实现对电机的精准控制。

img

电流环是FOC中最内层的环(FOC一般会有位置环、速度环、电流环),他的作用是给电机一个恒定的力矩(力矩是什么的链接),让他转动,而产生的力矩的大小是跟电流相关,而不是电压(高中物理学过的安培力)。根据原理来讲,电流环中的Iq就是控制平行于运动方向的力,而Id是没有用的力,如下图所示,我们的目标就是要让Id为0。

img

正常情况下,电流和我们设置的电压似乎是等价的(I=U/R),可是电机运动会有反电动势,没有电流环,我们只能保证Ud设置成0,而由于反电动势的存在,真正的Ud=Ud_set+反电动势,显然并不是0,这就是没有电流环的后果,他会让一部分力浪费掉,产生的力不是平行于运动方向的,有部分被白白浪费了,可能会让电机异常抖动,发热等问题。而随着转速提高,反电动势增大,可能导致FOC完全失效。

明白了这个,就知道没有电流环并不是什么大不了的事情,至少没有电流环FOC也能动。接下来,先尝试将电流环去掉,使用简单的SPWM进行分析。明白了这个就知道FOC的控制有多么简单了。

无电流环的SPWM

为什么这里要写SPWM的分析呢?写这种又简单有垃圾的算法还不是因为菜/(ㄒoㄒ)/~~。

将上图的反馈环去掉,SVPWM换成RevCalrk变换,即可得到无电流环的SPWM结构图,如下图所示:

SPWM

这时候,你可能会问:啊?就这?这也太简单了吧,搞一半天你连这都不懂啊😅?家人们谁懂啊,大无语事件,下头博主这么菜还来写博客!我只能回答:是的,无电流环的SPWM就这么简单QAQ,虽然很简单,但我这里还是简单的讲解一下这几个变换的作用,以及他是如何让电机动起来的。

稚晖君讲解时是直接讲解整个回环的,从反馈开始讲起,我这里没有反馈回路,分析起来就简单多了,我们就可以直接从左到右开始推导。首先要明确一点,我们这里的Vq和Vd分别是设置平行运动方向的电压和垂直运动方向的电压,为了便于理解,可以直接无视掉Vd,默认没有反电动势(没有反馈也只能这样),那么我们需要控制的就只有一个值,即Vq,可以直接把Vq想象成力的大小,也就是圆周运动切向方向力的大小,给定一个Vq就相当于给定一个恒定的切向的力,由于阻力和电机运动速度正相关,电机会先加速(Vq大于阻力),再匀速(Vq等于阻力)。好了,接下来我们开始由Vq向Va,Vb,Vc推导。

首先Vq是一个恒定的力,也就是一维的,只有大小,我们需要先把他转换为矢量形式,也就是既有大小又有方向的力。先直接给出转换的表达式: \[ V_\alpha=cos(\theta)V_q+sin(\theta)V_d=cos(\theta)V_q \]

\[ V_\beta=-sin(\theta)V_q+cos(\theta)V_d=-sin(\theta)V_q \]

写成矩阵的形式如下所示: \[ \begin{aligned} \begin{bmatrix} V_\alpha\\ V_\beta \end{bmatrix} \end{aligned} = \begin{aligned} \begin{bmatrix} cos(\theta)&sin(\theta)\\ -sin(\theta)&cos(\theta) \end{bmatrix} \end{aligned} \times \begin{aligned} \begin{bmatrix} V_q\\ V_d \end{bmatrix} \end{aligned} \] 这个变换即Park反变换,表达式中,\(\theta\)为电机转子当前角度,我们要产生垂直与电机转子的力。几何关系如下图所示。

CLARK反变换

图中绿色箭头为当前电机方向,黄色箭头为希望产生的力矩方向,通过简单的几何计算就可以得到上述的表达式。

然后我们需要将矢量的力分解成3个方向的电压,这是电机实际能产生电压的方向。转换方式如下所示 \[ \begin{aligned} \begin{bmatrix} V_a\\ V_b\\ V_c \end{bmatrix} \end{aligned} =k' \begin{aligned} \begin{bmatrix} 1&0\\ -\frac{1}{2}&\frac{\sqrt{3}}{2}\\ -\frac{1}{2}&-\frac{\sqrt{3}}{2} \end{bmatrix} \end{aligned} * \begin{aligned} \begin{bmatrix} V_\alpha\\ V_\beta \end{bmatrix} \end{aligned} \] 这里\(k'\)相当于一个系数,他不会影响生成的合力的方向,但会改变合力的大小(显然用三维表示二维有无数种表示方法,这里只是其中一种)如果要保证合成的电压和实际给的一致,则取\(k'=1\),如果要保证功率一致,则取\(k'=\sqrt{\frac{2}{3}}\)。这里转换的图我就不画了,和上面同理,简单的脑补一下就可以得到,这样我们就完成了从Vq到Va,Vb,Vc的转换了。

这里还有一个问题,转换过程中大小好像发生了变换,SPWM中,使用占空比来表示电压,也就是Va、Vb、Vc最大为1,最小为0,这时候Vq最大能设置成多少呢?其实在k'=1时,可以很容易推导出来Vq最大值可以设置为1

无电流环的SVPWM

然后就是SVPWM了,这里分开是因为写博客的时候我还不会SVPWM的推导,这里后面再写/(ㄒoㄒ)/~~

TODO

多极对数的FOC

如果正常情况下,FOC就可以直接使用了,不过这里还有一个概念,我们可以注意到,网上的FOC代码中都有一个可以配置的项目叫电极对数,对于我这样没学过电机的小白来说,该填多少又是一个问题。更进一步,多极对数的FOC和单极对数编程上面有什么区别呢?。好在网上能够找到资料,下面我简单的讲解一下相关概念。

级数与极对数

简单来讲,极数就是电机中永磁体N极和S极的总数。将一个N极加一个S极作为一对磁极,那么极对数=级数÷2,如下图所示,该电机一共有6个级数,3个极对数。

img

当然,测量极对数时总不能把电机扒开看有几对磁铁吧,通常购买时电机参数会给出,如果是没有给出参数电机可以通过对其中两根线通电,手拨动电机,看一圈一共有几个稳定的点,那就是有几个极对数。

电角度

明确了极对数的概念,接下来就讲解一下多极对数的FOC在编程上面个和普通FOC的区别。

在这里,需要明确一个叫电角度的概念,简单的讲,就是相对与定子,转子磁场旋转的角度。如下图所示,转子转120度,对于定子来说磁场完成了一个周期的变换,所以电角度=转子角度*极对数。

很显然,做控制时我们我们需要用电角度而不是转子角度(机械角度)。转子角度在多极对数已经不能表示当前磁铁的朝向了,显然我们需要生成的磁场需要以电角度为参考才能产生垂直的力矩。

这里举个例子,假设当前机械角度为15度,其实磁场已经转过15*4=60度,需要产生垂直于60度的力矩,如果使用机械角度会使产生的力矩不垂直于电机半径。

image-20230305214822098

有了以上这些概念,加上稚晖君大佬的讲解,才将FOC弄了个一知半解,后面遇到的问题我也会继续更新在该博客上的。

参考文档

【自制FOC驱动器】深入浅出讲解FOC算法与SVPWM技术 - 知乎 (zhihu.com)

无刷直流电机基础知识总结,全! - 知乎 (zhihu.com)

手撕系列(2):Clark变换与Park变换 - 知乎 (zhihu.com)

评论