FOC 参考手册 06 工程实现

所需外设

磁场定向控制对处理器速度的要求远不如对合适外设的要求高。整个闭环仅需数百次浮点运算——难点在于这些运算必须在与开关动作精确同步的时刻执行,采样电流也需在另一个精确时刻完成,且最终结果须在三相上保持相干地到达桥臂。上述操作几乎全部由硬件完成,只需一次性配置,之后无需干预。

本页是采购清单及其依据。具体的数值和故障均来自一台试验平台——NXP MCX-N947 通过 FRDM-MC-LVPMSM 逆变器在 24 V 下驱动 Teknic M-2311P——因为实际运行过的特定电路板比通用表格更有参考价值。这些是来自该硬件的实测值或数据手册中的参数,而非本网站模型的输出结果。

平台互连:CPU 及其 PWM、ADC、比较器和正交解码器,连接至逆变器、分流放大器、电机和调试探针。 单颗微控制器(MCU)内 SWD 占空比 ISR 六路门极驱动 3φ 分流电阻信号 i abc , U dc 故障跳闸 A/B/I 硬件封锁 调试探针 SWD —— 运行时实时 非侵入读取 RAM Cortex-M33 150 MHz,执行控制 ISR 高级 PWM 定时器 3 对互补通道,硬件死区 片内模拟比较器 硬件过流跳闸保护 ADC 由 PWM 硬件同步触发 正交编码器接口(QEI) A/B 相脉冲 + Z 相索引 三相逆变桥 六个开关管,24 V 母线 分流采样运放 差分放大与电平偏置 PMSM 2000 ppr
此图中的所有信号都在每个 PWM 周期内形成闭合回路:栅极驱动输出、电流反馈、角度反馈。唯独两个未参与该回路的模块——比较器与调试探针——往往会在电路板设计中被遗漏,事后又令人追悔莫及。比较器连向 PWM 单元的信号线不传输任何数据;它传递的是撤销输出的强制关断信号,§2 将详细阐述其重要性。

1. 具有互补输出和硬件死区时间的 PWM 单元

三个子模块,六个输出,中心对齐。

互补模式是指对每一相只写入一个占空比,由外设硬件自动生成低端器件的反相信号。这不仅出于便利考虑:两路边沿之间的 死区时间 必须由硬件插入。软件无法可靠地延缓数百纳秒的导通动作,以防其间发生中断;若上下桥臂同时导通,则会形成直流母线间的短路。

采用中心对齐而非边沿对齐,是因为只有这样才能将零矢量对称地置于每个周期的起始与结束处——正如三相桥页面所示,这也是 §3 中的电流采样窗口得以存在的前提。

将三个子模块同步到同一时基也并非可选项。三个载波必须严格同相,否则桥臂施加的电压矢量将与调制器计算的结果不符。

稍不留神就会踩坑的重装载规则

占空比寄存器采用双缓冲机制。写入操作先进入保持寄存器,只有在重装载事件发生时才会转移到有效寄存器。这一机制确保了三相在周期边界处同时切换,而不是在脉冲中途切换——因此即使两次寄存器写入之间存在延迟,也不会产生转矩毛刺。

而硬币的另一面往往会让人耗费整整一天去排查:当重装载处于挂起(待处理)状态时,对数值寄存器的后续写入均不会生效。 因此,占空比更新有且仅有一种正确的操作顺序,而这一点从寄存器映射表中并不容易看出:

clear any pending reload   (CLDOK)
write the three duties     (VAL2/VAL3 × 3)
arm the transfer           (LDOK)

以下是当两段代码都在同一个中断中写入占空比时该规则的作用。图中展示了实际的锁存模型——哪次写入生效、哪次被硬件丢弃,以及桥臂最终导通了哪些开关:

中断
谁写入占空比
六个 PWM 周期。顶部:在每个周期边界处回绕的计数器;其下是每次中断执行的写入操作,并用 ✕ 标出被硬件丢弃的写入;再往下是保持寄存器,以及三相桥实际据以切换的有效寄存器。将 起始于 向周期末尾拖动,直到周期边界恰好落在两个写入者之间:原本被丢弃的写入不再被丢弃,另一个占空比随之送达电机。代码本身没有任何改变。接着勾选 抖动,即可看到这种现象间歇性发生——这正是从外部观察到的故障表现。

