【动手学电机驱动】TI InstaSPIN-FOC(6)Lab05a 电流环控制与控制器参数设置
TI InstaSPIN-FOC(1)电机驱动和控制测试平台
TI InstaSPIN-FOC(2)Lab01 闪灯实验
TI InstaSPIN-FOC(3)Lab03a 测量电压电流漂移量
TI InstaSPIN-FOC(4)Lab02b 电机参数辨识
TI InstaSPIN-FOC(5)Lab04 力矩控制
TI InstaSPIN-FOC(6)Lab05a 电流环控制
TI InstaSPIN-FOC(7)Lab05b 速度环控制
【动手学电机驱动】 TI InstaSPIN-FOC(6)Lab05a 电流环控制
LAUNCHXL-F28027F + BOOSTXL-DRV8301 提供了一个完整的电机驱动和控制评估平台,与 TI 公司的 InstaSPIN FOC配合使用,提供无传感器控制解决方案。
本节基于 LAUNCHXL-F28027F + BOOSTXL-DRV8301 电机驱动和控制测试平台,介绍 Lab05a 实验项目“电流环控制与控制器参数设置”。
推荐从 TI 官网下载 【InstaSPIN 实验项目用户手册】(InstaSPIN Projects and Labs User’s Guide),进行学习。
1. 项目介绍
1.1 Lab05a 项目介绍
对于 PMSM 电机,单电流环控制实际上等价于力矩控制,或者说力矩控制是通过单电流环控制来实现的。
因此,仅就单电流环控制而言,其程序实现和调试运行都与上节 TI InstaSPIN-FOC(6)Lab05a 电流环控制 完全相同。采用单电流环控制,速度环被禁用(通常速度环路作为控制外环),直接将电流参考值 i q , r e f i_{q,ref} iq,ref 发送到 Iq 电流反馈控制器。
但是,电流环控制也是其它控制策略的基础。例如速度控制,是以速度环作为外环、电流环作为内环而构成的速度-电流双闭环控制回路。在对速度-电流双闭环回路就行分析时,也要分析和整定电流环的参数。
因此,本节的重点不是电流环的实现,而是电流环控制器的参数整定和参数设置技术。
本实验探索了为 FOC 系统的电流环 PI 控制器设置比例增益(Kp)和积分增益(Ki)的方法。本文介绍了一种用于电机控制的调整 PI 电流增益的方法,通过计算得到 Kp 和 Ki 增益后,在 InstaSPIN-FOC 中编程实现控制器的参数设置。
学习目标:
- 如何计算电流环 PI 控制器的比例增益(Kp)和积分增益(Ki)。
- 如何将 Kp 和 Ki 增益编程到InstaSPIN中。
2. 电流环 PI 控制器的原理
2.1 扭矩与电流的关系
对于 PMSM,电磁转矩 T e T_e Te包括磁体转矩 T m = 3 2 P n ψ f i q T_m= \frac{3}{2} P_n \psi_f i_q Tm=23Pnψfiq、磁阻转矩 T r = 3 2 P n ( L d − L q ) i d i q T_r=\frac{3}{2} P_n (L_d - L_q)i_d i_q Tr=23Pn(Ld−Lq)idiq两个部分:
T e = 3 2 P n [ ψ f i q + ( L d − L q ) i d i q ] T_e = \frac{3}{2} P_n [\psi_f i_q +(L_d - L_q)i_d i_q] Te=23Pn[ψfiq+(Ld−Lq)idiq]
对于表贴式三相PMSM 有 Lq=Ld,磁阻转矩 T r = 0 T_r=0 Tr=0,于是简化为: T e = 3 2 P n ψ f i q T_e= \frac{3}{2} P_n \psi_f i_q Te=23Pnψfiq,扭矩与电流为线性关系。因此,单电流环控制实际上等价于力矩控制,
2.2 PI 控制器的拓扑结构
PI 控制器有两种拓扑结构,串联结构和并联结构。TI InstaSPIN-FOC 使用串联结构PI控制器。
1、并联结构
并联结构的 PI 控制器的框图如下:

