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.   修订历史记录

配置 CMPSS 模块

CMPSS 模块用于对相电流进行过流监测。可使用 CMPSS DAC 设置阈值,如果电流检测放大器的输出超过该阈值,则 CMPSS 输出会发生跳变。

如果使用定制电机驱动器板,或者将代码迁移到当前通用电机控制实验不支持的 C2000 MCU 或 TI 电机驱动器 EVM,则需要根据电机驱动器和 C2000 MCU 连接在 hal.h 文件中正确修改 ADC 引脚和 CMPSS 模块之间的连接。有关 CMPSS 模块内部连接的更多详细信息,请参阅 TMS320F28002x 实时微控制器技术参考手册(修订版 A)中的模拟引脚和内部连接 表。

HAL 模块根据所使用的电机驱动器板配置 CMPSS 模块。例如,LAUNCHXL-F280025C 和 BOOSTXL-DRV8323RS 之间的连接图如图 4-4 所示。以下步骤介绍了 CMPSS 模块的配置(特定于电路板或特定于 MCU 的更改以粗体显示)。

 CMPSS 连接图图 4-4 CMPSS 连接图
  1. 下面的代码显示了 3 个相电流 CMPSS 模块的基地址定义。此代码位于 hal.h 文件中。
    #define MTR1_CMPSS_U_BASE       CMPSS1_BASE
    #define MTR1_CMPSS_V_BASE       CMPSS3_BASE
    #define MTR1_CMPSS_W_BASE       CMPSS1_BASE
  2. 以下代码显示了用于将所需 ADC 输入分配给正确 CMPSS 模块的定义。此代码位于 hal.h 文件中。每个 CMPSS 比较器都有一个高电平比较器和一个低电平比较器,因此信号必须适当地多路复用到所需比较器的所需输入。有关这些连接的更多信息,请参阅正在使用的微控制器技术参考手册中的“模拟引脚和内部连接”表。注意:对于 LAUNCHXL F280025C,电机驱动器电流检测引脚可用的 CMPSS 模块是 CMPSS3 和 CMPSS1,因此 U 相电流和 W 相电流都需要共享 CMPSS1。这会导致 U 相电流仅在正过流时跳闸 CMPSS,而 W 相电流仅在负过流时跳闸 CMPSS。由于 V 相有一个专用的 CMPSS,因此将检测该相位上的过流是否存在正电流和负电流。如果修改代码以支持 C2000 MCU 器件,该器件具有用于每个相电流输入的单独 CMPSS 模块(例如,在 F280049C LaunchPad 中),则通过将同一相电流 ADC 输入多路复用到相应 CMPSS 模块的高输入和低输入,可以将代码配置为在每个相位上同时出现高过流和低过流。
    // CMPSS
    // For single phase current sensing, DRV8323RH and RS only
    #define MTR1_IDC_CMPHP_SEL      ASYSCTL_CMPHPMUX_SELECT_3    // CMPSS3-A14/C4*
    #define MTR1_IDC_CMPLP_SEL      ASYSCTL_CMPLPMUX_SELECT_3    // CMPSS3-A14/C4*
    
    #define MTR1_IDC_CMPHP_MUX      4                            // CMPSS3-A14/C4*
    #define MTR1_IDC_CMPLP_MUX      4                            // CMPSS3-A14/C4*
    
    // For three-phase current sensing
    #define MTR1_IU_CMPHP_SEL       ASYSCTL_CMPHPMUX_SELECT_1    // CMPSS1-A11
    #define MTR1_IU_CMPLP_SEL       ASYSCTL_CMPLPMUX_SELECT_1    // CMPSS1-A11, N/A
    
    #define MTR1_IV_CMPHP_SEL       ASYSCTL_CMPHPMUX_SELECT_3    // CMPSS3-C4
    #define MTR1_IV_CMPLP_SEL       ASYSCTL_CMPLPMUX_SELECT_3    // CMPSS3-C4
    
    #define MTR1_IW_CMPHP_SEL       ASYSCTL_CMPHPMUX_SELECT_1    // CMPSS1-C7, N/A
    #define MTR1_IW_CMPLP_SEL       ASYSCTL_CMPLPMUX_SELECT_1    // CMPSS1-C7
    
    #define MTR1_IU_CMPHP_MUX       1                            // CMPSS1-A11
    #define MTR1_IU_CMPLP_MUX       1                            // CMPSS1-A11
    
    #define MTR1_IV_CMPHP_MUX       4                            // CMPSS3-C4
    #define MTR1_IV_CMPLP_MUX       4                            // CMPSS3-C4
    
    #define MTR1_IW_CMPHP_MUX       3                            // CMPSS1-C7
    #define MTR1_IW_CMPLP_MUX       3                            // CMPSS1-C7
  3. 以下代码演示了 CMPSS 模块的设置,该设置在 hal.c 文件的 HAL_setupCMPSSs () 函数中进行。在此示例中,CMPSS1_HP 链接到 U 相电流,CMPSS1_LP 链接到 W 相电流,因此将 CMPSS1 配置两次以简化代码。在修改通用电机控制实验时,以下代码可能不需要修改,但务必确保正确配置上一步中的代码,以便 HAL_setupCMPSSs() 函数正确设置 CMPSS 模块。
    void HAL_setupCMPSSs(HAL_MTR_Handle handle)
    {
        HAL_MTR_Obj *obj = (HAL_MTR_Obj *)handle;
    ... ...
        uint16_t cmpsaDACH = MTR1_CMPSS_DACH_VALUE;
        uint16_t cmpsaDACL = MTR1_CMPSS_DACL_VALUE;
    ... ...
        ASysCtl_selectCMPHPMux(MTR1_IU_CMPHP_SEL, MTR1_IU_CMPHP_MUX);
        ASysCtl_selectCMPLPMux(MTR1_IU_CMPLP_SEL, MTR1_IU_CMPLP_MUX);
    
        ASysCtl_selectCMPHPMux(MTR1_IV_CMPHP_SEL, MTR1_IV_CMPHP_MUX);
        ASysCtl_selectCMPLPMux(MTR1_IV_CMPLP_SEL, MTR1_IV_CMPLP_MUX);
    
        ASysCtl_selectCMPHPMux(MTR1_IW_CMPHP_SEL, MTR1_IW_CMPHP_MUX);
        ASysCtl_selectCMPLPMux(MTR1_IW_CMPLP_SEL, MTR1_IW_CMPLP_MUX);
    
        for(cnt=0; cnt<3; cnt++)
        {
            // Enable CMPSS and configure the negative input signal to come from the DAC
            CMPSS_enableModule(obj->cmpssHandle[cnt]);
    
            // NEG signal from DAC for COMP-H
            CMPSS_configHighComparator(obj->cmpssHandle[cnt], CMPSS_INSRC_DAC);
    
            // NEG signal from DAC for COMP-L
            CMPSS_configLowComparator(obj->cmpssHandle[cnt], CMPSS_INSRC_DAC);
    
            // Configure the output signals. Both CTRIPH and CTRIPOUTH will be fed by
            // the asynchronous comparator output.
            // Dig filter output ==> CTRIPH, Dig filter output ==> CTRIPOUTH
            CMPSS_configOutputsHigh(obj->cmpssHandle[cnt],
                                    CMPSS_TRIP_FILTER |
                                    CMPSS_TRIPOUT_FILTER);
    
            // Dig filter output ==> CTRIPL, Dig filter output ==> CTRIPOUTL
            CMPSS_configOutputsLow(obj->cmpssHandle[cnt],
                                   CMPSS_TRIP_FILTER |
                                   CMPSS_TRIPOUT_FILTER |
                                   CMPSS_INV_INVERTED);
    
            // Configure digital filter. For this example, the maxiumum values will be
            // used for the clock prescale, sample window size, and threshold.
            CMPSS_configFilterHigh(obj->cmpssHandle[cnt], 32, 32, 30);
            CMPSS_initFilterHigh(obj->cmpssHandle[cnt]);
    
            // Initialize the filter logic and start filtering
            CMPSS_configFilterLow(obj->cmpssHandle[cnt], 32, 32, 30);
            CMPSS_initFilterLow(obj->cmpssHandle[cnt]);
    
            // Set up COMPHYSCTL register
            // COMP hysteresis set to 2x typical value
            CMPSS_setHysteresis(obj->cmpssHandle[cnt], 1);
    
            // Use VDDA as the reference for the DAC and set DAC value to midpoint for
            // arbitrary reference
            CMPSS_configDAC(obj->cmpssHandle[cnt],
                       CMPSS_DACREF_VDDA | CMPSS_DACVAL_SYSCLK | CMPSS_DACSRC_SHDW);
    
            // Set DAC-H to allowed MAX +ve current
            CMPSS_setDACValueHigh(obj->cmpssHandle[cnt], cmpsaDACH);
    
            // Set DAC-L to allowed MAX -ve current
            CMPSS_setDACValueLow(obj->cmpssHandle[cnt], cmpsaDACL);
    
            // Clear any high comparator digital filter output latch
            CMPSS_clearFilterLatchHigh(obj->cmpssHandle[cnt]);
    
            // Clear any low comparator digital filter output latch
            CMPSS_clearFilterLatchLow(obj->cmpssHandle[cnt]);
        }
    ... ...
        return;
    }