所需外设
磁场定向控制对处理器速度的要求远不如对合适外设的要求高。整个闭环仅需数百次浮点运算——难点在于这些运算必须在与开关动作精确同步的时刻执行,采样电流也需在另一个精确时刻完成,且最终结果须在三相上保持相干地到达桥臂。上述操作几乎全部由硬件完成,只需一次性配置,之后无需干预。
本页是采购清单及其依据。具体的数值和故障均来自一台试验平台——NXP MCX-N947 通过 FRDM-MC-LVPMSM 逆变器在 24 V 下驱动 Teknic M-2311P——因为实际运行过的特定电路板比通用表格更有参考价值。这些是来自该硬件的实测值或数据手册中的参数,而非本网站模型的输出结果。
1. 具有互补输出和硬件死区时间的 PWM 单元
三个子模块,六个输出,中心对齐。
互补模式是指对每一相只写入一个占空比,由外设硬件自动生成低端器件的反相信号。这不仅出于便利考虑:两路边沿之间的 死区时间 必须由硬件插入。软件无法可靠地延缓数百纳秒的导通动作,以防其间发生中断;若上下桥臂同时导通,则会形成直流母线间的短路。
采用中心对齐而非边沿对齐,是因为只有这样才能将零矢量对称地置于每个周期的起始与结束处——正如三相桥页面所示,这也是 §3 中的电流采样窗口得以存在的前提。
将三个子模块同步到同一时基也并非可选项。三个载波必须严格同相,否则桥臂施加的电压矢量将与调制器计算的结果不符。
稍不留神就会踩坑的重装载规则
占空比寄存器采用双缓冲机制。写入操作先进入保持寄存器,只有在重装载事件发生时才会转移到有效寄存器。这一机制确保了三相在周期边界处同时切换,而不是在脉冲中途切换——因此即使两次寄存器写入之间存在延迟,也不会产生转矩毛刺。
而硬币的另一面往往会让人耗费整整一天去排查:当重装载处于挂起(待处理)状态时,对数值寄存器的后续写入均不会生效。 因此,占空比更新有且仅有一种正确的操作顺序,而这一点从寄存器映射表中并不容易看出:
clear any pending reload (CLDOK)
write the three duties (VAL2/VAL3 × 3)
arm the transfer (LDOK)
以下是当两段代码都在同一个中断中写入占空比时该规则的作用。图中展示了实际的锁存模型——哪次写入生效、哪次被硬件丢弃,以及桥臂最终导通了哪些开关:
第二个写入器并未覆盖第一个写入器。它被忽略了——在没有任何错误提示的情况下——因为第一个写入器启动了一次传输,且数值寄存器在该传输完成之前被锁定。而它是否会被忽略,取决于计数器当时所处的位置,而这并非任一段代码的固有属性。
在上述试验台上,遇到的正是这一缺陷。新引入的库在同一个中断里排在厂商协议栈之后写入占空比;厂商驱动在自身写入结束时置位了锁存位,导致第二个写入者发现寄存器已被第一个写入者挂起的重装载锁定。最终哪个占空比写入胜出近乎随机,表现出来的症状则是间歇性出现违背物理规律的现象。直到改为写入前先清除挂起的重装载标志后,在 800 rpm 下测得的 q 轴电压(3.2 V)才终于与反电动势理论值吻合。
在试验台上 显而易见的教训是“务必先清除挂起的重装载”,但这只是问题的一小半。清除是必要的,但并不充分。即便在一个周期内安排三个写入者,且每一个都严格遵守规范,模型依然会产生三种不同的结果——因为无论哪一次写入恰好落在周期边界之前,它都会成为最终生效的那一个。
因此,这个故事背后的规则是关于计数的,而不是关于指令的:只有一个代码段可以独占占空比寄存器。 在同一时间段内,两位写入者之间的竞争无法通过精心安排写入顺序来取胜,因为决定哪个写入生效的是硬件,而非你的代码。
2. 故障输入直接连接到输出
PWM 单元应能通过硬件输入将输出强制置于安全状态,无需 CPU 干预——通常由一个监测分流电阻的模拟比较器触发。
这也正是将过流保护放在硬件比较器而非中断服务程序(ISR)中的全部理由。在 16 kHz 开关频率下,软件路径的最坏情况是让已经超限的电流持续 62.5 µs,外加随后的重装载等待时间。对于桥臂短路而言,这段时间太漫长了。
在试验台上,接入该路径的比较器存在校准偏差:对于一台额定 7.7 A 的电机,电流一旦超过 2.4 A 它就会悄无声息地截断 PWM。因此,我们有意清除了该硬件映射,改由软件承担保护。这无疑是一项真正的降级,也作为降级被明确记录在案——在此提及此事的意义在于,“关闭硬件保护”是一个必须留存于正式文档中的工程决策,而不能只是一行藏在驱动代码里的注释。
3. 可由 PWM 直接触发的 ADC
不是通过定时器中断读取的ADC,而是由调制器直接触发的ADC。
低端分流测量仅在零矢量期间有效,此时三个低端器件均导通,相电流实际流经分流电阻。由于脉冲以该周期的中间为中心,其互补的零窗口则以周期的边界为中心。因此,该窗口并非周期内部的一个区间,而是跨两个周期的边界,这也是为什么触发是在计数器下溢时发生的,而不是在其他看似更自然的位置:
接下来的链条值得按正确的顺序排列:
- PWM自身的比较事件会触发转换;
- 转换完成后会触发控制中断。
因此,控制律永远不会基于过时的电流值运行,也不会在所需的采样值尚未就绪前提前运行。电流测量页面中关于采样时刻放置位置的所有讨论,均以这条硬件触发路径为前提。
所需的通道数应足以采集两相电流及直流母线电压。仅采集两相电流也足够——第三相电流可由基尔霍夫定律推算得出——但在占空比极端时,选择哪两相并不随意;上图展示了原因:占空比最大的那一相通态窗口最先关闭。
在试验台上 单个转换器服务于整个驱动器,意味着三相电流并非同时采样的。一次触发会启动一串链式转换序列——依次为 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。当周期内立即关断与滞后整整一个周期,这就是两者之间的本质区别。
- 正交编码器和调试探头都各有其用,在无传感器驱动中,编码器更多是作为见证者而非传感器发挥作用。