【动手学电机驱动】 TI InstaSPIN-FOC(4)Lab02b 电机参数辨识

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 电机驱动和控制测试平台,介绍 Lab02b 实验项目“电机参数辨识”,估计电机参数 电阻Rs、电感Ls 和磁链 flux。

推荐从 TI 官网下载 【InstaSPIN 实验项目用户手册】(InstaSPIN Projects and Labs User’s Guide),进行学习。


1. 项目介绍

1.1 Lab02 项目介绍

默认情况下,当 InstaSPIN 启动时,对电压电流的偏移量进行自动校准,并识别没有连接过的电机,估计电机参数 电阻Rs、电感Ls 和磁链 flux。

估计电机参数非常重要,但需要很长时间才能完成。对于同一个电机,电机参数只需要测量一次。因此对电机参数进行辨识后,可以将其写入用户数据文件 user.h 中。以后使用该电机时,就可以读取用户数据文件 user.h 来获取电机参数,跳过电机参数辨识步骤,以减少电机的启动时间。

  • Lab02a 项目:学习在 ROM 外使用 InstaSPIN。
    InstaSPIN 实现了一个启用 FAST 的自感应磁场定向变速控制器。ROM 库包含 FAST 角度观测器以及实现 FOC 控制器所需的所有代码。本实验使用基于 ROM 的完整代码来创建 FOC 电机控制。

  • Lab02b 项目:学习在用户 RAM 中使用 InstaSPIN
    InstaSPIN 不必完全在 ROM 外执行。TI 提供的大多数 InstaSPIN 代码都是开源的,只有 FAST角度观测器代码是闭源的。本实验将展示在用户 RAM 中以开源方式运行无传感器 FOC 控制。对 ROM 的唯一函数调用是更新和从 FAST 观测器中提取信息。

  • Lab02c 项目:学习使用 InstaSPIN 辨识低电感永磁同步电机
    低电感永磁同步电动机的参数辨识比较困难,本实验特别适用于低电感的 PMSM 的参数辨识。

  • Lab02d 项目:学习在用户 RAM 中使用 InstaSPIN(启用 fpu32)
    本实验与 Lab02b 相同,但启用了 fpu32。本实验仅适用于 F2806xF系列 MCU。


2. Lab02b 项目实验内容

默认情况下,当 InstaSPIN 启动时,如果之前没有识别过连接到逆变器的电机,它会首先识别该电机,估计电机参数 Rs、Ls 和气隙通量 flux。

在 Lab02b 项目中,我们的目的是识别电机,估计电机参数 Rs、Ls 和气隙通量 flux,并将其写入 user.h 文件中。


2.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 驱动板的直流稳压电源。

2.2 修改用户数据文件 user.h

1、打开 IDE 软件 CCStudio,从 MotorWare 导入例程项目,在 CCS 侧边栏 “Project Explorer” 选择本项目 “proj_lab02b”。

C:\ti\motorware\motorware_1_01_00_18\sw\solutions\instaspin_foc\boards\boostxldrv8301_revB\f28x\f2802xF\projects

如果使用其它型号的 MCU 和驱动板,则参考以上路径规则,选择相应的项目路径。

2、鼠标选中本项目 “proj_lab02b”,右键选择 “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”,内容如下:

//! \brief Uncomment the motor which should be included at compile
//! \brief These motor ID settings and motor parameters are then available to be used by the control system
//! \brief Once your ideal settings and parameters are identified update the motor section here so it is available in the binary code
#define USER_MOTOR My_Motor

(2)找到定义电机参数的段落 “#elif (USER_MOTOR == My_Motor)”,根据使用的电机极对数修改参数 “USER_MOTOR_NUM_POLE_PAIRS” 的值,并将需要估计的电机参数的值修改为 “NULL”,内容如下:

#elif (USER_MOTOR == My_Motor)
#define USER_MOTOR_TYPE                 MOTOR_Type_Pm
#define USER_MOTOR_NUM_POLE_PAIRS       (1)
#define USER_MOTOR_Rr                   (NULL)
#define USER_MOTOR_Rs                   (NULL)
#define USER_MOTOR_Ls_d                 (NULL)
#define USER_MOTOR_Ls_q                 (NULL)
#define USER_MOTOR_RATED_FLUX           (NULL)
#define USER_MOTOR_MAGNETIZING_CURRENT  (NULL)
#define USER_MOTOR_RES_EST_CURRENT      (0.2)
#define USER_MOTOR_IND_EST_CURRENT      (-0.2)
#define USER_MOTOR_MAX_CURRENT          (0.2)
#define USER_MOTOR_FLUX_EST_FREQ_Hz     (20.0)

(3)定义驱动板电压电流偏移量的的段落,在上节TI InstaSPIN-FOC(3)Lab03a 测量电压电流漂移量 已测量并修改到 user.h 中。

