前言
首先声明,笔者在电机控制之路也只是一个新手,撰写本文主要是为了对自己学习内容做一个总结和记录。网上FOC双闭环控制时的PI调参方法种类繁多。笔者在看的眼花缭乱之后以德州仪器的InstaSPIN-FOC™ and InstaSPIN-MOTION ™User’s Guide作为主体,结合了自动控制理论和网上其它大佬的文章总结出一套可以直接计算出大致能用的PI参数的方法。若有谬误之处,劳烦于评论区指出。本文在之后会不断更正。
一、仿真环境介绍
笔者仿真时设定的直流母线电压为24V,PWM开关周期为10k。使用的电机为表贴式永磁同步电机(PMSM)。
表贴式PMSM的主要特点有两个:
一、转子为永磁体无需额外提供励磁电流。因此控制过程中只用控制定子的磁场和电流。
二、定子的d、q轴电感相同,于是转子的转矩仅由q轴电流提供。这样一来,想进行最大转矩电流比控制(MTPA)的时候,只需要控制d轴电流为0即可。极大的简化了控制流程,适合新手学习和理解。
simulink中PMSM的主要参数有:
定子相电阻:Rs; 电枢电感:Ls 磁链: Flux
次要参数有:
转动惯量:J 粘滞阻尼:F 极对数:P 静摩擦力:Tf
以上参数根据自身想仿真的电机来进行设置,基本都可以在电机的参数列表中找到。需要注意的是粘滞阻尼的数据可能找不到,但是不能设为零(因为现实中该项绝对不为零),笔者设置的是0.001。
二、PI控制器介绍
本文PI参数整定方法主体来源于德州仪器的InstaSPIN user's guide第十一章,链接:InstaSPIN-FOC and InstaSPIN-MOTION User's Guide (Rev. I)。
首先,调节PI参数之前,需要确定所使用的的PI控制器的类型。
并联PI控制器如下图:
用代码可以表示为:
output=kp*error+ki*sum_err;
sum_err+=error;
simulink中,将PI控制器格式设为parallel即可。
串联PI控制器如下图:
二者的参数可以互相转化:
三、电流环PI参数设计
方法一:等效一阶模型法
在设置电流环PI参数时,InstaSPIN user's guide的设计思路是通过PI控制器带来的零点抵消掉电机传递函数中的极点,最终将电流环系统的闭环传递函数变成一个一阶系统。然后我们可以根据实际需求设定出想要的电流环带宽,然后以此计算出PI参数。
首先, 电流环系统示意图如下:
左边部分的PI控制器传递函数为 :
右边部分电机定子的传递函数为:
所以可得开环传递函数:
于是可以得到整个系统的闭环传递函数:
显然,当Ki满足:Ki_series=R/L 时,PI控制器的零点和电机定子传递函数的极点相同,可以互相抵消。此时,闭环传递函数简化成:
参考胡寿松《自动控制原理(第七版)》:
易知我们得出的传递函数是一个典型的一阶系统,其时间常数为:T=L/Kp_series,
电流环带宽:bandwidth=1/T;
对于一阶系统,阶跃响应的调节时间约为3T
于是我们可以根据所需调节时间设计电流环带宽,从而确定Kp,Ki。
方法二:等效二阶模型法
从理论上讲,电流环是个一阶闭环系统的话,那么响应曲线应该是没有过冲和震荡的。但是实际上……你会发现,你调出的阶跃响应就算没有超调量也不像一阶阶跃响应的样子。就笔者从信号的响应曲线来看,电流环系统起码是二阶以上的。
首先,方法一中没有考虑电压调整过程中时间滞后,如果使用的是七段式SVPWM,那么时间滞后应该是1.5倍的采样周期。此处可参考:SPMSM控制:传统PI电流环参数的整定 - 知乎 (zhihu.com)
将文中所说的时间滞后加入传递函数后,新的开环传递函数为:
注意:此处的PI控制器为并联型,需要与方法一中作区分。
调整Kp、Ki比例,如方法一中一样使得零极点对消后,开环传递函数可化为:
显然,该系统为I型二阶系统,参考胡寿松《自动控制原理(第七版)》:
显然,我们可以对比得出Kp、Ki参数与自然频率和阻尼比之间的关系:
在此基础上,可以根据需要的调节时间和超调量,来确定所需的自然频率和阻尼比。
调节时间:
超调量:
综上,我们得出了一套根据所需动态性能设计PI参数的方法。
注意事项:
一、建立的模型是连续的,但实际仿真过程和实际单片机运行过程都是离散化的。采样周期和离散步长设置都需要考虑单片机的实际能力,采样周期和离散步长都不能过短。所以输出的信号波形中必然包含一定系统噪声。仿真时powerGUI的离散步长类似于MCU的主频,最好设置在1M到10M左右。电流采样周期和程序中计算模块的运行周期,最好设置在10K左右。此二者的具体数值根据你的具体需求设定。仿真时,将大部分模块的采样周期设置为:-1(继承父层模型采样时间),电流采样环节加入零阶保持器并将采样周期设置为所需电流采样周期即可。
二、电流较大时,波形失真大概率不是电流环没调好,而是FOC阶段出现了失真。此时,必须注意两个地方:
(1)必须对输出的Ud和Uq进行防失真处理,否则信号波形会失真甚至彻底乱掉。笔者建议求出目标电压矢量的电角度后,通过电压最大幅值与该角度的正余弦的乘积得出新的Uq,Ud。笔者从网上找到的代码和仿真模型中,是在扇区划分后,对扇区两边的基本电矢量的作用时间进行限幅。不但思路有问题而且细节方面也错的离谱,笔者建议拿网上的代码或模型仿真时一定要自己先推演一下代码是否有错之后再用。
(2)PI控制器必须进行输出限幅,阈值应该等于Udc/sqrt(3)。实际上也可以大于该值,但是必须有一个阈值。如果没有,PI控制器的积分项和输出项可能会溢出。此外,如果此处不限幅,目标电矢量的角度也会偏移,那么后面根据这个角度所做的防失真处理自然也会产生问题。
笔者做了限幅和防失真处理之后,对iq给定一个超限的阶跃信号,并令id=0后,阶跃响应曲线如下:
可见id,iq电流刚开始会跑飞,这是因为此时二者PI控制器的输出参考值Uq、Ud仍在迅速上升,处于失控状态。在Uq率先达到阈值后,id的PI控制器输出值Ud也迅速调整到合适的位置,使得iq重新回到上限值,id也稳定到0。
三、本文所给出的设计方法只能给出一个“能用”的值,如果要求较高的话,还需要对参数进行微调。电机定子传递函数带来的极点可能会十分靠近虚轴,而越靠近虚轴的极点带来的时间延迟越大。所以即使通过调节PI参数让PI控制器的零点对消掉该极点,也可能因为各种原因无法完全抵消掉该极点带来的影响。所以系统的实际阶数就会更高,实际波形和理论的区别也会越大。此外,还要考虑各个环节的滤波器和系统噪声的影响。
笔者直接使用算出来的参数,阶跃响应波形如下:
四、速度环PI参数设计
对于速度环,其结构如下图:
与电流环类似,我们可以得出速度环的开环传递函数:
将参数合并为K,可以简化为:
此处P为极数,λr是转子磁通(也等于SI单位的反电动势常数(Ke)),J是转动惯量,皆为标准单位。
由上易知:该开环函数显示出系统为II型三阶系统,在s=0处有两个极点。此外,速度环PI控制带来了一个零点:s=j*spdKi_series,电流闭环带来了一个极点:s=j*Kp_series/L。
对于伯德图,每一个极点之处,增益衰减-3dB,并移相-45度。极点之后每十倍频,增益下降20dB。零点与极点相反;每一个零点之处,增益增加3dB,并移相45度。零点之后,每十倍频,增益增加20dB。具体可参考:波特图 极点和零点 - 简书 (jianshu.com)
如伯德图所示,s=0处点有两个极点,该系统从零频开始每十倍频增益下降40dB。为了使得系统具有最大的相位裕度,零点必须在极点之前,0dB的点必须位于中频带(-20dB)的中间。
于是有:
联立得:
因此:
其中"δ"在TI的文档中被称为定义为阻尼系数(实际上影响的是中频带宽)。δ越大,零角频率与电流环极之间的距离就越远。它们之间的距离越远,这两个频率中间的相位裕度的峰值就越大。这以牺牲速度环带宽为代价提高了系统稳定性。
在把δ当做可调参数的情况下,我们已经得到了零点频率s=j*spdKi_series,所以0dB处频率为:s=j*spdKi_series*δ,于是有:
于是,只要设定好阻尼系数δ,那么速度环的PI参数就都求出来了。
对于δ的选择,TI给出了不同δ下阶跃响应曲线:
在2到30之间,选一个超调量和响应速度满足你需求的值即可。经过笔者测试,阻尼因子选4到10之间都可以达到不错的效果。
至此,我们已经得到了根据电流环带宽或者根据电流环动态响应特性的需求来设计双环PI参数的方法。
那么,如果我们只对速度环的带宽和动态响应特性有要求又改怎么设计电流环带宽呢?TI的文章中给出了在选定阻尼系数δ的情况下,速度环带宽和电流环带宽的转换公式。
综上,设定速度环参数只需要设定好电流环或速度环其中一个的带宽,再调整阻尼系数δ即可。该阻尼系数实际上影响的是开环系统的中频带宽,如果想根据所需速度环动态响应特性计算出想要的阻尼系数,可以参考:【参数整定】按典型II型系统整定PI参数_哔哩哔哩_bilibili
最后强调一下,TI给出的这套设计方法和网上找的其它方法都只能直接算出一个“能用”的值,效果或许很好但是一定会和理想效果有一定出入。
这套设计方式中电机的情况过于理想化,电流环中没有考虑系统的时间延迟,速度环中没有考虑电机传动过程中粘滞阻尼产生的阻力力矩。这里顺便解释一下为什么我一直强调粘滞阻尼不能设为零。粘滞阻尼大家可以当成风扇旋转时的风阻,这个是和速度成正比并且一定不为零。如果粘滞阻尼设为零,那么电机速度和电流大小就会完全无关,这显然不符合常识。这样的仿真缺少实用价值。
按笔者测试的情况来看,阻尼系数为6时TI这套方法速度环的响应很好,但是电流环会出现不小的超调。这时候就需要大家自己微调PI参数了,本文的方法只能给出一个合适的PI参数的取值区间。此时可参考: PID调参之“慢慢来,会很快” - 知乎 (zhihu.com)
阻尼系数为6,电流环带宽为2457Hz时,直接使用算出来的PI参数,速度、电流的阶跃响应曲线如下:
速度响应:
图中黄色曲线为速度曲线,蓝色曲线为电角度.
电流响应:
微调速度环PI参数后:
速度响应:
电流响应:
显然,设计速度环时不能单独考虑对速度环动态响应的需求。此外,如果再接入观测器和电流环、速度环反馈回路的滤波器,那么此时传递函数又会改变。而且传递函数阶数过高时就很难计算合适的PI参数了,最终还是需要手调。