反转基因福娃 发表于 2024-7-11 09:10:28

【从零开始实现stm32无刷电机FOC】【理论】【3/6 位置、速率、电流控制】

上一节,通过对SVPWM的推导,我们得到了控制电机转子任意受力的能力。本节,我们选用上节得到的转子dq轴解耦的SVPWM形式,对转子受力进行合理控制,实现FOC电机控制的终极目的:位置、速率、电流控制。
PID控制

看到本节的人,大概率是了解PID(Proportional比例,Integral积分,Derivative微分)控制的,也是本人能力所限,在此不进行完备讲解,也不涉及高级控制方法。
不管是电机的位置还是速率还是电流,都可以视为被控参数。
从直观想法上,当一个被控参数实时值小于目的值时,需要施加外力使被控参数进步。假如施加的外力过大,被控参数会被超调,导致被控参数在目的值附近的振荡幅度越来大;假如施加的外力过小,参数到达目的值的速率又太慢。因此需要得到一个符合的外力,使得被控参数既不会振荡越来越剧烈,调治速率也不会太慢。从这个直观的控制想法就是PID中的P。单纯使用P控制时,设置外力大小=被控参数与目的值的差距*P系数,所谓差距越大施加的外力越大,是很直观的。假如P系数设置的比较小,虽然被控参数不会一直振荡了,可以慢慢稳固到目的值了,但是调治速率太慢了,此时可以加入PID的D控制,使得原先振荡的被控参数快速紧缩到目的值。
再从直观想法上去思考D控制,纯P控制下被控参数靠近以及擦过目的值时,一个与速率反方向的纠偏力有助于被控参数在目的值附近产生制动,让被控参数更快地紧缩到目的值。这个与速率反方向的纠偏力就是D控制。加入D控制后,控制外力大小=被控参数与目的值的差距*P系数+被控参数速率*D系数。当纯D控制时,由于初始状态下被控参数的速率为0 ,被控参数不会得到外力,由此也可以看出,P控制是提供外力的,D控制是约束外力的。假如D系数选择过大,则轻微的速率就能够引起巨大的外力;假如D系数选择过小,则不敷以约束P控制生产的外力,被控参数稳固就慢。
还是从直观想法上去思考I控制,当被控参数存在负载时,单纯的P控制提供的外力可能不敷以支撑这个负载,因此可以加上这样一个机制,把被控参数与目的值差距随着时间累计起来,这样就能得到存在负载时被控参数到达目的值所需的动力了。这个机制就是I控制。加入I控制后,控制外力大小=被控参数与目的值的差距*P系数+被控参数速率*D系数+被控参数与目的值差距随时间累计*I系数。
在控制电机时,没有特别情况下,由于d轴对电机旋转不天生贡献,pid控制可以只控制q轴的力,d轴可以进行控制也可以直接设置输出为0。
滤波

在速率控制和电流控制时,受限于采样精度和频率等,速率和电流是不稳固的且变革比较快,例如下图是电机速率的直接计算值,存在许多锯齿,在真实值附近波动,假如直接使用这样的值,会导致PID输出波动较大,
https://i-blog.csdnimg.cn/direct/56ffcb55e5a24a5695a59183ff801289.png
下图为颠末滤波后,比较靠近真实值:https://i-blog.csdnimg.cn/direct/0126cfbaf41a49459365e7142187536f.png滤波方法有许多种,比如低通滤波、卡尔曼滤波,本质就是在混合了噪音的数据中估计出一个靠近真实的值。由于滤波是一个非常大的课题,原理不在本节进行阐明,可直接查察后续实践部分的代码,只是在此提示,输入PID控制器前,需要进行滤波计算。
单独位置控制

