本文介绍了六步 BLDC 电机控制应用的基本扩展程序,重点关注S12ZVM MCU设备。
根据有关 BLDC 速度计算的各种问题,我决定编写此文档以使规模计算清晰明了。如果有需要更详细解释的地方,请将其作为参考和评论。
本文档与 BLDC 电机的六步控制相关,以梯形反电动势形电压而闻名。关键是使用两相直流电流产生扭矩,同时第三相未连接。当转子移动时,相位被切换(换向)以保持定子磁通领先于转子磁通。许多应用笔记(例如AN4718或AN4704)中详细描述了这些原理。换向瞬间可由霍尔传感器或反电动势信号监测(所谓的“无传感器”)驱动。对于磁场定向控制,请参阅AN5135或AN5327中讨论的 PMSM 控制。
与基于霍尔传感器的控制相比,详细描述无传感器算法更有益。然而,方法几乎相同。
电机速度是根据非活动相上的 BEMF 电压的零交叉检测来计算的。这些零交叉事件时间是通过在 ADC 例程检测到零交叉时(或发生霍尔传感器换向事件时)捕获计时器(TIM0CNT)寄存器来测量的。这意味着,时间由定时器 TIM0 设置进行缩放。没有关于如何设置计时器的一般指导。但是,应将计时器设置为覆盖两次换向之间合理数量的刻度(这与高速下的速度精度相关),并且应该能够覆盖非常低的速度下彼此“远离”的两个换向,而不会发生计时器溢出。
一个好的做法是:
可以使用霍尔传感器事件来遵循相同的方法。
在应用中,零交叉(或霍尔传感器)周期由periodZC_F_PhA、periodZC_R_PhA等或periodZC[6]捕获,定义为 tU16 (16 位无符号)。如上所述,使用计时器来捕获周期。
在电动机理论中,我们认识到“电”速度和“机械”速度。“电”速度与旋转场相关。机械转速与转子转速直接相关。这两个速度之间的关系由极点或极对的数量决定:
(1)机械转速=电气转速/极对数=电气转速/(极数/2)
在下文中,我们将讨论三相BLDC 电机。
要计算电机的一次“电”旋转 = 6 次换向(或 6 次过零),应将所有 6 个换向时间周期相加。对于这种情况,将生成的“ period6ZC ”定义为 tU32 (或无符号长整型),以防止所有六个 16 位零交叉周期相加时发生溢出。
如果将所有 6 个零交叉周期相加,您将获得每次“电”旋转的计时器滴答数。这意味着,如果电机是 2 极电机(= 1 极对电机),那么它将是转子每次“机械”旋转的时间。在这种情况下:
(2)机械转速=电气转速;
只需将其乘以极对数,即可轻松获得高极电机每次机械旋转的时间。
(3)机械每转一圈的时间 =周期6ZC *极对数
每6个零交叉的周期“ period6ZC ”在控制环路内计算,通常在1毫秒定时器中断程序中计算。由于速度(转子频率)只是一个反转的时间周期,我们可以使用以下代码行来计算实际速度:
(4)实际速度 = 速度计算数字 / 周期6ZC;现在,如何读取它的刻度以及SPEED_CALC_NUMERATOR是什么?我们假设“ actualSpeed ”是 tFrac32 (1.31 格式的有符号 32 位数字)。这意味着最大小数部分的数字是 1.0,用整数值 2^31 = 2,147,483,648 来表示。为什么要使用 32 位数字而不是 16 位数字是显而易见的 - 因为period6ZC是 32 位值,所以结果应该具有相同的分辨率或宽度。
任务是找到正确的SPEED_CALC_NUMERATOR 。让我们考虑用于捕获零交叉事件时间的 S12ZVM 设备和计时器 TIM0。预分频器设置为 16(TIM0TSCR2_PR = 4),总线时钟为 12.5MHz,定时器滴答为 12.5MHz / 16 = 781.25 kHz,时间尺度为1.28us 。
假设电机的最大机械转速为10,000 RPM ,电机有6 个极对。这将给我们
(5)(10,000 RPM)/(60秒)= 166.67每秒转数,
(6) 166.67*(6极对数)= 每秒 1000 电转,因此
(7) 1000 *(6 次换向)= 每秒 6000 次换向/零交叉。
(8)这样一来,每次换向所需的时间为 1/6000 = 166.67us。
(9)最大速度下每个周期的刻度 = 166.67 us / 1.28us = 130.28
使用我们的1.28us计时器,我们可以以最大速度捕捉最多130 个周期。
对于电机的最大转速10,000 RPM ,我们可以简单地将 (4) 中所示的“实际速度”计算重新排列到 (13) 和 (14) 中,假设:
(10) actualSpeed = FRAC32(1.0) = 2,147,483,648
(11)周期6ZC = 6 个周期 * 130 = 780(向下舍入,因为该值仍然是整数)
对于S12ZVM设备,使用16位(tFrac16)计算比32位更方便。因此,我们可以利用缩放来达到
诀窍就隐藏在演员阵容中 实际速度 从 Frac32 到 Frac16:
(12)速度误差 = 所需速度 - (tFrac16)实际速度;这意味着,只有较低的 15 位被视为速度(假设实际速度永远不会超过 32767,因此第 16 个“符号”位将始终为零)。对于最大速度和SPEED_CALC_NUMERATOR确定,“ actualSpeed ”应该是 32767(这是有符号 tFrac16 的范围)。公式(4)可用于计算SPEED_CALC_NUMERATOR ,如下所示:
(13) 32767 = 速度计算计算器 / 780
(14)速度计算计算器 = 780 * 32,767 = 25,558,260
因此
#定义速度计算数值 25558260使用公式 (4),最小周期 6ZC的速度为:
(15)实际速度 = 速度计算分子 / 周期6ZC = 25,558,260 / 780 = 32,767;
用低 15 位屏蔽该值并将其转换为 tFrac16 将得到 1.0。由于速度刻度已经由电机的最大转速10,000 RPM决定,因此我们可以通过以下方式简单计算出实际速度:
(16) RealScaleSpeedRPM = (tFrac16)actualSpeed / 32,767 * MAX_SPEED = (tFrac16)actualSpeed / 32,767 * 10,000.
在应用说明 AN4704 中,有几个用于控制应用程序的宏常量。这些常数应该使用以下定义来计算,并借助SPEED_SCALE (速度真实尺度的浮点表示)。
#定义速度尺度 10000.0// 用于正确计算以下内容:
#定义REQUIRED_RUN_SPEED FRAC16(2000.0/SPEED_SCALE)// 2000 转/分
#define MIN_SPEED FRAC16(500.0/SPEED_SCALE) // 向下按钮控制的最小速度为 500 rpm(应至少为电机额定速度的 10%)
#定义 MAX_SPEED FRAC16(5000.0/SPEED_SCALE)// 向上按钮控制的最大速度为 5 krpm
#define SPEED_STEP FRAC16(100.0/SPEED_SCALE) // 100 rpm,按钮控制的上/下步进
如果应用程序使用 FreeMASTER 进行显示或控制,则也应在 FreeMASTER 项目中更新比例。AN4704 的新 FM 尺度为:
| 变量名称 | 可变的监视设置 |
|---|---|
| 所需速度 | 实数类型变换:线性:a = 速度尺度 = 10,000;b = 0 |
| actualSpeed | 有符号整数,大小 = 4 显示为:真实 位字段组成:字(0xffff) 实数类型变换:线性:a = 速度尺度 / 32767.0= 0.3051851;b = 0 |
现在,让我们来看看速度分辨率(或准确度):
在全速下,如果一个周期改变 1 个刻度,那么你将得到 周期6ZC 最大速度从 780 增加到 781,差异为 12.8041 RPM。越高 速度尺度 越大,误差越大。如果假设是所有 6 个时期都发生变化(因此 周期6ZC 将从 780 变为 786),最终的速度变化将是 76.336 RPM。这使得速度误差为 10,000 RPM +- 76,即 0.76%。
就准确性而言,将最大速度(或 SPEED_SCALE)设置为应用程序的最大速度是有意义的,而不是从电机数据表中复制一些较高的数字。嗯,应用程序的最大速度不应该超过电机的最大速度,但如果速度等级不必要地高,那就没有帮助了。
在实际应用中,计算出的速度( actualSpeed )反映了周期6ZC的所有偏差和变化。因此,对period6ZC进行某种过滤是一种很好的做法,可以通过平均或使用低通滤波器来实现。如果丢失一个或多个零交叉,则应该有一种机制来处理和检测电机是否停转(机械速度与换向失去锁定)或者是否仅仅是对信号的干扰。失速检测或霍尔信号故障/损坏检测是高质量应用面临的挑战之一。
S12ZVM MCU - NXP S12ZVM 主页
AutoMCDevKits - NXP汽车电机控制开发解决方案
AN4718 - 使用 S12ZVM 的三相 BLDC 霍尔传感器应用
AN4704 -带 S12 MagniV MC9S12ZVM 的三相无传感器 BLDC 电机控制套件
AN5201 - 在 S12ZVM128 设备中集成 LIN 驱动器和 BLDC 无传感器电机控制器
AN5330 - S12ZVM 设备迁移指南
非常清楚。在我读到这篇论文之前,我认为 SPEED_CALC_NUMERATOR 是一个“神奇数字”。