并行结构的 PI 控制器在时域和频域的模型分别为:
o
u
t
p
u
t
(
t
)
=
K
p
∗
E
r
r
o
r
(
t
)
+
K
i
∫
E
r
r
o
r
(
t
)
G
(
s
)
=
o
u
t
p
u
t
(
t
)
E
r
r
o
r
(
s
)
=
K
p
+
K
i
/
s
output(t) = K_p *Error(t) + K_i \int{Error(t)}\\ G(s) = \frac{output(t)}{Error(s)} = K_p + K_i /s
output(t)=Kp∗Error(t)+Ki∫Error(t)G(s)=Error(s)output(t)=Kp+Ki/s
该系统有一个零极点,零点为
−
K
i
/
K
p
-{K_i}/{K_p}
−Ki/Kp。
Kp 的变化会影响高频增益,影响零点频率,但不会影响低频增益。 Ki 的变化会影响低频增益,影响零点频率,但不会影响高频增益。
Kp 越大,高频增益越大,零点频率越低。Ki 越大,低频频增益越大,零点频率越大。
因此,对于并行结构的 PI 控制器,调节Kp、Ki 都会影响零点频率和增益,Kp 影响高频增益, Ki 影响低频增益,两者之间相互影响。这就是并行结构 PI 控制器的缺点,在工程上调节不方便。
2、串联结构
串联结构的 PI 控制器的框图如下:

串行结构的 PI 控制器在时域和频域的模型分别为:
o
u
t
p
u
t
(
t
)
=
K
p
s
e
r
i
e
s
∗
E
r
r
o
r
(
t
)
+
K
p
s
e
r
i
e
s
∗
K
i
s
e
r
i
e
s
∗
∫
E
r
r
o
r
(
t
)
G
(
s
)
=
o
u
t
p
u
t
(
t
)
E
r
r
o
r
(
s
)
=
K
p
s
e
r
i
e
s
+
K
p
s
e
r
i
e
s
∗
K
b
s
e
r
i
e
s
/
s
output(t) = K_p^{series} *Error(t) + K_p^{series} * K_i^{series}* \int{Error(t)}\\ G(s) = \frac{output(t)}{Error(s)} = K_p^{series} + K_p^{series} *K_b^{series} /s
output(t)=Kpseries∗Error(t)+Kpseries∗Kiseries∗∫Error(t)G(s)=Error(s)output(t)=Kpseries+Kpseries∗Kbseries/s
该系统有一个零极点,零点为 − K i s e r i e s -K_i^{series} −Kiseries。
K p s e r i e s K_p^{series} Kpseries 的变化只影响系统的增益,不影响零点频率。 K i s e r i e s K_i^{series} Kiseries 的变化影响系统的零点频率,决定系统的带宽,也影响低频增益。
如上图所示,串联结构 PI 控制器中, K p s e r i e s K_p^{series} Kpseries 影响系统增益, K i s e r i e s K_i^{series} Kiseries 影响系统带宽,两者相互独立。因此, K p s e r i e s K_p^{series} Kpseries 和 K i s e r i e s K_i^{series} Kiseries 的调节可以对控制系统解耦。这也就是串联式PID控制的优点。
TI InstaSPIN-FOC 使用串联结构PI控制器。
2.3 电流环 PI 控制器的设计
在串联结构中,
K
p
s
e
r
i
e
s
K_p^{series}
Kpseries 设置所有频率的增益,
K
i
s
e
r
i
e
s
K_i^{series}
Kiseries 直接决定控制器的零点频率,单位为rad/sec。
众所周知,PI控制器的增益对系统稳定性有显著影响。但零点频率在系统性能中也起着重要的作用。
我们可以使用一些简单的规则来帮助设计电机电流回路的PI控制器:
-
通过 K i s e r i e s K_i^{series} Kiseries 设置PI控制器的零点。
当在其传递函数中仅用一个实极点(例如电机中的电流)控制设备参数时, K i s e r i e s K_i^{series} Kiseries 应设置为该极点的值。这将导致极点/零点抵消,并创建一个也只有一个真实极点的闭环响应。换句话说,响应非常稳定,没有共振峰。 -
通过 K p s e r i e s K_p^{series} Kpseries 设置闭环系统响应的带宽。
如下式所示, K p s e r i e s K_p^{series} Kpseries 越高则电流回路带宽越高。
G ( s ) = 1 L K p s e r i e s s + 1 K p s e r i e s = L ∗ B a n d w i d t h G(s) = \frac{1}{\frac{L}{K_p^{series}} s +1}\\ K_p^{series} = L * Bandwidth G(s)=KpseriesLs+11Kpseries=L∗Bandwidth
电流控制器最好由电机系统的时间常数决定。在下一步的实验(详见下篇 TI InstaSPIN-FOC(7)Lab05a 速度环控制)中,对速度控制回路进行了分析。通过结合速度环和电流环控制器设计,可以创建一个非常稳定的级联控制回路。
本实验将只考虑采样时间,看看在带宽过高之前, K p s e r i e s K_p^{series} Kpseries 的调节作用有多大。
2.4 电流环 PI 控制器的计算
1、计算 K i s e r i e s K_i^{series} Kiseries 增益。
- 记录 user.h 中的电机参数 Rs 和 Ls 值。
- 记录 user.h 中的采样频率(user_PWM_FREQ_Khz)。
- K i s e r i e s K_i^{series} Kiseries 必须进行归一化处理 (PU)
2、计算电流控制器周期:
T
i
=
1
P
W
M
_
F
r
e
q
_
k
H
z
∗
1000
∗
P
W
M
v
s
I
S
R
t
i
c
k
∗
I
S
R
v
s
C
T
R
L
t
i
c
k
∗
C
T
R
L
v
s
C
U
R
R
E
N
T
t
i
c
k
T_i = \frac{1}{PWM\_Freq\_kHz *1000} * PWMvsISRtick * ISRvsCTRLtick * CTRLvsCURRENTtick
Ti=PWM_Freq_kHz∗10001∗PWMvsISRtick∗ISRvsCTRLtick∗CTRLvsCURRENTtick
其中:
-
T i T_i Ti:电流环控制器周期。
这是指电流控制器(例如 PI 控制器)的执行周期,即每隔多少时间电机控制算法会进行一次计算。通常,该周期与 PWM 中断频率有关。 -
P W M _ F r e q _ k H z PWM\_Freq\_kHz PWM_Freq_kHz:PWM 频率,可以从 user.h 中的 USER_PWM_FREQ_Khz 参数中获取。
PWM 控制电压的输出,通过调制占空比来控制电机电流。PWM频率决定了电机驱动的更新频率以及电机的精细控制水平。 -
P W M v s I S R t i c k PWMvsISRtick PWMvsISRtick:PWM 和中断之间的时钟周期比,USER_NUM_PWM_TICKS_PER_ISR_tick 。
该参数定义了 PWM 和 ISR(中断服务例程)执行的比率。即每次 ISR 触发时,相对于 PWM 频率会有多少个 PWM 周期。例如,如果这个值是 2,则表示 ISR 每隔 2 个 PWM 周期触发一次。通过这个参数,可以调节 ISR 的频率。 -
I S R v s C T R L t i c k ISRvsCTRLtick ISRvsCTRLtick:中断和控制器状态机之间的时钟周期比,USER_NUM_ISR_TICKS_PER_CTRL_tick
定义了 ISR 和控制器状态机之间的时钟周期比率。这意味着控制器状态机不是每次 ISR 都会运行,而是每隔一定数量的 ISR 周期才会更新一次控制器状态机。 -
C T R L v s C U R R E N T t i c k CTRLvsCURRENTtick CTRLvsCURRENTtick:控制器状态机和电流控制器之间的时钟周期比,USER_NUM_CTRL_TICKS_PER_CURRENT_tick
定义了控制器状态机与电流控制器更新之间的时钟周期比率。通常电流控制环的更新频率较高,但控制器状态机的更新频率可能较低,这个参数用于确定何时更新电流控制器。
这些参数定义了系统中不同频率间的关系,帮助用户在嵌入式系统中协调PWM的频率、ISR的执行频率和控制算法的更新频率。
3、计算 K i s e r i e s ( P U ) K_i^{series}(PU) Kiseries(PU):
K i s e r i e s ( P U ) = ( R s / L s ) ∗ T i K_i^{series}(PU) = (R_s / L_s) * T_i Kiseries(PU)=(Rs/Ls)∗Ti
4、启动控制器
将 Set Flag_enableSys、Set Flag_Run_Identify 设为 TRUE
比较 K i s e r i e s K_i^{series} Kiseries 的值:
- 比较计算结果 K i s e r i e s K_i^{series} Kiseries 与从最初存储在“gMotorVars.Ki_Idq 中的 K i s e r i e s K_i^{series} Kiseries 。这两个值应该相同。
比较并调整 K p s e r i e s K_p^{series} Kpseries 的值:
- 由于
K
p
s
e
r
i
e
s
K_p^{series}
Kpseries 增益决定控制器的带宽,可以更好地优化调整。
本实验,我们将展示调整 𝐾𝑝𝑠𝑒𝑟𝑖𝑒𝑠 增益的有效范围。 - 基于ISR频率计算 K p s e r i e s K_p^{series} Kpseries 增益。
使用电流控制器频率的 1/20 带宽。注意计算控制器增益所需的带宽以弧度每秒(rps)为单位,控制器频率以赫兹(Hz)为单位,需要进行转换:
B
a
n
d
w
i
d
t
h
(
r
a
d
/
s
)
=
2
π
∗
C
u
r
r
e
n
t
C
o
n
t
r
o
l
l
e
r
F
r
e
q
(
H
z
)
∗
1
/
20
Bandwidth(rad/s) = 2\pi*CurrentControllerFreq(Hz)* 1/20
Bandwidth(rad/s)=2π∗CurrentControllerFreq(Hz)∗1/20
例如,
1
/
T
i
=
10
k
H
z
1/T_i=10kHz
1/Ti=10kHz,
L
s
=
620
μ
H
L_s=620\mu H
Ls=620μH,则:
K
p
s
e
r
i
e
s
=
0.00062
∗
2
π
∗
(
10000
/
20
)
=
1.95
K_p^{series}=0.00062*2\pi*(10000/20) = 1.95
Kpseries=0.00062∗2π∗(10000/20)=1.95
将
K
p
s
e
r
i
e
s
K_p^{series}
Kpseries 初始化为
K
p
s
e
r
i
e
s
(
P
U
)
K_p^{series}(PU)
Kpseries(PU):
K
p
s
e
r
i
e
s
(
P
U
)
=
K
p
s
e
r
i
e
s
∗
I
f
s
/
V
f
s
K_p^{series}(PU) = K_p^{series} * I_{fs} / V_{fs}
Kpseries(PU)=Kpseries∗Ifs/Vfs
I f s = U S E R I Q F U L L S C A L E C U R R E N T A I_{fs}=USER_IQ_FULL_SCALE_CURRENT_A Ifs=USERIQFULLSCALECURRENTA, V f s = U S E R I Q F U L L S C A L E C U R R E N T V V_{fs} = USER_IQ_FULL_SCALE_CURRENT_V Vfs=USERIQFULLSCALECURRENTV,都可以从 user.h 中找到。
最后,用新计算得到的 K p s e r i e s K_p^{series} Kpseries 增益,修改 gMotorVars.Kp_Idq。
K p s e r i e s K_p^{series} Kpseries 增益设置为 1/20 带宽,控制回路稳定时的电机电流波形如下图所示。