位置指的是角度,要注意,有两种物理角度,一个是电机角度,一个是转子角度,两者是不一样的。电机编码器是安装在转子外壳上的,因此编码器得到的是转子外壳的角度,而转子位于内部,由于转子外壳和转子是互相固定的,两种角度有一个固定偏移,安装的时候编码器零度不可能正好对着转子永磁体。编码器角度由编码器提供,转子角度也就能知道了。在后续实践部分会阐明怎么得到这个固定偏移,在本节只需完成理论计算部分。合成的磁矢量是作用于转子永磁体的,因此理论计算是在转子角度基础上计算的。
https://img-blog.csdnimg.cn/direct/257e1ae7002f44a2b109a4db14ef8f9c.png
有两种方法可以实现转子的位置控制:
pid法:
直观的思想就是用转子q轴不绝地左右拉扯转子,转子一旦偏离目的位置了,就在q轴施加一个反向的力拉扯一下,偏离越大,拉扯力越大,让转子回到目的位置。
优点:q轴能够提供较大的力,位置控制比较迅速有力。
缺点:由于q轴与转子永磁体磁矢量相差90度,因此需要知道转子实时位置(角度)。
由于在有编码器的情况下,转子实时位置很容易得到,因此大部分情况下使用pid控制位置。
https://img-blog.csdnimg.cn/direct/3790b37762f94f8ebc21ebdff3062002.png
单独位置的FOC控制框图如下图。图中的意思是输入一个目的位置,与编码器计算得到的角度进行差值计算,然后输入pid控制器,只控制转子q轴强度,d轴强度直接设置为0,最后将dq轴强度(0~1之间)输入到前文推导得到的SVPWM函数中,输出得到uvw桥臂的pwm占空比。这里要注意的是输入的目的位置                                             θ                                       i                               n                                                 \theta_{in}                  θin​可以是转子角度或者编码器角度或者多圈角度,只要与反馈的                                 θ                              \theta                  θ保持同一种角度即可。
https://i-blog.csdnimg.cn/direct/beb16098f1fc4359a35e8dea6bb57b5e.png
d轴强拖:
核心思想是人为控制线圈天生一个目的线圈磁矢量,永磁铁的d轴会被吸引到目的位置。注意该方法是吸引d轴到目的位置。
优点:由于天生的就是目的位置,因此无需知道转子角度,转子自然会被吸引过去。
缺点:切向分力小,轻微切向外力就能让转子明显脱离位置。
https://img-blog.csdnimg.cn/direct/3238035c66844ef8a9cc78f5f0011342.png
单独速率控制

速率控制使用d轴拖动的方法就不符合了,由于d轴拖动就是为了不使用编码器,没了编码器数据就很难计算速率了。速率控制可以使用pid控制方法,但是由于电机旋转过程中速率值变革比较不稳固,而D控制是与被控参数的变革程度成正比,以是一般只使用PI控制。
速率的计算方式非常简单,就是                                                      当前角度                               −                               上次记载的角度                                                 Δ                               t                                                 \frac{当前角度-上次记载的角度}{\Delta{t}}                  Δt当前角度−上次记载的角度​。
将目的速率与实时速率的差值输入到PI控制中就能实现速率控制。
单独速率的FOC控制框图如下图。
https://i-blog.csdnimg.cn/direct/3938cf82cc744e5fbdef021f085792a7.png
单独电流控制