//! \brief ADC current offsets for A, B, and C phases
//! \brief One-time hardware dependent, though the calibration can be done at run-time as well
//! \brief After initial board calibration these values should be updated for your specific hardware so they are available after compile in the binary to be loaded to the controller
#define   I_A_offset    (0.8387260437)
#define   I_B_offset    (0.8367524147)
#define   I_C_offset    (0.8327225447)

//! \brief ADC voltage offsets for A, B, and C phases
//! \brief One-time hardware dependent, though the calibration can be done at run-time as well
//! \brief After initial board calibration these values should be updated for your specific hardware so they are available after compile in the binary to be loaded to the controller
#define   V_A_offset    (0.498126924)
#define   V_B_offset    (0.4988828897)
#define   V_C_offset    (0.4985800385)

(4)其它定义电机运行条件的段落,根据电机修改,例如:

//! \brief Defines the full scale frequency for IQ variable, Hz
//! \brief All frequencies are converted into (pu) based on the ratio to this value
//! \brief this value MUST be larger than the maximum speed that you are expecting from the motor 
#define USER_IQ_FULL_SCALE_FREQ_Hz        (1000.0)   // 800 Example with buffer for 8-pole 6 KRPM motor to be run to 10 KRPM with field weakening; Hz =(RPM * Poles) / 120

#define USER_IQ_FULL_SCALE_VOLTAGE_V      (24.0)   // 24.0 Example for boostxldrv8301_revB typical usage and the Anaheim motor

保存修改的用户数据文件 user.h。


2.3 项目构建与加载

4、项目构建(“Build”)。

在 CCS “Project Explorer” 选择本项目 “proj_lab02b” 激活(Active)后,通过菜单栏 Project – Build Project 构建(“Build”)项目。也可以点击工具栏上的锤子图标 “Build” 进行构建。

在 CCS 的控制台(Console)窗口栏,将显示构建过程,并最终显示 ”**** Build Finished ****“,说明构建项目成功。

在这里插入图片描述

5、项目调试(“Debug”),将程序烧录到 MCU。

注意:在本步骤之前,要USB 连接控制板套件,并给控制板套件通电,否则找不到目标板而加载失败。 相关步骤可以参见上节 “2.1 硬件连接与设置”。

通过菜单栏 Run-- Debug 开始调试(“Debug”)项目。也可以点击工具栏上的昆虫图标 “Debug” 开始调试。

“Debug” 过程中,弹出窗口显示调试进程,并将并将.out文件加载到目标(将程序烧录到 MCU)。 弹出窗口最后显示 "Finished“,说明调试完成和加载成功。

进入调试状态后,CCS透视图将自动变为 “CCS调试”视图布局,如下图所示。

在这里插入图片描述

6、加载脚本文件。

通过调用脚本 “proj_lab02b.js”,添加适当的监视窗口变量。

loadJSFile “C:\ti\motorware\motorware_1_01_00_18\sw\solutions\instaspin_foc\src\proj_lab02b.js”

7、启用实时调试器。

点击工具栏上的实时模式图标(Enable silicon realtime mode),进入实时模式(Realtime mode)。该图标看起来像一个时钟。

8、执行目标程序。

点击工具栏上的 执行(Resume)图标,开始执行目标程序。该图标看起来像一个绿色按键。也可以通过菜单栏 Run-- Resume,或快捷键 F8,开始执行目标程序。

9、启用连续刷新。

点击工具栏上的 连续刷新(Resume)图标,在监视窗口上启用连续刷新。


2.4 项目运行与调试

在开始运行调试之前,我们先介绍这个实验要做什么以及要观察的变量。
我们将 “Flag_enableSys” 和 “Flag_Run_Identify” 设置为 真(True),程序将识别电机,估计电机参数:电阻 Rs、电感 Ls 和磁链 flux。


10、启动电机参数辨识。

在监视窗口中,将 “Flag_enableSys” 设为 1(True),然后将“Flag_Run_Identify” 设为 1(True)。

观察窗口将如下图所示。

程序立即执行电机参数辨识。

我们从观察窗口可以看到,首先电阻 gMotorVars.Rs_Ohm 的值发生变化并逐渐稳定,然后电感 gMotorVars.Lsd_H 和 gMotorVars.Lsq_H 的值发生变化并逐渐稳定,然后磁链 gMotorVars.Flux_VpHz 的值发生变化并逐渐稳定。

最后,Flag_Run_Identify 的值自动复位为 0(False),表明电机参数辨识完成。此时的观察窗口如下图所示。

在这里插入图片描述


11、更新用户数据文件 user.h。

将测量的电机参数电阻 Rs、电感 Ls 和磁链 flux的值从监视窗口复制并粘贴到 user.h 文件中相应的参数定义语句 #define 中,如下所示。

