NXP公司K60N512+PWM控制BLDC电机

news2024/9/22 6:07:19

本篇文章介绍了使用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配置中断的优先级。为了更好地理解,请看以下示例。

中断安装

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

设置中断的优先级

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

对外接口

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

/************************************************************
* 函数名称:Set_speed
* 参数: 所需速度,带符号短整型数据格式的输入速度。输入值以 RPM 为单位。
*        电机序号,此例仅有一个。
* 返回:void
* 描述:用于为每个电机输入所需速度。
***********************************************************/
void Set_speed(signed short speed_input, int motor_number)
{ speed_req = INT16TOF32((speed_input*SPEED_TO_RPM_SCALE));}

/*******************************************************
* 函数名称:Get_speed
* 参数:电机序号
* 返回:测得的速度
* 描述:用于获取每个电机的速度(带符号短整型数据格式).此值以 RPM 为单位。
******************************************************/
signed short Get_speed(int motor_number)
{
 signed long speed_temp;
 speed_temp = (speed_measured * MAX_SCALED_SPEED);
 return (speed_temp >> 15);
}

/***************************************************
* 函数名称:Get_status
* 参数:无
* 返回:应用状态
*       0 — 处于空闲状态
*       1 — 处于停止状态
*       2 — 处于正在运行状态
**************************************************/
unsigned char Get_status(void)
{ return App_state; }

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

©2023 Yang Li. All rights reserved.

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1060773.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

雷达编程实战之提高探测速度

有效帧频率作为雷达一个非常核心的指标,它代表了雷达探测识别的速度,速度越快,后级各项智能驾驶功能就能得到更快、更有效的判断。本篇文章首先从硬件的角度,提供了一种合理利用片上资源提高探测识别速度的常用方法,然…

qt 5.15.2 安卓 macos

