最近因为做毕设的关系,对于无刷电机的FOC控制又做了一些研究。可以说,比在日本的时候对FOC又有了更进一步的了解。
对于FOC来说,其实根本上的目的,是希望电机的磁链为圆形。什么意思呢,我们希望通过改变ABC三相的电压,来控制磁场矢量,使电机按照这个磁场矢量的方向来跑。那么这个磁场矢量就是按照圆形来运行的。
基于这个想法,有几个名词,其中大名鼎鼎的就是SVPWM。所谓SVPWM,实际上只是我们改变ABC三相电压,来形成磁场矢量的工具,具体如何实现的之后再说。这里只要知道,SVPWM只是FOC中的某个环节的某个工具,二者并不等价。
那么对于FOC,就有很多种控制了。
比如,不管不顾型。这种是最简单的一种控制方式,不需要知道当前无刷电机转子的位置,只需要无脑令磁场矢量按照圆形运行即可。这种控制方式在许多无刷云台上很常见,可以不依赖于编码器,也不需要电流环,硬件上实现很容易,代码也很好写,基本上只要实现了SVPWM就顺带可以实现了这种控制方式。
在FOC的调试中,这种控制方式也常用来做编码器的对齐,或者电机磁对数的测试。简单来说,就是在代码中让电角度旋转360°,然后通过编码器来看机械角度转了几度,二者一除就可以得到极对数了。
这种方式的调速就是调整SVPWM的改变频率了。如果说占空比于频率的比值为恒值,那么这种控制就可以叫做V/F控制了。
第二种方式,就是开环控制。这里的开环指的是电流开环,也就是不对电流进行控制。基本原理就是通过编码器来获取当前转子的位置(当然需要先对齐),然后控制代码输出一个期望矢量,该期望矢量的电角度=当前转子电角度+90°。这样电机基本可以流畅地旋转起来,噪音较小、效率也较高(因为理想情况下,FOC电流闭环输出地期望电角度就是当前转子角度+90,但是由于各种七七八八的误差,虽然你想让它超前90°,但实际上很可能只超前了85°,或者超前了100°)。我在日本的研究基本也就到这里为止,因为当时那个板子的测电流部分有些问题,因此最终只能停止在这里了。
这种方式调速的话,直接修改SVPWM的占空比(其实也就是期望矢量的模长)来调速。
这种方式,在调试中,常用来看FOC的一些变换(如派克变换、克拉克变换等),通过让电机旋转起来,结合波形来看看自己的算法写得对不对。
第三种方式,就是闭环控制了。所谓闭环,就是指采样电机的三相电流(实际硬件中可能只采某两相),通过一些变换(派克、克拉克等),来获得两个电流,一个是转子垂直的Q轴电流,一个是与转子重合的D轴电流。因为我们是要让电机转起来,所以显然Q轴电流才是我们需要的,于是我们通过控制Q轴电流,保持D轴电流为0,就可以让电机流畅、安静地运转起来了,而且扭矩也是最大的。
这种控制方式,需要采样电流,也需要知道电机的位置(在派克变换中需要用到,可以通过编码器获得,也可以通过电机的参数电阻、电感等通过算法来观测),硬件设计上最为麻烦。
好了,控制方式大概就是这些。接下来讲讲为什么要进行这些变换。
克拉克变换,主要是将ABC三相的静止坐标系,转化为alpha、beta两相的静止坐标系。电机运行起来,三相的正弦波电流变成两相的正弦波电流。看着好像用处不大,实际上在实现SVPWM的时候很有用。期望电压矢量的描述就可以直接在alpha\beta坐标系中进行,这样一个矢量只需要使用角度、模长就可以描述了。
派克变换,主要是将坐标系旋转起来。也就是让坐标系跟着转子旋转,这样就可以把正弦波变成一个定值。有了一个定值,我们在PID控制中就可以很方便地计算控制量。
这两种变换都是很简单的坐标轴投影变换,可以自己拿纸笔推导一下。至于恒幅值、恒功率变换,也只是前面的系数不同而已。
遇到的一些坑
- 本杰明的硬件中电流测的是CH1、CH3两相,如果按照CH1、CHI2、CH3分别是ABC三相来看,测的就是A相和C相的电流
- 我在代码里一开始以为测的是B相的电流,结果导致通过派克变换后的电流居然还是正弦波
- 我使用TIM1来输出PWM波,TIM8作为从定时器与TIM1同步。TIM1运行在中心对齐模式,PWM模式1下。TIM1的更新事件来触发TIM8。每触发一次就将TIM8复位。TIM8的复位信号再去触ADC采样。
- 由于运行在中心对齐模式下,定时器上溢出和下溢出都会产生更新事件,因此需要使用RCR(重复计数器)。
- 手册上写,RCR为奇数的情况下,在定时器启动前写入,就会在定时器上溢出的时候触发更新事件。
- 在定时器启动后再写入,会在下溢的时候触发。
- 显然我应该在OCREF为低电平、OCNREF为高电平的情况下采样(此时上桥断开,下桥闭合),因此应该在上溢出的时候发生更新事件,但是我按照手册上那样操作,发现最后采出来的AC相电流居然是定值(在电机旋转的情况下),反而在定时器启动后写入,采样的电流是正常的正弦波。
- 这个问题很匪夷所思,目前也不知道哪里有问题。
- 相电流的正负问题。
- 比如ABC三相为100(A上桥接通,BC下桥接通),此时A相电流为正。
- 如果相电流的正负方向搞反,会导致Q轴、D轴的坐标系有问题,D轴的正方向会相反。
- MOS跑着跑着突然贼烫
- 以为是死区时间不够,本杰明硬件上默认DRV8302的电阻确定的死区是50ns好像,导致上下桥有短暂的直通,后来才发现是栅极电阻被烧坏了,原来4.7R,变成了800多R,导致mos估计没有充分导通。
- 但是为什么栅极电阻会被烧坏呢?是不是因为死区时间呢?