从监视窗口复制的数据为:

gMotorVars.Rs_Ohm	float	0.0257475302	0x00000070@Data	
gMotorVars.Lsd_H	float	2.357015e-05	0x00000074@Data	
gMotorVars.Lsq_H	float	2.357015e-05	0x00000076@Data	
gMotorVars.Flux_VpHz	float	0.0132514471	0x00000078@Data	

由此修改用户数据文件 user.h 中 “My_Motor” 的电机参数为:

#elif (USER_MOTOR == My_Motor)
#define USER_MOTOR_TYPE                 MOTOR_Type_Pm
#define USER_MOTOR_NUM_POLE_PAIRS       (1)
#define USER_MOTOR_Rr                   (NULL)
#define USER_MOTOR_Rs                   (0.0257475302)
#define USER_MOTOR_Ls_d                 (2.357015e-05)
#define USER_MOTOR_Ls_q                 (2.357015e-05)
#define USER_MOTOR_RATED_FLUX           (0.0132514471)
#define USER_MOTOR_MAGNETIZING_CURRENT  (NULL)
#define USER_MOTOR_RES_EST_CURRENT      (1.0)
#define USER_MOTOR_IND_EST_CURRENT      (-1.0)
#define USER_MOTOR_MAX_CURRENT          (3.0)
#define USER_MOTOR_FLUX_EST_FREQ_Hz     (20.0)

在这里插入图片描述


12、结束运行。

将变量 “Flag_Run_Identify” 设为 0(False),禁止电机运行。将 “Flag_enableSys” 设为 0(False),禁用驱动控制。

点击工具栏上的 断开(Terminate)图标,断开与所有硬件的连接并终止调试状态。该图标看起来像一个红色方块。也可以通过菜单栏 Run-- Terminate,断开连接并终止调试状态。

13、关闭电源,拆除 USB 连接。

关闭为 DRV8301 驱动板供电的 DC 24V 电源。
拆下连接 计算机(运行 CCS 的计算机) 与 F28027F 控制板的 USB 线缆 。


2.5 试验验证

我们通过 Lab02b 实验已经测量电机参数电阻 Rs、电感 Ls 和磁链 flux的值,并修改了用户数据文件 user.h。

现在我们使用该用户数据文件 user.h 中的电机参数,用 Lab05b 实验对电机进行速度环控制,可以控制电机在设定的速度运行。修改速度环的设定值,可以调节电机的旋转速度。

运行结果如下图所示,说明电机的速度可以控制在不同的速度设定值,速度变化迅速平稳,满足电机速度控制的基本要求。关于电机速度环控制的具体步骤,我们在下节中详细介绍。
在这里插入图片描述


3. Lab02b 程序解读

3.1 程序框图

Lab02a 项目的后台循环允许用户与 FAST 观察器和 FOC 软件进行交互。

main() 函数的轮循逻辑(forever loop)如下图所示。

在这里插入图片描述

InstaSPIN FOC 的最小ROM实现的框图如下。InstaSPIN MOTION 可以使用相同的实现。Lab02b 项目中包含的新文件是“ctrl.c”。ctrl.c文件包含与2802xF、2805xF/M和2806xF/M的ROM中相同的控制代码。

在这里插入图片描述


3.2 包含文件、变量和函数声明

对 InstaSPIN 设置至关重要的新包含文件的描述。

请注意,由于所有Lab实验中都用到 main.h ,因此其中有些包含的内容在本实验中并没有用到。

在这里插入图片描述
下表中列出的全局对象和声明是电机控制器必须的对象。
在这里插入图片描述
下表中列出的是设置 MCU 和FOC软件所需的函数。
在这里插入图片描述
后台循环使用用户与 FAST 观察器和 FOC 软件交互的函数,使用的重要函数如下表所示。
在这里插入图片描述
下表显示了本实验室调试运行中监视窗口中使用的API函数。
在这里插入图片描述

对于 Lab02b 项目,由于InstaSPIN FOC代码的大部分已从ROM转移到用户内存,因此与 Lab02a 相比,必须向项目中添加更多文件。下表列出了项目中的新文件。请注意,许多函数都位于与C文件关联的头文件中,例如:clark.h、ipark.h、park.h、svgen.h和traj.h。

在这里插入图片描述

