ZHCUBZ5A September   2021  – April 2024

 

  1.   1
  2.   摘要
  3.   商标
  4. 1引言
  5. 2电机控制理论
    1. 2.1 PMSM 的数学模型和 FOC 结构
    2. 2.2 PM 同步电机的磁场定向控制
    3. 2.3 PM 同步电机的无传感器控制
      1. 2.3.1 具有锁相环的增强型滑模观测器
        1. 2.3.1.1 PMSM 的 ESMO 设计
        2. 2.3.1.2 使用 PLL 的转子位置和转速估算
    4. 2.4 电机驱动器的硬件必要条件
      1. 2.4.1 电机相电压反馈
    5. 2.5 额外的控制特性
      1. 2.5.1 弱磁 (FW) 和每安培最大扭矩 (MTPA) 控制
      2. 2.5.2 快速启动
  6. 3在 TI 硬件套件上运行通用实验
    1. 3.1 受支持的 TI 电机评估套件
    2. 3.2 硬件电路板设置
      1. 3.2.1  LAUNCHXL-F280025C 设置
      2. 3.2.2  LAUNCHXL-F280039C 设置
      3. 3.2.3  LAUNCHXL-F2800137 设置
      4. 3.2.4  TMDSCNCD280025C 设置
      5. 3.2.5  TMDSCNCD280039C 设置
      6. 3.2.6  TMDSCNCD2800137 设置
      7. 3.2.7  TMDSADAP180TO100 设置
      8. 3.2.8  DRV8329AEVM 设置
      9. 3.2.9  BOOSTXL-DRV8323RH 设置
      10. 3.2.10 BOOSTXL-DRV8323RS 设置
      11. 3.2.11 DRV8353RS-EVM 设置
      12. 3.2.12 BOOSTXL-3PHGANINV 设置
      13. 3.2.13 DRV8316REVM 设置
      14. 3.2.14 TMDSHVMTRINSPIN 设置
      15.      34
      16.      35
    3. 3.3 实验软件实现
      1. 3.3.1 导入和配置工程
      2.      38
      3.      39
      4. 3.3.2 实验工程结构
      5. 3.3.3 实验软件概述
    4. 3.4 监控反馈或控制变量
      1. 3.4.1 使用 DATALOG 函数
      2. 3.4.2 使用 PWMDAC 函数
      3. 3.4.3 使用外部 DAC 板
    5. 3.5 使用不同的构建级别循序渐进地运行工程
      1. 3.5.1 级别 1 增量构建
        1. 3.5.1.1 构建和加载工程
        2. 3.5.1.2 设置调试环境窗口
        3. 3.5.1.3 运行代码
      2. 3.5.2 级别 2 增量构建
        1. 3.5.2.1 构建和加载工程
        2. 3.5.2.2 设置调试环境窗口
        3. 3.5.2.3 运行代码
      3. 3.5.3 级别 3 增量构建
        1. 3.5.3.1 构建和加载工程
        2. 3.5.3.2 设置调试环境窗口
        3. 3.5.3.3 运行代码
      4. 3.5.4 级别 4 增量构建
        1. 3.5.4.1 构建和加载工程
        2. 3.5.4.2 设置调试环境窗口
        3. 3.5.4.3 运行代码
  7. 4构建定制板
    1. 4.1 构建新的定制板
      1. 4.1.1 硬件设置
      2. 4.1.2 将参考代码迁移到定制电路板
        1. 4.1.2.1 设置硬件板参数
        2. 4.1.2.2 修改电机控制参数
        3. 4.1.2.3 更改引脚分配
        4. 4.1.2.4 配置 PWM 模块
        5. 4.1.2.5 配置 ADC 模块
        6. 4.1.2.6 配置 CMPSS 模块
        7. 4.1.2.7 配置故障保护函数
      3. 4.1.3 向电机控制工程中添加附加功能
        1. 4.1.3.1 添加按钮功能
        2. 4.1.3.2 添加电位器读取功能
        3. 4.1.3.3 添加 CAN 功能
    2. 4.2 支持新的 BLDC 电机驱动器板
    3. 4.3 将参考代码移植到新的 C2000 MCU
  8.   A 附录 A. 电机控制参数
  9.   参考资料
  10.   修订历史记录