macos环境安卓配置 我的系统是monterey12.5.1 打开qt的配置界面 这里版本是java1.8,注意修改这个json文件,显示包内容 {"common": {"sdk_tools_url": {"linux": "https://dl.google.com/android/repository/comm…

Boost程序库完全开发指南:1-开发环境和构建工具

Boost官方于2019年12月发布的1.72版编写,共包含160余个库/组件,涵盖字符串与文本处理、容器、迭代器、算法、图像处理、模板元编程、并发编程等多个领域,使用Boost,将大大增强C的功能和表现力。环境:Windows 10&#x…

JAVA学习(4)-全网最详细~

🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…

vertx的学习总结6

Beyond the event bus 一、章节覆盖: 如何在事件总线之上公开服务 verticles和事件总线服务的异步测试 动态代理: MyService 接口 package porxy.test;import io.vertx.codegen.annotations.ProxyGen;ProxyGen public interface MyService {void he…

Linux学习之悟空派上实现OLED的无线网IP及CPU温度显示【守护进程】

起因 最近各种网购平台似乎都在推送99元的悟空派全志H3的开发板,出于好奇就买了一块来试试水,由于这块板子基本上和orangepi-Zero的硬件结构一模一样,所以设备树、boot这些就用orangepi现成的部件了。 因为本人比较喜欢使用SSH操作&#xff…

全志ARM926 Melis2.0系统的开发指引①

全志ARM926 Melis2.0系统的开发指引① 1. 编写目的2. Melis2.0 系统概述3. Melis2.0 快速开发3.1. Melis2.0 SDK 目录结构3.2. Melis2.0 编译环境3.3. Melis2.0 固件打包3.4. Melis2.0 固件烧录3.5.串口打印信息3.6. Melis2.0 添加和调用一个模块3.6.1. 为什么划分模块&#xf…

Sentinel-微服务保护

一、初识Sentinel 1、雪崩问题及解决方案 雪崩问题 微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩。 解决雪崩问题的常见方式有四种: 1、超时处理:设定超时时间,请求超过一定时间…

【C语言】内存函数的详细教学和模拟实现

🚀write in front🚀 🔎大家好,我是gugugu。希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 🆔本文由 gugugu 原创 CSDN首发🐒 如需转载还请通知⚠…

全志ARM926 Melis2.0系统的开发指引②

全志ARM926 Melis2.0系统的开发指引② 编写目的4. 编译工具链使用4.1.工具链通用配置4.2.模块的工具链配置4.3.简单的 makefile 5. 固件烧录工具的安装5.1.PhoenixSuit 的安装步骤5.2.检验 USB 驱动安装5.3.使用烧录软件 PhoenixSuit -全志相关工具和资源-.1 全志固件镜像修改工…

Python:操作SQLite数据库简单示例

本文用最简单的示例演示python标准库提供的SQLite数据库进行新增、查询数据的过程。 代码文件app.py # -*- coding: UTF-8 -*- from flask import Flask import sqlite3app Flask(__name__)app.route(/) def hello_world():return Hello World!#创建数据库 app.route(/creat…

Go基础之变量和常量

Go基础之变量和常量 文章目录 Go基础之变量和常量一. 标识符、关键字、内置类型和函数1.1 标识符1.2 关键字1.3 保留字1.4 内置类型1.4.1 值类型:1.4.2 引用类型:(指针类型)1.5 内置函数1.6 内置接口error 二.Go变量命名规范2.1 采用驼峰体命名2.2 简单、…

Python无废话-办公自动化Excel图表制作

openpyxl 支持用Excel工作表中单元格的数据,创建条形图、折线图、散点图和饼图等。 图表制作步骤 在openpyxl模块中创建图表,步骤如下: ①选择一个单元格区域,创建Reference 对象,作为图形数据a)(Value)。 ②创建一个Chart对象…

阿里云ECS服务器上启动的portainer无法访问的问题

如下图,在阿里云ECS服务器上安装并启动了portainer,但是在自己电脑上访问不了远程的portainer。 最后发现是要在网络安全组里开放9000端口号,具体操作如下: 在云服务器管理控制台点击左侧菜单中的网络与安全-安全组,然…

阻塞队列--线程安全问题

之前的队列在很多场景下都不能很好地工作,例如 大部分场景要求分离向队列放入(生产者:主要调用offer方法)、从队列拿出(消费者:主要调用poll方法)两个角色、它们得由不同的线程来担当&#xff0…

uboot启动流程-uboot内存分配工作总结

一. uboot 启动流程 _main 函数中会调用 board_init_f 函数,本文继续简单分析一下 board_init_f 函数。 本文继续具体分析 board_init_f 函数。 本文继上一篇文章的学习,地址如下: uboot启动流程-uboot内存分配_凌肖战的博客-CSDN博客 二…

【C语言】浮点数在内存中的存储和读取——底层分析

🚀write in front🚀 🔎大家好,我是gugugu。希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 🆔本文由 gugugu 原创 CSDN首发🐒 如需转载还请通知⚠…

【12】c++设计模式——>单例模式练习(任务队列)

属性: (1)存储任务的容器,这个容器可以选择使用STL中的队列(queue) (2)互斥锁,多线程访问的时候用于保护任务队列中的数据 方法:主要是对任务队列中的任务进行操作 &…

MySql运维篇---008:日志:错误日志、二进制日志、查询日志、慢查询日志,主从复制:概述 虚拟机更改ip注意事项、原理、搭建步骤

1. 日志 1.1 错误日志 错误日志是 MySQL 中最重要的日志之一,它记录了当 mysqld 启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此日志。 该日志是默认开启的&a…

[激光原理与应用-71]:光电传感器的工作原理详解:光电效应原理、类型、光信号的光谱、电信号的频谱

目录 前言: 一、光电传感器组成 二、光电元件:光电效应的分类 2.1 外光电效应:逸出效应 2.2 内光电效应:光电导效应 2.3 内光电效应:光生伏特效应(电流效应) 2.3.1 光电转换元件PD 三、…