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 速度环控制


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(LdLq)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+(LdLq)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)=KpError(t)+KiError(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)=KpseriesError(t)+KpseriesKiseriesError(t)G(s)=Error(s)output(t)=Kpseries+KpseriesKbseries/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=LBandwidth

电流控制器最好由电机系统的时间常数决定。在下一步的实验(详见下篇 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_kHz10001PWMvsISRtickISRvsCTRLtickCTRLvsCURRENTtick

其中:

  • 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.000622π(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)=KpseriesIfs/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)电机驱动和控制测试平台

硬件连接与设置的步骤如下:

  1. 对于 F28027F 控制板,拆除 JP1、JP2 跳线帽,由驱动板提供 3.3V 电源。
  2. 对于 F28027F 控制板,将开关 S1 设置为 ON-ON-ON(向上),UART 开关 S4 设置为 OFF(向下)。
  3. 如下图所示,将 DRV8301 驱动板 插入 F28027F 控制板。注意:接线端子插头应朝向USB连接器。
  4. 将三相 PMSM 电机连接到 DRV8301 驱动板的 3-pin 接线端子 J11。电机连接标记为 A、B、C,但可以以任何顺序连接。
  5. 将直流电源连接到 DRV8301 驱动板的 2-pin 接线端子 J2,注意电源正负极不要接反(正极接 PVDD,负极接 GND)。推荐使用 24V/10A 直流稳压电源。
  6. 打开连接到 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 电流控制器的增益将与速度控制系统的时间常数有关。


参考资料:

  1. Motor Drive BoosterPack Quick Start Guide: BOOSTXL-DRV8301, Texas Instruments/ti.com, 2013
  2. 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

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