电机的电流代表了力矩大小。转子的受力在dq轴解耦后,可以发现只有q轴才对电机旋转天生贡献,只有q轴才产生力矩,因此只需要控制q轴电流即可控制电机力矩。假如对d轴电流也进行控制可以提升电机电流使用率,降低发热,提升电机最高力矩输出。
https://img-blog.csdnimg.cn/direct/ebd55a06ac7040458bc5e183f537bb70.png
得到电机电流:
转子dq轴是一个抽象出来的概念,是为了方便解耦转子受力的,无法直接检测dq轴电流,能够直接检测的电流是电机相线电路上的电流,dq轴电流可以根据相线电流计算得到。
相线电流的检测有许多种,最常见的两种方式是:1.电流检测放置在上下桥臂功率管之间,称为在线检测。2.电流检测放置在下桥臂与GND之间,称为低端检测。
https://img-blog.csdnimg.cn/direct/ba67077d110a447fb0f82b63073de847.png
由于一个节点流出电流+流入电流=0,因此三个相线只需要两个电流检测单元即可。但是低侧检测最好使用三个电流检测单元,由于当某个桥臂的pwm占空比为1或者靠近1时,该下桥臂将没有电流颠末或者电流不稳固,三个相线就只剩下一个电流检测能够正常收罗电流,有三个电流检测单元后,可以三个都读取电流,根据占空比情况选择此中两个电流值,另一个通过电流总和为0进行计算。在线检测则没有该困扰,由于不管下桥臂是否处于关闭状态,相线始终有电流颠末。由于在线检测位置的电压比较大,因此在线检测的电流检测单元需要能够承受较大电压,价格比较高。
得到三个相线电流后,接下来想办法转换为dq轴电流。可以将相线电流投影到dq轴上,这样就能直接得到dq轴电流了,不过如今主流做法是先将dq轴投影到                                 α                              \alpha                  α轴和                                 β                              \beta                  β轴(这步称为clark变换),再将                                 α                              \alpha                  α轴和                                 β                              \beta                  β轴电流投影到dq轴(这步称为park变换),由于在更高级的无位置传感器FOC中会用到                                 α                              \alpha                  α轴和                                 β                              \beta                  β轴电流。
clark变换:
将三相电流                                             I                            u                                  ,                                 I                            v                                  ,                                 I                            w                                       I_u,I_v,I_w                  Iu​,Iv​,Iw​投影到                                             I                            α                                  ,                                 I                            β                                       I_\alpha,I_\beta                  Iα​,Iβ​上,从下图的多少关系可以看出,投影表达式为:
                                       {                                                                                                             I                                              α                                                          =                                                         I                                              u                                                          −                                                         I                                              v                                                          ∗                                           cos                                           ⁡                                                         6                                                               0                                                 °                                                                        −                                                         I                                              w                                                          ∗                                           cos                                           ⁡                                                         6                                                               0                                                 °                                                                                                                                                                                    I                                              β                                                          =                                                         I                                              v                                                          ∗                                           cos                                           ⁡                                                         3                                                               0                                                 °                                                                        −                                                         I                                              w                                                          ∗                                           cos                                           ⁡                                                         3                                                               0                                                 °                                                                                                                           \begin{cases} I_\alpha=I_u-I_v*\cos{60^{\degree}}-I_w*\cos{60^{\degree}} \\ I_\beta=I_v*\cos{30^{\degree}}-I_w*\cos{30^{\degree}} \end{cases}                     {Iα​=Iu​−Iv​∗cos60°−Iw​∗cos60°Iβ​=Iv​∗cos30°−Iw​∗cos30°​
https://img-blog.csdnimg.cn/direct/30ad954d850e48c491d65376bf185c3e.png
park变换:
将                                             I                            α                                  ,                                 I                            β                                       I_\alpha,I_\beta                  Iα​,Iβ​轴投影到dq轴(实际上就是乘以一个旋转矩阵),从下图的多少关系可以看出,投影表达式为:
                                       {                                                                                                             I                                              d                                                          =                                                         I                                              α                                                          ∗                                           cos                                           ⁡                                           θ                                           +                                                         I                                              β                                                          ∗                                           sin                                           ⁡                                           θ                                                                                                                                                       I                                              q                                                          =                                           −                                                         I                                              α                                                          ∗                                           sin                                           ⁡                                           θ                                           +                                                         I                                              β                                                          ∗                                           cos                                           ⁡                                           θ                                                                                              \begin{cases} I_d=I_\alpha*\cos{\theta}+I_\beta*\sin{\theta} \\ I_q=-I_\alpha*\sin{\theta}+I_\beta*\cos{\theta} \end{cases}                     {Id​=Iα​∗cosθ+Iβ​∗sinθIq​=−Iα​∗sinθ+Iβ​∗cosθ​
https://img-blog.csdnimg.cn/direct/de8ded28da0345649b9c6e925070c09f.png
单独电流的FOC控制图如下图,由于电流变革比较不稳固,以是与被控参数变革速率有关的D控制在这里通常不使用,只使用PI控制。
https://i-blog.csdnimg.cn/direct/a41caa890a594f1996dd18101448cdc8.png
位置-速率-电流串级控制

假如有这样一个需求:控制位置时,规定电机归位过程中的最大速率以及最大电流;或者控制速率时,规定电机到达目的速率过程中的最大电流,那么就需要使用到位置-速率-电流串级控制。这里的串级控制并不是控制电机到达某一个电流值或者速率值,而是要求电机在控制过程中能够到达的最大电流值或者最大速率值,由于无法做到电机保持在一个位置的时候,依然有速率或者有电流。
串级控制的意思就是当前控制环的输入为上一个控制环的输出,以串级位置控制为例,控制框图为:
https://i-blog.csdnimg.cn/direct/4212986d89a44895b4add98fcc06f332.png
理论部分如今到此竣事,我们得到了SVPWM的计算方法以及位置、速率、电流的控制流程,可以进行FOC代码编写了,但是实践的时候会遇到种种问题,比如相线的次序、pwm占空比怎么落实、电流采样时候、外设的配置等,接下来的实践部分使用超常见的单片机性价比之王:smt32f103c8t6以及stm32cube工具,不使用电机库,从零开始实现完备的FOC控制。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【从零开始实现stm32无刷电机FOC】【理论】【3/6 位置、速率、电流控制】