运行代码

  1. 为适当的电源加电,并逐渐增加电源的输出电压以获得适当的直流母线电压。
  2. 如果使用图形工具,则实验 2 使用与实验 1 相同的图形配置和参数来监控 2 个相电流。
  3. 通过点击  按钮来运行工程,或点击“Debug”选项卡中的 RunResumesystemVars.flagEnableSystem 应在固定时间后设为 1,这意味着已完成偏移校准。故障标志 motorVars_M1.faultMtrUse.all 应等于 0。如果情况并非如此,用户应按照节 3.5.1.3 中所述仔细检查实验 1 中的电流和电压检测电路。
  4. 要验证电机逆变器的电流和电压检测电路,请在“Expressions”窗口中将变量 motorVars_M1.flagEnableRunAndIdentify 设置为 1,如图 3-33 所示。电机将以电压/频率 (v/f) 开环运行。如果电机旋转不平稳,请根据电机规格调整 user_mtr1.h 文件中的 v/f 曲线参数,如下所示。有关调整 v/f 曲线参数的更多详细信息,请参阅7.a。注意:修改这些参数将需要重新编译工程。有关在调试模式下重新编译工程的更多信息,请参阅14 的步骤 14。
    #define USER_MOTOR1_FREQ_LOW_HZ            (5.0)            // Hz
    #define USER_MOTOR1_FREQ_HIGH_HZ           (400.0)          // Hz
    #define USER_MOTOR1_VOLT_MIN_V             (1.0)            // Volt
    #define USER_MOTOR1_VOLT_MAX_V             (24.0)           // Volt
  5. motorVars_M1.speedRef_Hz 变量用于设置电机的速度基准在“Expressions”窗口中检查 motorVars_M1.speed_Hz 变量的值,以保持电机转速 (motorVars_M1speed_Hz) 接近于基准速度 (motorVars_M1.speedRef_Hz),如图 3-33 所示。
  6. 在此构建级别中,需要验证电流检测、电压检测、转子角度估算器和发生器。这可以使用 PWMDAC 或 DAC128S 模块并借助示波器来完成,如节 3.4.2节 3.4.3 所述。此外,DATALOG 模块可用于查看这些感应波形。有关使用 DATALOG 查看电流、电压和角度信号的更多信息,请参阅步骤 7。如果使用 DAC128S 模块,请配置 dac128s.ptrdata[] 输入,使其与以下每个子部分中显示的代码相对应。要进行代码修改,可以取消注释用于 DAC128S 初始化的相应代码部分,并注释掉该小节中不需要的 DAC128S 初始化的其余部分。在修改代码以与每个小节相对应后,需要重新编译工程。有关在调试模式下重新编译工程的更多信息,请参阅14 的步骤 14。
    1. 要监控的第一组参数是相电流。为此,需要对如下所示的代码部分取消注释,代码部分用于将 dac128s 指针数据设置为 3 个相电流以及角度估算器变量。此代码位于 sys_main.c 文件中。预期电流波形应与图 3-35中示波器上显示的波形类似。在 DAC128S 输出上测量的电流波形应该几乎与电流探头捕获的相应相电流波形相同。如果是这种情况,则表示电流检测电路适用于电机控制。如果情况并非如此,则可能需要调整 user_mtr1.h 文件中的 v/f 参数,如7.a中所述。
      dac128s.ptrData[0] = &motorVars_M1.adcData.I_A.value[0];     // CH_A
      dac128s.ptrData[1] = &motorVars_M1.adcData.I_A.value[1];     // CH_B
      dac128s.ptrData[2] = &motorVars_M1.adcData.I_A.value[2];     // CH_C
      dac128s.ptrData[3] = &motorVars_M1.angleGen_rad;             // CH_D
      dac128s.ptrData[4] = &motorVars_M1.angleEST_rad;                // CH_E, N/A
      dac128s.ptrData[5] = &motorVars_M1.adcData.V_V.value[0];        // CH_F, N/A
      dac128s.ptrData[6] = &motorVars_M1.adcData.V_V.value[1];        // CH_G, N/A
      dac128s.ptrData[7] = &motorVars_M1.adcData.V_V.value[2];        // CH_H, N/A
      
      dac128s.gain[0] = 2.0f * 4096.0f / USER_M1_ADC_FULL_SCALE_CURRENT_A;
      dac128s.gain[1] = 2.0f * 4096.0f / USER_M1_ADC_FULL_SCALE_CURRENT_A;
      dac128s.gain[2] = 2.0f * 4096.0f / USER_M1_ADC_FULL_SCALE_CURRENT_A;
      dac128s.gain[3] = 4096.0f / MATH_TWO_PI;
      dac128s.gain[4] = 4096.0f / MATH_TWO_PI;                           // NA
      dac128s.gain[5] = 2.0f * 4096.0f / USER_M1_ADC_FULL_SCALE_VOLTAGE_V; // N/A
      dac128s.gain[6] = 2.0f * 4096.0f / USER_M1_ADC_FULL_SCALE_VOLTAGE_V; // N/A
      dac128s.gain[7] = 2.0f * 4096.0f / USER_M1_ADC_FULL_SCALE_VOLTAGE_V; // N/A
      ... ...
      dac128s.offset[0] = (uint16_t)(0.5f * 4096.0f); 
      dac128s.offset[1] = (uint16_t)(0.5f * 4096.0f);
      dac128s.offset[2] = (uint16_t)(0.5f * 4096.0f);
      dac128s.offset[3] = (uint16_t)(0.5f * 4096.0f);
      dac128s.offset[4] = (uint16_t)(0.5f * 4096.0f); // N/A
      dac128s.offset[5] = (uint16_t)(0.5f * 4096.0f); // N/A
      dac128s.offset[6] = (uint16_t)(0.5f * 4096.0f); // N/A
      dac128s.offset[7] = (uint16_t)(0.5f * 4096.0f); // N/A
    2. 要监控的第二组参数是相电压。为此,对于将 dac128s 指针数据设置为指向相电压的代码部分,应取消注释,如下所示。此代码位于 sys_main.c 文件中。DAC128S 模块的相电压检测的输出波形形状应与图 3-36图 3-37 中所示的图像类似。如果是这种情况,则表示电压检测电路按预期工作。请注意,振幅会随电源电压和使用的电机而变化,但波形的形状应该是相同的。请注意相位波形根据所使用的 SVM 模式而存在的差异。对于通用 SVM 模式,波形的上峰和下峰有电压骤降;而对于最小 SVM 模式,电压骤降仅出现在上峰,但在下峰保持平缓。要更改 SVM 模式,请从“Expressions”窗口中的 motorVars_M1.svmMode 枚举中选择 SVM_COM_C 或 SVM_MIN_C。
      dac128s.ptrData[0] = &motorVars_M1.adcData.V_V.value[0];     // CH_A
      dac128s.ptrData[1] = &motorVars_M1.adcData.V_V.value[1];     // CH_B
      dac128s.ptrData[2] = &motorVars_M1.adcData.V_V.value[2];     // CH_C
      dac128s.ptrData[3] = &motorVars_M1.angleGen_rad;             // CH_D
      dac128s.ptrData[4] = &motorVars_M1.angleEST_rad;                // CH_E, N/A
      dac128s.ptrData[5] = &motorVars_M1.adcData.I_A.value[0];        // CH_F, N/A
      dac128s.ptrData[6] = &motorVars_M1.adcData.I_A.value[1];        // CH_G, N/A
      dac128s.ptrData[7] = &motorVars_M1.adcData.I_A.value[2];        // CH_H, N/A
      
      dac128s.gain[0] = 2.0f * 4096.0f / USER_M1_ADC_FULL_SCALE_VOLTAGE_V;
      dac128s.gain[1] = 2.0f * 4096.0f / USER_M1_ADC_FULL_SCALE_VOLTAGE_V;
      dac128s.gain[2] = 2.0f * 4096.0f / USER_M1_ADC_FULL_SCALE_VOLTAGE_V;
      dac128s.gain[3] = 4096.0f / MATH_TWO_PI;
      dac128s.gain[4] = 4096.0f / MATH_TWO_PI;                             // N/A
      dac128s.gain[5] = 2.0f * 4096.0f / USER_M1_ADC_FULL_SCALE_CURRENT_A; // N/A
      dac128s.gain[6] = 2.0f * 4096.0f / USER_M1_ADC_FULL_SCALE_CURRENT_A; // N/A
      dac128s.gain[7] = 2.0f * 4096.0f / USER_M1_ADC_FULL_SCALE_CURRENT_A; // N/A
      ... ...
      dac128s.offset[0] = (uint16_t)(0.5f * 4096.0f);
      dac128s.offset[1] = (uint16_t)(0.5f * 4096.0f);
      dac128s.offset[2] = (uint16_t)(0.5f * 4096.0f);
      dac128s.offset[3] = (uint16_t)(0.5f * 4096.0f);
      dac128s.offset[4] = (uint16_t)(0.5f * 4096.0f); // N/A
      dac128s.offset[5] = (uint16_t)(0.5f * 4096.0f); // N/A
      dac128s.offset[6] = (uint16_t)(0.5f * 4096.0f); // N/A
      dac128s.offset[7] = (uint16_t)(0.5f * 4096.0f); // N/A
    3. 要监控的第三组参数是角度发生器和角度估算器参数。为此,对于将 dac128s 指针数据设置为指向相应变量的代码部分,应取消注释,如下所示。此代码位于 sys_main.c 文件中。角度发生器和估算器波形的角度应与图 3-38中所示的示波器波形相似。请注意,力角发生器的角度与 FAST 或 eSMO 估算器的估算转子角度非常相似。这表示 FAST 或 eSMO 估算器可按预期使用电机参数以及采样电流和电压信号。
      dac128s.ptrData[0] = &motorVars_M1.angleGen_rad;            // CH_A
      dac128s.ptrData[1] = &motorVars_M1.angleEST_rad;            // CH_B
      dac128s.ptrData[2] = &motorVars_M1.anglePLL_rad;            // CH_C
      dac128s.ptrData[3] = &motorVars_M1.adcData.I_A.value[0];    // CH_D
      dac128s.ptrData[4] = &motorVars_M1.adcData.V_V.value[0];        // CH_E, N/A
      dac128s.ptrData[5] = &motorVars_M1.adcData.I_A.value[1];        // CH_F, N/A
      dac128s.ptrData[6] = &motorVars_M1.adcData.I_A.value[2];        // CH_G, N/A
      dac128s.ptrData[7] = &motorVars_M1.adcData.V_V.value[1];        // CH_H, N/A
      
      dac128s.gain[0] = 4096.0f / MATH_TWO_PI;
      dac128s.gain[1] = 4096.0f / MATH_TWO_PI;
      dac128s.gain[2] = 4096.0f / MATH_TWO_PI;
      dac128s.gain[3] = 2.0f * 4096.0f / USER_M1_ADC_FULL_SCALE_CURRENT_A;
      dac128s.gain[4] = 2.0f * 4096.0f / USER_M1_ADC_FULL_SCALE_VOLTAGE_V; // N/A
      dac128s.gain[5] = 2.0f * 4096.0f / USER_M1_ADC_FULL_SCALE_CURRENT_A; // N/A
      dac128s.gain[6] = 2.0f * 4096.0f / USER_M1_ADC_FULL_SCALE_CURRENT_A; // N/A
      dac128s.gain[7] = 2.0f * 4096.0f / USER_M1_ADC_FULL_SCALE_VOLTAGE_V; // N/A
      
      dac128s.offset[0] = (uint16_t)(0.5f * 4096.0f);
      dac128s.offset[1] = (uint16_t)(0.5f * 4096.0f);
      dac128s.offset[2] = (uint16_t)(0.5f * 4096.0f);
      dac128s.offset[3] = (uint16_t)(0.5f * 4096.0f);
      dac128s.offset[4] = (uint16_t)(0.5f * 4096.0f); // N/A
      dac128s.offset[5] = (uint16_t)(0.5f * 4096.0f); // N/A
      dac128s.offset[6] = (uint16_t)(0.5f * 4096.0f); // N/A
      dac128s.offset[7] = (uint16_t)(0.5f * 4096.0f); // N/A
  7. 如果将 DATALOG 模块与图形工具配合使用来检查电流检测信号、电压检测信号和角度输出,请按照下述步骤操作。关于 DATALOG 模块的更多信息,请参阅节 3.4.1。注意:在修改代码后,有必要在以下每一步之间重新编译工程。有关在调试模式下重新编译工程的更多信息,请参阅14 的步骤 14。
    1. 要使用 DATALOG 模块测试 U 和 V 相电流,必须在 sys_main.c 文件中设置以下代码。
      注: 默认情况下,已为构建级别 2 配置此代码。图形工具上显示的相电流采样信号波形如图 3-39 所示。
      datalogObj->iptr[0] = &motorVars_M1.adcData.I_A.value[0];
      datalogObj->iptr[1] = &motorVars_M1.adcData.I_A.value[1];
    2. 要使用 DATALOG 模块测试 U 相和 V 相的相电压,必须在 sys_main.c 文件中设置以下代码并将其修改为如下所示的代码。图形工具上的相电压采样信号波形如图 3-40 所示。
      datalogObj->iptr[0] = &motorVars_M1.adcData.V_V.value[0];
      datalogObj->iptr[1] = &motorVars_M1.adcData.V_V.value[1];
    3. 将 DATALOG 模块的四个输入配置为以下代码。图形工具上力角生成器或估算器波形的角度,如图 3-41 中所示。请注意,力角发生器的角度与 FAST 或 eSMO 估算器的估算转子角度非常相似。
      datalogObj->iptr[0] = &motorVars_M1.angleFOC_rad;
      datalogObj->iptr[1] = &motorVars_M1.angleEST_rad;
  8. 通过减小变量 motorVars_M1.overCurrent_A 的值来验证过流故障保护,过流保护由 CMPSS 模块实现。如果 motorVars_M1.overCurrent_A 设为小于电机相电流实际值的值,则会触发过流故障,PWM 输出会被禁用,motorVars_M1.flagEnableRunAndIdentify 将被设置为 0motorVars_M1.faultMtrUse.all 将被设置为 0x10 ( 16),如图 3-34 所示。
  9. 将变量 motorVars_M1.flagEnableRunAndIdentify 设为 0 停止运行电机。
  10. 完成后,现在可以停止控制器,并终止调试连接。通过首先点击工具栏上的“Halt”按钮  或点击 TargetHalt 来完全停止控制器。最后,通过点击  或点击 RunReset 来重置控制器。
  11. 通过点击“Terminate Debug Session” 或点击 RunTerminate 来关闭 CCS 调试会话。
  12. 关闭逆变器套件的电源。
 构建级别 2:“Expressions”窗口中的变量图 3-33 构建级别 2:“Expressions”窗口中的变量