随着带宽的增大,采样延迟对控制器的相位裕度有更多的负面影响,导致控制回路变得不稳定。
增大 K p s e r i e s K_p^{series} Kpseries 增益,控制回路不稳定,开始振荡,电机电流波形如下图所示。

当电流回路不稳定时,需要减小 K p s e r i e s K_p^{series} Kpseries 增益,直到电流波形处于稳定。
3. Lab05a 项目实验内容
FOC 的核心是扭矩控制。扭矩控制经常作为控制内环,而将速度控制环路或位置控制环路作为控制外环。添加控制外环后,系统的不稳定更差。因此,在扭矩控制模式下,才能真正判断FAST 算法及其估计和角度跟踪能力。
在 Lab05a 项目中,将 InstaSPIN FOC 置于用户外部速度控制模式,直接给定 Iq 的参考值来启用扭矩控制。通过计算得到 PI 控制器的 Kp 和 Ki 增益,在 InstaSPIN-FOC 中设置和使用该 Kp 和 Ki 增益。
3.1 硬件连接与设置
本项目使用 LAUNCHXL-F28027F + BOOSTXL-DRV8301 电机驱动和控制测试平台,相关的软件安装和配置,详见上节【动手学电机驱动】 TI InstaSPIN-FOC(1)电机驱动和控制测试平台。
硬件连接与设置的步骤如下:
- 对于 F28027F 控制板,拆除 JP1、JP2 跳线帽,由驱动板提供 3.3V 电源。
- 对于 F28027F 控制板,将开关 S1 设置为 ON-ON-ON(向上),UART 开关 S4 设置为 OFF(向下)。
- 如下图所示,将 DRV8301 驱动板 插入 F28027F 控制板。注意:接线端子插头应朝向USB连接器。
- 将三相 PMSM 电机连接到 DRV8301 驱动板的 3-pin 接线端子 J11。电机连接标记为 A、B、C,但可以以任何顺序连接。
- 将直流电源连接到 DRV8301 驱动板的 2-pin 接线端子 J2,注意电源正负极不要接反(正极接 PVDD,负极接 GND)。推荐使用 24V/10A 直流稳压电源。
- 打开连接到 DRV8301 驱动板的直流稳压电源。
3.2 加载用户数据文件
1、打开 IDE 软件 CCStudio,从 MotorWare 导入例程项目,在 CCS 侧边栏 “Project Explorer” 选择本项目 “proj_lab05a”。
C:\ti\motorware\motorware_1_01_00_18\sw\solutions\instaspin_foc\boards\boostxldrv8301_revB\f28x\f2802xF\projects
如果使用其它型号的 MCU 和驱动板,则参考以上路径规则,选择相应的项目路径。
2、鼠标选中本项目 “proj_lab05a”,右键选择 “Properties” 打开属性窗口,添加包含文件 user.h:
Build – C2000 Compiler – Include Options – Add dir to #include search path (–include_path, -I)
添加 user.h 文件的路径:
C:\ti\motorware\motorware_1_01_00_18\sw\modules\hal\boards\boostxldrv8301_revB\f28x\f2802xF\src
注意:如果没有正确导入 user.h,构建项目或编译时将会报错。

