• NXP公司K60N512+PWM控制BLDC电机


    本篇文章介绍了使用NXP公司提供的塔式快速原型系统来驱动控制带霍尔传感器的无刷直流电机。文章涉及的塔式快速原型系统主要包括以下四个独立板卡:1.塔式系统支撑模块(TWR-Elevator),用以连接微控制器以及周边模块;2.低电压3相电机控制模块(TWR-MC-LV3PH);3.通信(USB、Ethernet、CAN、RS232/485)塔式系统模块(TWR-SER);4.塔式系统K60 MCU模块(TWR-K60N512)。

    文章从基础理论讲起,帮助读者梳理电机控制相关概念,了解整个电机驱动系统构成,带领读者从BLDC电机控制实现的各个开发步骤来直观体验了整个实现过程。

    目录

    BLDC电机理论

    BLDC(带霍尔传感器)基本信息

    换相

    BLDC电机数字控制

    速度控制

    系统描述

    性能指标

    概要说明

    外设 

    数据流程图

    关键技术详解

    速度和位置测量

    PI控制器 

    软件实现

    函数实现

    中断安装 

    对外接口


    NXP公司把电机在汽车中的应用主要分为三类:动力总成安全和地盘以及车身和舒适。下图为这三类具体包含涉及到了电机控制的汽车部分。

    电机按照实现原理又分为直流有刷电机直流无刷电机步进电机永磁同步电机。下图为这四种电机在不同汽车部分的应用情况。

    本文主要介绍的是带霍尔传感器直流无刷(BLDC)电机的控制应用实现。


    BLDC电机理论

    BLDC(带霍尔传感器)基本信息

    BLDC的定子(stator)是通电的线圈,转子(rotor)是永磁体。换句话来说BLDC 电机的磁体保持转动,导体保持静止。


    换相

    利用磁铁同性相斥,异性相吸的原理,我们在定子上的线圈接入方向适当的电流,即让电磁铁的磁极方向和永磁体的磁极方向正好对应,不就能排斥、或者吸引转子做旋转运动了。BLDC电机将那六个线圈两两组合,分成A,B,C三个绕组(三相),这样就能同时控制两个中心对称的绕组采用相同的极性,从而提高了驱动效率,而A,B,C三个绕组又会两两结对,这样又能驱动相邻的两个转子提供不同的极性,那么转子将会获得更高的驱动力,如下面动图所示,通过AB-AC-BC-BA-CA-CB,这六个节拍(六步),依次循环驱动定子的绕组,转子就能一直旋转下去。

    综上所述,换相可以产生旋转场,通过六步控制,我们总共可以获得六种可能的定子磁通向量。必须在特定的转子位置更改定子磁通向量。转子位置通常通过霍尔效应传感器检测。霍尔传感器生成三种信号,这三种信号也包含六种状态。每个霍尔传感器的状态对应特定的定子磁通向量,如下表所示。

    顺时针旋转相序列
    霍尔传感器H1霍尔传感器H2霍尔传感器H3A相B相C相
    001V+V-NC
    011V+NCV-
    111NCV+V-
    100V-V+NC
    000V-NCV+
    001NCV-V+

    我们现在先拿六个电子开关来理解六个节拍的转化,如下图:


    BLDC电机数字控制

    对于常见的三相BLDC电机,可以使用标准的H桥驱动电路,如下图。

    BLDC 电机控制应用采用互补双极开关PWM。利用互补双极开关,两相由互补 PWM 信号供电 (底部 MOSFET的开关与一相之内的顶部MOSFET的开关互补),一相的占空比大于 50%,另 一相的占空比为互补值(小于 50%),如下图所示。

    互补双极开关PWM技术的优点是可以在所有四个工作象限中控制电机。双极PWM开关方案要 求顶部和底部开关PWM信号在换向事件时交换。另一个要求是在互补顶部和底部信号中插入死区。 


    速度控制

    换相可确保BLDC电机的转子正确旋转,而电机转速则仅取决于所施加电压的振幅。可使用PWM技术调整所施加电压的振幅。所需转速由速度控制器控制,速度控制器由比例 - 积分 (PI) 控制器实现。实际转速与所需转速之差为PI控制器的输入,该控制器随后根据此差值控制 PWM 脉冲的占空比,并且此占空比与维持正确转速所需的电压振幅相对应。


    系统描述

    性能指标

    该系统设计用于驱动三相 BLDC 电机。该应用符合以下性能规范:

    • 使用霍尔效应传感器对 BLDC 电机进行电压控制。
    • 带 TWR-K60N512 板的塔式系统解决方案。
    • 电源电压 +24 VDC。
    • 控制技术包括:
      • 使用霍尔效应传感器信号进行位置检测。
      • 使用速度闭环进行 BLDC 电机电压控制。
      • 速度测量基于一个霍尔效应传感器。
      • 两个旋转方向。
      • 可从任何转子位置启动。
      • 可在每次电机启动之前对 MOSFET 前置驱动自举预充电。
      • 最小转速 500 RPM (取决于所使用的电机)。
      • 最大转速 4000 RPM (取决于所使用的电机)。
    • FreeMASTER接口(输入速度、测得速度、速度误差、斜坡参数、过流LED指示)。
    • 以太网终端 (输入速度、以太网状态)。
    • 故障保护:
      • 直流母线过流故障保护(硬件)。
      • 电源反向极性保护电路(硬件)。

    概要说明

    K60N512运行主控制算法。根据用户接口和反馈信号,它将会生成六路PWM输出信号(FTM0)。如果所需转速不为零,则应用启用霍尔传感器中断并强制首次调用霍尔中断程序。每个霍尔传感器的新边沿自动调用中断程序。在此霍尔中断程序中,将会扫描来自霍尔传感器的信号,并交换和屏蔽对应的 PWM 通道。此过程称为换相。霍尔传感器扫描独立于速度控制(FTM1)。速度控制循环由PIT0定时调用,此周期循环中存在速度斜坡和应用状态机。主程序中仅存在一个针对FreeMASTER协议处理的无限循环,这样就可以通过FreeMASTER上位机调试此应用。


    外设 

    为了使此应用正确工作,必须使用以下外设。不允许将这些外设用于其他目的。

    1. FTM0:用于生成PWM信号的定时器,在组合模式下运行,开关频率为 19.2 kHz (48 MHz 的内核时钟),死区时间为 1 μs。
    2. FTM1:用于速度测量的定时器,在输入捕捉模式下运行,预分频为 128,模数为 0xFFFF,溢出周期为 175 ms。
    3. PIT0:用于定时调用速度控制循环和应用状态机,中断调用周期为 10 ms (48 MHz 内核时钟)。
    4. 端口A:用于霍尔效应传感器中断,如果在此端口上施加任何其他信号,则在每个信号边沿调用此中断,程序不会正确运行。
    5. 端口D:用于霍尔效应传感器中断,如果在此端口上施加任何其他信号,则在每个信号边沿调用此中断,程序不会正确运行。
    6. PTE26:用于紧急停止按钮。
    7. PTA27:用于读取 MC33937 MOS-FET 前置驱动的过流引脚。
    8. PTA10:用于表示 MC33937 MOS-FET 前置驱动上的第一级过流。
    9. SPI2:用于与 MC33937 MOS-FET 前置驱动通信。

    数据流程图

    电机驱动应用要求表明软件将提取用户接口下发的速度等参数和传感器采集的部分数值进行处理,然后生成用于电机控制的三相PWM信号。闭环BLDC电机驱动的控制数据流程图如下所示。

    其中包含的关键流程如下:

    1. 速度命令:用户通过FreeMASTER通信软件发送的每个速度更改命令均会使speed_req变量中的值改变。
    2. 缩放比例和速度斜坡:提供定点32位数的比例更改和速度斜坡计算,由于整个应用系统具有很大惯性,因此,应用时必须细化速度命令,否则可能会导致系统过载。此流程会不断更新speed_scaled的值直到与speed_req值一致。
    3. 速度PI控制器:它用于计算实际速度与speed_scaled之差并相应地补偿PWM 模块的占空比。
    4. 换相和PWM生成:它用于根据霍尔传感器的信号创建旋转场。
    5. 传感器中断处理程序:它用于生成换相向量。
    6. 速度测量:实现测量当前电机转速,详见下一小节。

    关键技术详解

    速度和位置测量

    实际电机速度基于旋转周期 (time_measured) 计算得出,并与用户提供的 speed_req 进行对比。随 后,通过速度斜坡算法对速度命令进行处理。从斜坡算法输出获得的实际速度命令与 speed_measured进行比较,将生成一个speed_error。 旋转周期通过霍尔传感器 A 和 flex timer 1 扫描,可在捕捉模式下对其进行配置。


    PI控制器 

    速度 PI控制算法用于处理speed_req和speed_measured之间的speed_error。PI控制器输出传输至 PWM发生器,以作为所施加电机电压的新校正值。

    PI控制器程序在PIT设备中断程序PIT0_isr中计算,它每10 ms被调用一次。此中断将在电机停止时禁用,从而使PI也禁用。PI控制器的积分部分在低速 (低于 499 RPM)时禁用,因为在此情况下,速度测量并不准确且PI控制器可能不稳定。要确定何时禁用,程序中存在两个宏: MIN_CW_SPEED_32和MIN_CWW_SPEED_32。

    PI控制器的输入为斜坡算法speed_scaled的输出,另一个输入为实际speed_measured。另外两个 输入为PI控制器参数trMyPI结构的指针。所有这些参数均供PI控制器函数GFLIB_ControllerPIp 使用。

    此函数输出为s32Output。它将按照PWM比例缩放为delta_duty并添加到half_duty。此处理结果为duty_cycle,这将被加载至Flex Timer寄存器中。 每当速度比例更改或者电机改变时,必须配置 PI速度控制器参数。


    软件实现

    函数实现

    整个电机控制算法由中断驱动。主函数仅用于MCU和应用初始化;如下图所示。初始化终止时, 程序将进入无限循环或其他应用处理程序 (web 服务器、 USB、FreeMASTER协议处理等)。

    为了使此电机应用正常工作,需要使用四个中断。 四个中断处理程序分别提供以下服务: 

    • 溢出中断处理程序:用于电机停止检测和速度测量。溢出处理程序用于复位速度斜坡。
    • 输入捕捉中断处理程序:用于读取两个霍尔传感器边沿之间的时间 (处理速度传感器的基本部分)。
    • 周期中断:用于定时调用速度控制器、速度斜坡和应用状态机。 PIT中断在电机停止时禁用。
    • 霍尔传感器中断:用于扫描霍尔传感器的状态以及换相过程。换相过程生成适当的换相模式到六个栅极信号,而 PWM发生过程则为选定栅极输出生成相应的PWM 信号。可使用三位换相向量 “hall_status”从换相表中选择换相模式。换相模式随后将载入微控制器的寄存器中。


    中断安装 

    裸机版本与MQX版本的差别仅在于中断安装方法。我们这里仅仅介绍裸机版本中的安装方法。

    在裸机版本中,我们可以直接安装中断。您可以通过在NVICISER寄存器中设置正确位来轻松实现中断。可以使用寄存器NVIC_IP配置中断的优先级。为了更好地理解,请看以下示例。

    中断安装

    1. NVICICPR2 = 0x4800010; // 首先清除可能的挂起中断
    2. NVICISER2 = 0x4800010; // 启用中断
    3. NVICICPR1 |= 0x80000000; // 首先清除可能的挂起中断
    4. NVICISER1 |= 0x80000000; // 启用中断

    设置中断的优先级

    1. NVIC_IP(63) = 0x40; // 针对 FTM1 设置优先级
    2. NVIC_IP(68) = 0x50; // 针对 PIT0 设置优先级
    3. NVIC_IP(87) = 0x40; // 针对霍尔传感器设置优先级
    4. NVIC_IP(90) = 0x40; // 针对霍尔传感器设置优先级

    对外接口

    本软件除了可以通过FreeMASTER调试通信软件来控制电机速度,还可以集成到一个完整的应用中作为电机驱动来使用。要达到此目的,我们需要封装三个对外接口API:

    1. /************************************************************
    2. * 函数名称:Set_speed
    3. * 参数: 所需速度,带符号短整型数据格式的输入速度。输入值以 RPM 为单位。
    4. * 电机序号,此例仅有一个。
    5. * 返回:void
    6. * 描述:用于为每个电机输入所需速度。
    7. ***********************************************************/
    8. void Set_speed(signed short speed_input, int motor_number)
    9. { speed_req = INT16TOF32((speed_input*SPEED_TO_RPM_SCALE));}
    10. /*******************************************************
    11. * 函数名称:Get_speed
    12. * 参数:电机序号
    13. * 返回:测得的速度
    14. * 描述:用于获取每个电机的速度(带符号短整型数据格式).此值以 RPM 为单位。
    15. ******************************************************/
    16. signed short Get_speed(int motor_number)
    17. {
    18. signed long speed_temp;
    19. speed_temp = (speed_measured * MAX_SCALED_SPEED);
    20. return (speed_temp >> 15);
    21. }
    22. /***************************************************
    23. * 函数名称:Get_status
    24. * 参数:无
    25. * 返回:应用状态
    26. * 0 — 处于空闲状态
    27. * 1 — 处于停止状态
    28. * 2 — 处于正在运行状态
    29. **************************************************/
    30. unsigned char Get_status(void)
    31. { return App_state; }

     十六宿舍 原创作品,转载必须标注原文链接。

    ©2023 Yang Li. All rights reserved.

    欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。

  • 相关阅读:
    【Docker安装部署Zookeeper+Kafka集群详细教程、部署过程中遇到问题&解决方案、测试集群是否部署成功】
    前端:综合例题详细解说(含源代码),导航栏,商品展示页面。
    Java的面向对象思想
    STM32物联网项目-DMA使用介绍(ADC+DAC)
    Vision China 2023(深圳)倒计时,51camera诚邀您莅临观展
    开山之作 | YOLOv1算法超详细解析(包括诞生背景+论文解析+技术原理等)
    数字智能化软件改变企业进销存销售管理结构
    openGauss学习笔记-97 openGauss 数据库管理-访问外部数据库-dblink
    为什么Redis使用单线程 性能会优于多线程?
    字符集编码(二):字符编码模型
  • 原文地址:https://blog.csdn.net/geek_liyang/article/details/133563875