在“Expression”表达式窗口中调整 motorVars_M1.overCurrent_A 的值,以触发过流故障,如图 3-34 所示。

 构建级别 2:电流保护设置图 3-34 构建级别 2:电流保护设置

使用 DAC128S085EVM 与示波器来监测电机的三相检测电流,并使用电流探头将采样值与测量值进行比较,如图 3-35 所示。

 构建级别 2:电机相电流波形图 3-35 构建级别 2:电机相电流波形

使用 DAC128S085EVM 和示波器来监测电机的三相检测电压,并通过将 motorVars_M1.svmMode 设置为 SVM_COM_C 来使用共模 SVPWM,如图 3-36 所示。

 构建级别 2:使用共模 SVM 的电机相电压波形图 3-36 构建级别 2:使用共模 SVM 的电机相电压波形

搭配使用 DAC128S085EVM 和示波器来监测电机的三相检测电压,并通过将 motorVars_M1.svmMode 设置为 SVM_MIN_C 来使用最小模式 SVPWM,如图 3-37 所示。

 构建级别 2:使用最小 SVM 模式的电机相电压波形图 3-37 构建级别 2:使用最小 SVM 模式的电机相电压波形

搭配使用 DAC128S085EVM 与示波器来从角度发生器监控电机的转子角度和 FAST 估算器的角度,如图 3-38 所示。

 构建级别 2:电机转子角度和相电流波形图 3-38 构建级别 2:电机转子角度和相电流波形

将 DATALOG 与图形工具一起使用,以监测电机的三相检测电流,如图 3-39 所示。

 构建级别 2:使用图形工具时的电机相电流波形图 3-39 构建级别 2:使用图形工具时的电机相电流波形

使用数据记录器和图形工具监测电机的三相检测电压,如图 3-40 所示。

 构建级别 2:使用图形工具时的电机相电压波形图 3-40 构建级别 2:使用图形工具时的电机相电压波形

将 Datalog 与图形工具配合使用,从角度发生器监视电机的转子角度以及 FAST 估算器的角度,如图 3-41 所示。

 构建级别 2:使用图形工具时的电机转子角度波形图 3-41 构建级别 2:使用图形工具时的电机转子角度波形