3、检查用户数据文件 user.h。
在 CCS “Project Explorer” 选择本项目 “proj_lab02b” 激活(Active)后,打开 user.c 文件,在文件开头找到声明的包含文件 user.h(以高亮显示)。鼠标移动到高亮的包含文件上,按 F3 就自动打开用户数据文件 user.h。
(1)找到定义电机类型的段落,检查 “USER_MOTOR” 定义为 “My_Motor”。
(2)找到定义电机参数的段落 “#elif (USER_MOTOR == My_Motor)”,检查电机极对数、电机参数的值已修改为电机规格书的参数,或通过参数辨识得到的数值。
(3)定义驱动板电压电流偏移量的的段落,检查已修改为测量的偏移值。
4、配置仿真器。
从 “Project Explorer-proj_lab05a” 下找到 “TMS320F28027_xds100v2.ccxml” 并打开目标配置编辑器窗口,可以创建和修改目标配置文件。
TMS320F28027_xds100v2.ccxml 默认的仿真器(调试探针)的类型为:“XDS 100v2 USB Debug Probe”,目标板或器件(Board or Device)的类型为:“Experimenter’s Kit - Piccolo F28027”,都不需要改变。如果使用其它型号的仿真器或目标板,则在该页面修改相应的设置。
3.3 项目构建与加载
5、项目构建(“Build”)。
在 CCS “Project Explorer” 选择本项目 “proj_lab03” 激活(Active)后,通过菜单栏 Project – Build Project 构建(“Build”)项目。也可以点击工具栏上的锤子图标 “Build” 进行构建。
在 CCS 的控制台(Console)窗口栏,将显示构建过程,并最终显示 ”**** Build Finished ****“,说明构建项目成功。

