FOC(field-oriented control)为磁场导向控制,又称为矢量控制(vector control),是一种利用变频器(VFD)控制三相电机的技术,利用调整变频器的输出频率、输出电压的大小及角度,来控制电机的输出。由于处理时会将三相输出电流及电压以矢量来表示,因此称为矢量控制。
FOC控制的其实是电机的电磁场方向。转子的转子力矩正比于定子的磁场向量与转子磁场矢量的矢量积。由矢量的关系可知,若使电机的转矩时刻保持最大,则定子磁场向量应与转子磁场向量相互垂直。又因为磁场的大小与方向与电流的大小与方向有着直接的关系,所以在用FOC控制算法控制BLDC时的关键就是控制三相输入的电流大小与方向。而控制电流产生定子磁场与转子磁场垂直的关键在:控制稳定的三相输入电压及其电流向量,并且我们得知道转子的实时位置。
输入电流的方向控制,FOC给出了空间电流矢量的概念。其实质是将三相的电流矢量结合,再分解为垂直和平行于转子磁体轴方向的两个分量即d-q结构。垂直方向的电流分量所产生磁场正交于转子的磁场,这就产生了旋转力矩。而平行于转子磁轴方向的电流分量,所产生的磁场与转子磁场一致,就不会产生任何的力矩。另外,一个好的控制算法就需要使这个平行于转子磁轴方向的电流分量尽量最小化,因为,这个电流分量只会使电机产生多余的热量,并加剧轴承的磨损。我们需要控制线圈的电流,以使垂直于转子磁轴方向的电流分量达到最大。由此而得到的电机力矩和这个电流分量的大小成比例。
为了使与转子磁场同向的定子电流矢量最小化(为零)且垂直的磁场最大化,定子线圈内的弦波电流需要随着转子的转动角度实时地进行相位调整。控制稳定的三相电流输入可以建立P-I控制器,P-I控制是在不停的调制输入,一旦电机电流被转化成d-q结构,控制将变得非常简单。我们需要两路P-I控制器;一个控制平行与转子磁场的电流,一个控制垂直向电流。因为平行向电流的控制信号为零,所以这就使电机平行向的电流分量也变成零,这也就驱使电机的电流矢量全部转化为垂直向的电流。由于只有垂直向电流才能产生有效的力矩,这样电机的效率被最大化。另一路P-I控制器主要用来控制垂直向的电流,以获得与输入信号相符的需求力矩。这也就使垂直向电流按照要求被控制以获得所需的力矩。
转子的实时位置的确定有两种情况:有位置传感器、无位置传感器。对于有传感器,由于电机的传感器(一般为编码器)能反馈电机转子的位置信息,因此在控制中可以不使用位置估算算法,控制起来相对无传感器简单,但是对带传感器的电机应用来说,往往对控制性能要求较高。对于无传感器,由于电机不带任何传感器,因此不能通过简单读取传感器的测量值来得到电机转子的位置信息,所以在控制中需要通过采集电机相电流,使用位置估算算法来计算转子位置。
具体的FOC控制原理图:
1、采集到两相电流
2、经过clarke变换后得到两轴正交电流量,
3、经过旋转变换后得到正交的电流量 Id、Iq,其中Iq与转矩有关,Id与磁通有关。在实际控制中,常将Id置为0。得到的这两个量不是时变的,因此可以单独的对这两个量进行控制,类似直流量控制一样。而不需要知道具体要给电机三相具体的电压为多少。
4、将第3步中得到的Iq与Id量分别送进PI调节器,得到对应的输出Vq和Vd;
5、通过传感器得到电机转过的角度。
6、进行逆park变换,得到二轴电流量。
7、对第6步中的Va,Vb进行逆clarke变换,得到实际需要的三相电压输入给逆变电桥,驱动电机转动。
坐标变换理论可以降低马达方程的复杂性,利用坐标变换把定子及转子变量变换到一个旋转坐标系中,该坐标系的转速为角速度ω。
假设fax, fbx, fcx 为三相瞬时变量,位于相移120度的a,b,c坐标上,fqx, fdx, f0x 为其变换变量,位于正交坐标d,q上:
变换方程为:
3个变换方程用于矢量控制:
Clarke: ω=0, θ(0)=0 -> θ=0;
Park: ω=ωr, θ(0)=θr(0) -> θ=θr;
反Park: ω=-ωr , θ(0)= θr(0) ->θ=-θr
所以有:Clarke将定子电流转变为静止直角参考坐标(称αβ坐标);然后,Park将电流转变为按随机的速度旋转的坐标为(磁场定向控制,与转子同步);反向Park变换使反电动势从旋转坐标(q, d)到静止坐标。变换过程如下图:
Clark变换应用于定子电流:
Park变换应用于定子电流:
Park逆运算变换应用于定子电压:
程序的运行过程:
1、程序先通过 ADC 采样,对 BLDC 电机的 a、b 两相进行电流采样;
2、通过 Clarke() 函数将 a、b 两相电流转换为静止坐标系上的电流 Iα、Iβ ;
3、由 Park() 函数将电流 Iα、Iβ 和经 DAC 转换的旋转角度θ转化为电流 Iq、Id;
4、将电流 Iq、Id 的电流差输入到建立的 PI 控制器里,通过调节适当的 PI 控制系数输出最佳的旋转电压Vd、Vq;
5、用 Circle Limitation 来限制 Vd、Vq 的值以选择恰当的值;
6、用 Rev_Park()函数将旋转电压 Vd、Vq 转换为静止坐标系上的电压Vα、Vβ;
7、通过三电阻式相电流重构法将电压 Vα、Vβ ,重新建立为 BLDC 电机的三相电压 Ux、Uy、Uw 的大小;
8、用 SV_PWM 算法计算矢量及其分分扇区的扇区信息,通过控制 TIM 控制6个 MOSFET 管来控制各相电压方向以达到最后的控制目的。
扇区六种状态的计算方式,令 N=4*C+2*B+A; N值与扇区的对应关系:
基本矢量作用时间计算与三相 PWM 波形的合成:
PWM 周期计数器的值------为NTpwm=fdsp/fs/2。
发波系数:
Unom 为系统额定电压(线电压),开关频率为 fs ,系统时钟为 fc,输入额定电压 Udc,则PWM周期计数器的值:NTpwm=fc/fs/2。
又有电压基值,实际电压 U=U'Ubase,U'为标幺值,可以计算得到各扇区基本矢量的作用时间:
STM32 的12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。
ADC采样程序流程:
1、采样前需要读取三个采样通道的零电流值,以进行传感器校准;
2、ADC经TIM1的N通道进行上升沿实践触发后进入中断,进入起动模式,通过FOC驱动算法获得采样值,用计算出的值Vα、Vβ来判断其所在扇区位置和三相PWM输出的占空比;
ADC采样注意事项:只有在下桥臂打开时由SVPWM的当前扇区决定该读哪两相电流,程序中只采样A、B相电流,C相的电流通过 Ia+Ib+Ic=0 的电机电流关系得出。
每次桥臂开关状态有变化时,会在shunt电阻上的电压产生一个电子干扰,时间长度为TNoise,且当下桥臂打开后,需要等待一段时间来使shunt电阻上的电压达到稳定值,时间长度为TRise,所以在TNoise 及TRise期间不能读相电流;
单电阻采样的时刻与三电阻不一样,且对于变负载或者位置环的应用,单电阻采样不准,因此不建议采用。
对于FOC算法,Vqs与Vds是由2个PID调节器单独计算的,因此需要正确计算电压矢量V,使之输入到SVPWM模块最大的电压幅值为:S16_MAX (即:32767)。
对于一个电机驱动硬件系统,硬件的简化框图如下:
对于下桥臂的每一个开关状态,其对应的流过采样电阻的电流如表1。T4, T5 及T6 的开关状态与T1, T2 及T3互补。在表1中, 值“0” 表示开关管关闭,而“1”表示开关管打开。
其最终生成的输出PWM如下图所示:
使用中心对称模式, 每个PWM 周期被分成7个时间段;
• 在其中的三个时间段(I,IV,VII),电阻中的电流为0;
• 在其余的时间段,由于PWM为中心对称模式,电阻中的电流是对称的;
• 如图所示,存在两种情况:
• 时间段II 及VI, iShunt = –iC;
• 时间段III 及V, iShunt = iA;
• 因此,此时有可能从采样值重建马达的三相电流:
• 时间段III 及V , iA = iShunt
• 时间段II 及VI, iC = -iShunt
• iB = -iA - iC
由于电流会有一定的稳定时间,我们需要避开这个时间。
定义‘TRise’: 任一管子开关后,ADC通道上的输入信号的稳
定时间;
定义Tmin: 执行电流采样所需要的最小时间:等于TRise +
ADC 采样时间+ 死区时间;
定义DMIN :TMIN的占空比的表达形式
则由图可以看出,AD采样是需要避开电流稳定的时间段,通常是通过延时一段时间后采样来实现的。但是,存在以下两种情况,就会衍生出电流采样不准的问题:
1、相邻空间矢量扇区的边界区域
在相邻的两个空间矢量扇区的边界区域, 有两个桥臂的占空比几乎相同;
在这种情况下,七个子时间段变成了五个,这样的后果为:只可能采样到两个相电流中的一个;
因此,如果电压矢量进入到下图的灰色区域,就不能在同一个PWM周期中同时采样到两个相电流。
2、低调制比
在低调制比的情况下,三个桥臂的占空比几乎相同;
• 在这种情况下,七个子时间段变成了三个;
• 在所有的三个时间段,流过采样电阻的电流为0;
• 这就意味着当电压矢量进入下列灰色区域时,无法采样到相电流。
备注: 三电阻可以在任何时刻采样,不存在此类问题。
对于FOC库里面的电流采样的函数,主要是以下几个:
函数名 |
描述 |
调用时刻 |
SVPWM_1ShuntInit |
初始化PWM 及 ADC 外设 |
MCU复位后 |
SVPWM_1ShuntCurrent ReadingCalibration |
存储零电流时采样电路的ADC值 |
马达启动命令后 |
SVPWM_1Shunt GetPhaseCurrentValues |
计算相A 及 相B的电流值 |
在ADC转换完成后及FOC 子程序之前 |
SVPWM_1Shunt CalcDutyCycles |
计算占空比值,配置下一次电流 采样时的ADC及定时器模式。 |
FOC 子程序之后 |
SVPWMUpdateEvent |
在Update 事件的 ISR 中执行的 子程序 |
在 Update 事件的 ISR 中 |
SVPWMEOCEvent |
在ADC转换结束事件的 ISR 中 执行的子程序 |
在ADC转换结束事件的 ISR 中 |