第二个写入器并未覆盖第一个写入器。它被忽略了——在没有任何错误提示的情况下——因为第一个写入器启动了一次传输,且数值寄存器在该传输完成之前被锁定。而它是否会被忽略,取决于计数器当时所处的位置,而这并非任一段代码的固有属性。

在上述试验台上,遇到的正是这一缺陷。新引入的库在同一个中断里排在厂商协议栈之后写入占空比;厂商驱动在自身写入结束时置位了锁存位,导致第二个写入者发现寄存器已被第一个写入者挂起的重装载锁定。最终哪个占空比写入胜出近乎随机,表现出来的症状则是间歇性出现违背物理规律的现象。直到改为写入前先清除挂起的重装载标志后,在 800 rpm 下测得的 q 轴电压(3.2 V)才终于与反电动势理论值吻合。

在试验台上 显而易见的教训是“务必先清除挂起的重装载”,但这只是问题的一小半。清除是必要的,但并不充分。即便在一个周期内安排三个写入者,且每一个都严格遵守规范,模型依然会产生三种不同的结果——因为无论哪一次写入恰好落在周期边界之前,它都会成为最终生效的那一个。

因此,这个故事背后的规则是关于计数的,而不是关于指令的:只有一个代码段可以独占占空比寄存器。 在同一时间段内,两位写入者之间的竞争无法通过精心安排写入顺序来取胜,因为决定哪个写入生效的是硬件,而非你的代码。

2. 故障输入直接连接到输出

PWM 单元应能通过硬件输入将输出强制置于安全状态,无需 CPU 干预——通常由一个监测分流电阻的模拟比较器触发。

从同一分流电压到安全关断栅极的两条路径:经比较器直接进入 PWM 单元的禁用逻辑,以及经 ADC 采样进入软件限幅检查。 硬件保护 —— 当前开关周期内立即关断 软件保护 —— 滞后一个采样周期及一次重装载 超过阈值 当前周期内 ≤ 1 个周期 再加 1 个周期 分流电阻压降 相电流转换为电压信号 片内模拟比较器 硅片硬件内置阈值比较 直接封锁 PWM 输出 全程无需 CPU 介入 ADC 定时采样 每个 PWM 周期仅采样一次 ISR 软件越限检查 软件触发停机 门极安全关断 上下桥臂全部关断
相同的输入,相同的结果,延迟却相差三个数量级。硬件路径会在电流超限的当个开关周期中途直接动作;而软件路径最早也要等到下一次 ADC 转换完成,随后还要再等到下一次重装载才能生效。两条路径都值得保留,但只有硬件路径才算得上真正的保护。

这也正是将过流保护放在硬件比较器而非中断服务程序(ISR)中的全部理由。在 16 kHz 开关频率下,软件路径的最坏情况是让已经超限的电流持续 62.5 µs,外加随后的重装载等待时间。对于桥臂短路而言,这段时间太漫长了。

在试验台上,接入该路径的比较器存在校准偏差:对于一台额定 7.7 A 的电机,电流一旦超过 2.4 A 它就会悄无声息地截断 PWM。因此,我们有意清除了该硬件映射,改由软件承担保护。这无疑是一项真正的降级,也作为降级被明确记录在案——在此提及此事的意义在于,“关闭硬件保护”是一个必须留存于正式文档中的工程决策,而不能只是一行藏在驱动代码里的注释。

3. 可由 PWM 直接触发的 ADC

不是通过定时器中断读取的ADC,而是由调制器直接触发的ADC。

低端分流测量仅在零矢量期间有效,此时三个低端器件均导通,相电流实际流经分流电阻。由于脉冲以该周期的中间为中心,其互补的零窗口则以周期的边界为中心。因此,该窗口并非周期内部的一个区间,而是跨两个周期的边界,这也是为什么触发是在计数器下溢时发生的,而不是在其他看似更自然的位置:

调制器请求的信号
芯片硬件参数
一个 PWM 周期,以边界而非周期中心绘制——只有这样,窗口才会作为一个整体区间显现,而非两个分离的区间。阴影带表示零矢量;触发点位于其中心,由此启动一连串四次转换,分别测量三相电流与母线电压。提高深度,观察随着最大占空比增大,窗口从两侧逐渐闭合;当这一系列转换不再完整时,意味着转换器正在采样一个处于开关状态的桥臂。下方的各相柱状图则是以另一种方式测量的同一窗口,即 1 − 占空比。

接下来的链条值得按正确的顺序排列:

  1. PWM自身的比较事件会触发转换;
  2. 转换完成后会触发控制中断。

因此,控制律永远不会基于过时的电流值运行,也不会在所需的采样值尚未就绪前提前运行。电流测量页面中关于采样时刻放置位置的所有讨论,均以这条硬件触发路径为前提。

所需的通道数应足以采集两相电流及直流母线电压。仅采集两相电流也足够——第三相电流可由基尔霍夫定律推算得出——但在占空比极端时,选择哪两相并不随意;上图展示了原因:占空比最大的那一相通态窗口最先关闭。

在试验台上 单个转换器服务于整个驱动器,意味着三相电流并非同时采样的。一次触发会启动一串链式转换序列——依次为 A 相、B 相、C 相,最后是直流母线电压——当四个采样值全部就绪时,FIFO 水位中断便会触发。这个中断就是控制中断。

第一次与最后一次转换之间的时间偏差是使用单个 ADC 的代价,而这一代价之所以可以接受,有着明确的物理依据而非心存侥幸:在零矢量窗口内,电机正通过下桥臂器件续流,因此相电流在该窗口内仅缓慢衰减。一旦将采样时刻移出该窗口,同样的时间偏差就不再无害了。

4. 如果有编码器,则需要一个正交解码器

一个在硬件中解码A/B信号并捕获索引脉冲的计数器。软件解码正交信号在低速时有效,但在高速下会悄然失效:在每转2000个脉冲、转速3000 rpm的情况下,脉冲沿大约每2.5 µs到达一次。

即使在 无传感器 驱动中,编码器输入也作为证据占据一席之地。在试验台上,一次无传感器启动曾报告在 435 电弧度/秒时处于正常的运行状态,而转轴却静止不动——观测器锁定了一个虚假信号。板上唯一与之相矛盾的数据就是冻结的编码器计数值。

5. 一条可以快速读取的调试路径

这不是控制环路的附属功能,而是工程设计与盲目猜测之间的本质区别。在这套试验装置上,串口控制台的主机到目标端方向发生了断路——这是硬件上的故障,任何固件都无法修复——因此,本页后报告中的每一项测量数据都是在电机运行时,通过 SWD 读写目标端内存获取的。

事实证明,这比控制台更实用,值得专门为此进行设计:将驱动器的状态保存在少量已知的全局变量中,这样调试探针就能成为您控制算法的示波器。

在实际器件上需要付出的代价

参数项该试验台上的数值
内核Cortex-M33,主频 150 MHz
PWM 周期62.5 µs(16 kHz)
控制ISR≈ 12 µs,约占周期的19%
传输延迟≈ 一个周期,从采样到施加矢量
编码器2000 ppr,正交

表中的传输延迟并非这块电路板的缺陷——它是 §1 中重装载规则必然带来的结构性后果。根据当前采样计算出的占空比要到下一个周期边界才会被锁存,因此实际施加的电压矢量会比测量时刻滞后约一个周期。时序与同步页面正是将这一延迟折算为相位裕度预算的,这也解释了为何 ISR 耗时是 12 µs 还是 30 µs 对稳定性的影响远比直觉想象的要小。

要点回顾

  • 互补输出采用硬件死区时间,中心对齐,并基于同一个同步时基。软件无法可靠地实现互锁功能。
  • 占空比寄存器采用双缓冲机制,挂起的重装载传输会锁定它们。始终只允许一个写入者——保证确定性的是写入者的数量,而非每个写入者自身的守纪程度。
  • 在边界处由调制器触发转换,并让转换完成信号唤醒控制中断。
  • 将过流保护交给硬件比较器,而非 ISR。当周期内立即关断与滞后整整一个周期,这就是两者之间的本质区别。
  • 正交编码器和调试探头都各有其用,在无传感器驱动中,编码器更多是作为见证者而非传感器发挥作用。