6、项目调试(“Debug”),将程序烧录到 MCU。
注意:在本步骤之前,要USB 连接控制板套件,并给控制板套件通电,否则找不到目标板而加载失败。 相关步骤可以参见上节 “2.1 硬件连接与设置”。
通过菜单栏 Run-- Debug 开始调试(“Debug”)项目。也可以点击工具栏上的昆虫图标 “Debug” 开始调试。
“Debug” 过程中,弹出窗口显示调试进程,并将并将.out文件加载到目标(将程序烧录到 MCU)。 弹出窗口最后显示 "Finished“,说明调试完成和加载成功。
进入调试状态后,CCS透视图将自动变为 “CCS调试”视图布局。
7、加载脚本文件。
通过调用脚本 “proj_lab05a.js”,添加适当的监视窗口变量。
loadJSFile “C:\ti\motorware\motorware_1_01_00_18\sw\solutions\instaspin_foc\src\proj_lab05a.js”
8、启用实时调试器。
点击工具栏上的实时模式图标(Enable silicon realtime mode),进入实时模式(Realtime mode)。该图标看起来像一个时钟。
9、执行目标程序。
点击工具栏上的 执行(Resume)图标,开始执行目标程序。该图标看起来像一个绿色按键。也可以通过菜单栏 Run-- Resume,或快捷键 F8,开始执行目标程序。
10、启用连续刷新。
点击工具栏上的 连续刷新(Resume)图标,在监视窗口上启用连续刷新。

3.4 项目运行与调试
11、启动电机。
在监视窗口中,检查 gMotorVars.UserErrorCode 的值:如果有错误则该变量值将显示具体的错误内容以供排查,如果没有错误则该变量值为 USER_ErrorCode_NoError,可以继续运行。
在监视窗口中,先将 “Flag_enableSys” 设为 1(True)驱动控制 使能,然后将 “Flag_Run_Identify” 设为 1(True)电机运行 使能。
12、手动改变设定值 IqRef。
(1)此时 IqRef 值为 0(默认值),电机并没有开始旋转,但电机轴缓慢振荡。
观察窗口内容如下:
- Flag_enableSys = 1,驱动控制 使能;
- Flag_Run_Identify = 1,电机运行 使能;
- Flag_EnableUserParams = 1,控制器从 user.h 读取电机参数;
- Flag_EnableForceAngle = 1,控制器执行 “强制角度” 的强制启动程序;
- CtrlState = CTRL_State_Online,CTRL_run 状态机处于 Online 状态;
- IqRef_A = 0.0,默认的电流参考值 IqRef_A 为 0;
- Speed_krpm = 0.0,测量的电机转速为 0;
- Troque_Nm = 0.0,测量的电机转矩为 0;
这是由于执行 “强制角度” 的强制启动程序。由于零速度启动时的观测器的反馈不稳定,转子角度和转速信号的估计值精度较差,因此电机很难甚至无法从零速启动。因此设置了 “强制角度” 的强制启动程序。
当电机在 1Hz 以上旋转时,则强制角度关闭,才执行真正的闭环控制。
(2)在监视窗口中,将 “IqRef_A” 的值修改为 0.1,电机轴缓慢振荡,但电机仍没有开始旋转。
(3)将 “IqRef_A” 的值修改为 0.2,电机开始旋转。
修改 Iq 参考值IqRef_A,则控制器调节电机转矩、转速变化,如下图所示。