部分函数说明如下:

  • HAL_init():初始化微控制器外设的所有句柄。返回 HAL 对象的句柄。

  • USER_setParams():将文件user.h中的所有比例因子复制到 USER_Params 定义的结构中。

  • HAL_setParams():设置微控制器外设。创建 ADC 电压和电流转换的所有比例因子。设置电压和电流测量的初始偏移值。

  • HAL_initIntVectorTable():将 ISR 指向函数 mainISR。

  • HAL_enableAdcInts():启用 PIE 和 CPU 中的 ADC 中断。允许从 ADC 外设发送中断。

  • HAL_enableGlobalInts():启用全局中断。

  • HAL_disablePwm():将逆变器电源开关设置为高阻抗。

  • HAL_getBias():返回逆变器电流和电压电路中的电流和电压偏移值。

  • HAL_setBias():手动设置逆变器电流和电压电路中的电流和电压偏移值。

  • CTRL_initCtrl():函数的参数为true时,控制器从user.h读取电机参数,而不执行电机调试。

  • CTRL_setParams():返回驱动板的电流和电压偏移值。

  • CTRL_run():实现了面向字段的控制。CTRL_run有三个部分:CTRL_runOffline、CTRL_runOnline和CTRL_runOnlineUser。

  • CTRL_setup():负责更新CTRL状态机,并且必须以与CTRL_run()相同的时序调用。

  • CTRL_setFlag_enableOffset():函数的参数为false时,控制器绕过偏移校准。

  • CTRL_setFlag_enableUserMotorParams():函数的参数为true时,控制器从user.h读取电机参数,而不执行电机调试。


3.3 状态机

CTRL_run 的状态机如下图所示。

CTRL_run 有三种状态:空闲、离线和在线。空闲状态通常发生在控制器关闭时。在偏移校准和电机参数识别期间,CTRL处于脱机状态。在线状态发生在控制和电机运行且所有识别完成时。

在这里插入图片描述

代码最重要的部分发生在Online状态期间,其中函数 CTRL_run 从mainISR() 调用。如下所示,CTRL 和 HAL 句柄以及 ADC 和 PWM 数据被传递给 CTRL_run() 函数。


interrupt void mainISR(void)
{
    
    
  // toggle status LED
  if(++gLEDcnt >= (uint_least32_t)(USER_ISR_FREQ_Hz / LED_BLINK_FREQ_Hz))
  {
    
    
    HAL_toggleLed(halHandle,(GPIO_Number_e)HAL_Gpio_LED2);
    gLEDcnt = 0;
  }


  // acknowledge the ADC interrupt
  HAL_acqAdcInt(halHandle,ADC_IntNumber_1);


  // convert the ADC data
  HAL_readAdcData(halHandle,&gAdcData);


  // run the controller
  CTRL_run(ctrlHandle,halHandle,&gAdcData,&gPwmData);


  // write the PWM compare values
  HAL_writePwmData(halHandle,&gPwmData);


  // setup the controller
  CTRL_setup(ctrlHandle);


  return;
} // end of mainISR() function

CTRLrun 的所有代码都可以在文件 CTRL.c 中找到。
下面的 if-then 语句显示,当识别电机时,CTRL_runOnLine 是从 ROM 执行的。识别电机后,CTRL_run OnLine_User 从用户 RAM 运行。CTRL_runOnLine_User 是一个位于 CTRL.h 中的内联函数,它包含整个FOC实现,并调用FAST观测器获取转子磁通角值。


      // run the appropriate controller
      if(ctrlState == CTRL_State_OnLine)
        {
    
    
    	  CTRL_Obj *obj = (CTRL_Obj *)handle;

          // increment the current count
          CTRL_incrCounter_current(handle);

          // increment the speed count
          CTRL_incrCounter_speed(handle);

          if(EST_getState(obj->estHandle) >= EST_State_MotorIdentified)
            {
    
    
              // run the online controller
              CTRL_runOnLine_User(handle,pAdcData,pPwmData);
            }
          else
            {
    
    
              // run the online controller
              CTRL_runOnLine(handle,pAdcData,pPwmData);
            }
        }
      else if(ctrlState == CTRL_State_OffLine)
        {
    
    
          // run the offline controller
          CTRL_runOffLine(handle,halHandle,pAdcData,pPwmData);
        }
      else if(ctrlState == CTRL_State_Idle)
        {
    
    
          // set all pwm outputs to zero
          pPwmData->Tabc.value[0] = _IQ(0.0);
          pPwmData->Tabc.value[1] = _IQ(0.0);
          pPwmData->Tabc.value[2] = _IQ(0.0);
        }
    }
  else
    {
    
    
      // increment the isr count
      CTRL_incrCounter_isr(handle);
    }

  return;
} // end of CTRL_run() function

打开文件 ctrl.h 并在CCS中选择大纲视图(视图->大纲)后,可以选择ctrl_runOnLine_User来查看源代码窗口中的代码。

在这里插入图片描述


4. Lab02b 项目总结

本实验展示了如何测量电流和电压偏量、读取并复制到 用户数据文件 user.h 中,以便在今后的实验中直接从用户数据文件加载电机参数,跳过电机校准和识别过程。


猜你喜欢

转载自blog.csdn.net/youcans/article/details/142885213
TI