13、手动改变 PI 控制器参数。
由于 K p s e r i e s K_p^{series} Kpseries 增益决定控制器的带宽,可以更好地优化调整。本实验,我们将展示调整增益 K p s e r i e s K_p^{series} Kpseries 的有效范围。
(1)监视窗口中 “gMotorVars.Kp_Idq” 的默认值为 3.9,
(2)在监视窗口中,将“gMotorVars.Kp_Idq” 的值修改为 1.0,将 Iq 参考值 “IqRef_A” 在 0.1 / 0.2 之间切换,电机转速变化曲线如下图所示。
特别注意:由于当前使用电流环控制,而不是速度环控制,因此速度曲线只供参考,不能由此评价电流环控制的质量。
Kp =1

(3)在监视窗口中,将“gMotorVars.Kp_Idq” 的值修改为 3.9(默认值),将 Iq 参考值 “IqRef_A” 在 0.1 / 0.2 之间切换,电机转速变化曲线如下图所示。
Kp =4

(3)在监视窗口中,将“gMotorVars.Kp_Idq” 的值修改为 10.0,将 Iq 参考值 “IqRef_A” 在 0.1 / 0.2 之间切换,电机转速变化曲线如下图所示。
Kp =10

(4)在监视窗口中,将“gMotorVars.Kp_Idq” 的值修改为 15.0,将 Iq 参考值 “IqRef_A” 在 0.1 / 0.2 之间切换,电机转速变化曲线如下图所示。
此时,电机开始发出更高的音调噪声。当 Iq参考值为 0.2 时,电机的转速显著降低;当 Iq参考值为 0.1 时,电机停止旋转。
Kp =15

图中最后一段转速上升,是将Iq 参考值 “IqRef_A” 调增到 0.5。
(5)在监视窗口中,重置𝐾𝑝𝑠𝑒𝑟𝑖𝑒𝑠 回到默认值3.9。
14、结束运行。
将变量 “Flag_Run_Identify” 设为 0(False),禁止电机运行。将 “Flag_enableSys” 设为 0(False),禁用驱动控制。
点击工具栏上的 断开(Terminate)图标,断开与所有硬件的连接并终止调试状态。该图标看起来像一个红色方块。也可以通过菜单栏 Run-- Terminate,断开连接并终止调试状态。
15、关闭电源,拆除 USB 连接。
关闭为 DRV8301 驱动板供电的 DC 24V 电源。
拆下连接 计算机(运行 CCS 的计算机) 与 F28027F 控制板的 USB 线缆 。
4. Lab05a 程序解读
4.1 程序框图
主程序(Main Run-Time loop)
本项目的主程序框图如下图所示。
在电机识别过程中,甚至在使用 user.h 的电机参数时,基于电机 R/L 计算 K i s e r i e s K_i^{series} Kiseries 增益,设置较小的 带宽或 K p s e r i e s K_p^{series} Kpseries ,以免导致电流控制回路中的不稳定。
在电机识别完成后,在函数calcPGains() 中计算电流控制器的增益
K
p
s
e
r
i
e
s
K_p^{series}
Kpseries 和
K
i
s
e
r
i
e
s
K_i^{series}
Kiseries 。
调用 calcPGains() 后,用新计算的
K
p
s
e
r
i
e
s
K_p^{series}
Kpseries 和
K
i
s
e
r
i
e
s
K_i^{series}
Kiseries 的值对全局变量 gMotorVars.Kp_Idq 和 gMotorVars.Ki_Idq 进行初始化。
下图显示了实现电流控制器增益初始化所需的逻辑流程图。

4.2 包含文件、变量和函数声明
本项目没有新的包含文件和定义新的全局变量。
Main run-time loop 新的 API 函数如下:

- CTRL_getKp,从 CTRL 结构体获取 Kp 增益值;
- CTRL_getKi,从 CTRL 结构体获取 Ki 增益值;
- CTRL_setKp,向 CTRL 结构体设置 Kp 增益值;
- CTRL_setKi,向 CTRL 结构体设置 Ki 增益值。
4.3 例程分析
4.3.1 电流环 PI 控制器参数的初始化
在程序 Proj_lab05a.c 的主函数 main() 中的轮循逻辑(forever loop)中,对电流环 PI 控制器参数进行初始化:通过 CTRL_getKp()、CTRL_getKi() 函数获取 K p K_p Kp、 K i K_i Ki 的值,并赋值 gMotorVars.Kp_Idq、gMotorVars.Ki_Idq。

void main(void)
{
...
for(;;)
{
// loop while the enable system flag is true
while(gMotorVars.Flag_enableSys)
{
...
if(EST_isMotorIdentified(obj->estHandle))
{
...
if(Flag_Latch_softwareUpdate)
{
...
// initialize the watch window kp and ki current values with pre-calculated values
gMotorVars.Kp_Idq = CTRL_getKp(ctrlHandle,CTRL_Type_PID_Id);
gMotorVars.Ki_Idq = CTRL_getKi(ctrlHandle,CTRL_Type_PID_Id);
}
}
}
4.3.2 电流环 PI 控制器参数的实时更新
在程序 Proj_lab05a.c 的主函数 main() 中,可以对电流环 PI 控制器参数进行更新:通过控制器参数更新函数 updateKpKiGains(),读取监视窗口中 K p K_p Kp、 K i K_i Ki 的当前值,实时地更新电流环 PI 控制器的比例增益 K p K_p Kp 和积分增益 K i K_i Ki 的值。
void main(void)
{
...
// update Kp and Ki gains
updateKpKiGains(ctrlHandle);
}
void updateKpKiGains(CTRL_Handle handle)
{
if((gMotorVars.CtrlState == CTRL_State_OnLine) && (gMotorVars.Flag_MotorIdentified == true) && (Flag_Latch_softwareUpdate == false))
{
// set the kp and ki current values for Id and Iq from the watch window
CTRL_setKp(handle,CTRL_Type_PID_Id,gMotorVars.Kp_Idq);
CTRL_setKi(handle,CTRL_Type_PID_Id,gMotorVars.Ki_Idq);
CTRL_setKp(handle,CTRL_Type_PID_Iq,gMotorVars.Kp_Idq);
CTRL_setKi(handle,CTRL_Type_PID_Iq,gMotorVars.Ki_Idq);
}
return;
} // end of updateKpKiGains() function
CTRL_setKp() 等函数在 ctrl.h 文件中,例程内容如下:
//! \brief Sets the proportional gain (Kp) value for the specified controller
//! \param[in] handle The controller (CTRL) handle
//! \param[in] ctrlType The controller type
//! \param[in] Kp The Kp value
inline void CTRL_setKp(CTRL_Handle handle,const CTRL_Type_e ctrlType,const _iq Kp)
{
CTRL_Obj *obj = (CTRL_Obj *)handle;
if(ctrlType == CTRL_Type_PID_spd)
{
obj->Kp_spd = Kp;
}
else if(ctrlType == CTRL_Type_PID_Id)
{
obj->Kp_Id = Kp;
}
else if(ctrlType == CTRL_Type_PID_Iq)
{
obj->Kp_Iq = Kp;
}
return;
} // end of CTRL_setKp() function
5. Lab05a 项目总结
PI 控制器参数 K p s e r i e s K_p^{series} Kpseries 和 K i s e r i e s K_i^{series} Kiseries 用于调节电流控制器的增益。
K
i
s
e
r
i
e
s
K_i^{series}
Kiseries 可以产生一个零点,抵消电机定子的磁极,可以很容易地计算出来。
K
p
s
e
r
i
e
s
K_p^{series}
Kpseries 调节电流控制器的带宽。当需要速度控制系统来实现一定的阻尼时,
K
p
s
e
r
i
e
s
K_p^{series}
Kpseries 电流控制器的增益将与速度控制系统的时间常数有关。
参考资料:
- Motor Drive BoosterPack Quick Start Guide: BOOSTXL-DRV8301, Texas Instruments/ti.com, 2013
- InstaSPIN Projects and Labs User’s Guide, InstaSPIN-FOC & InstaSPIN-MOTION for F2802xF, F2805xF, F2805xM, F2806xF, F2806xM, Ver 1.0.14, Texas Instruments/ti.com, 2014
版权声明:
【动手学电机驱动】是 youcans@qq 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/143033361)
Copyright@youcans 2024
Crated:2024-10
更多推荐
所有评论(0)