嵌入式电机控制:M/T法测速与开关磁阻电机换相算法详解

发布时间:2026/6/19 1:24:37

嵌入式电机控制:M/T法测速与开关磁阻电机换相算法详解 1. 项目概述与核心价值在嵌入式电机控制的世界里速度和位置是驱动一切动作的基石。无论是让机械臂精准定位还是让风扇平稳运行控制器都需要实时、准确地知道电机“跑”得多快、转到了哪里。速度计算这个看似基础的环节恰恰是决定整个控制系统性能上限的关键。它不仅是实现PID闭环控制、抑制转速波动的必要输入更是高级功能如转矩控制、效率优化的前提。然而把速度算准、算快在资源受限的嵌入式微控制器上并非易事。你可能会遇到编码器脉冲抖动带来的噪声、低速时分辨率不足、高速时计算溢出等一系列头疼的问题。更复杂的是对于开关磁阻电机这类结构特殊、控制逻辑迥异的电机如何根据转子位置精确地开通和关断对应的相绕组即换相直接决定了电机能否启动、运行是否平稳、效率是高是低。今天我们就来深入拆解一个经典的电机控制库中关于速度计算和开关磁阻电机换相的核心算法。这份资料源自飞思卡尔现恩智浦早期的DSP电机控制库虽然年代稍远但其设计思想清晰、实现扎实是理解底层电机控制逻辑的绝佳范本。我们将不仅仅停留在API手册的翻译层面而是结合我十多年在工业伺服和消费电子电机驱动上的踩坑经验把每个参数背后的物理意义、算法选择的权衡、以及实际部署时那些手册里不会写的注意事项都掰开揉碎了讲清楚。无论你是正在评估控制方案还是调试中遇到了转速跳动、换相失步的难题相信这篇详尽的解析都能给你带来直接的启发和可落地的参考。2. 速度计算的核心原理与两种经典方法速度在旋转运动中就是角速度单位通常是每分钟转数RPM。在数字控制系统中我们无法直接测量一个连续的速度信号只能通过离散的“采样”来估算。最直接的思路有两种要么固定时间去“数”位置变化了多少要么固定位置变化去“测”用了多少时间。这两种思路就对应了资料中提到的velocityFixPer和velocityFixPos两个函数。2.1 方法一固定周期法M法测速——velocityFixPer这种方法在工程上常被称为“M法测速”。它的逻辑非常直观我们在一个固定的、周期性的时间窗口比如每10毫秒内读取编码器或霍尔传感器反馈的位置增量值。速度就等于位置变化量除以时间。公式核心速度 (v) (位置差 * 60) / (固定周期 T)在提供的APIvelocityFixPer(Frac16 PositionDifference, UWord16 FixPerConst)中PositionDifference就是在一个固定采样周期T内电机转过的机械角度或圈数。它是一个归一化的分数范围在[-1, 1)之间对应[-x_max, x_max]的实际位置变化。正负号代表方向。FixPerConst这是一个关键的计算常数。它封装了固定周期T和系统最大可测量速度v_max或v100%的映射关系。根据资料中的公式推导FixPerConst 32768 * (v_max / v100%)。这里的32768对应Q15格式Frac16的1.0标么值。为什么需要这个常数直接使用(位置差/时间)在定点数DSP上运算涉及除法且结果的范围可能很大或很小。通过预计算FixPerConst 60 / T的缩放版本函数内部只需进行一次乘法PositionDifference * FixPerConst即可直接得到归一化后的速度值计算高效且易于进行后续的限幅和处理。实操要点与避坑指南采样周期T的选择这是一个权衡。T太短如1ms在低速时位置增量可能为0或很小导致速度计算分辨率低波动大T太长如100ms系统动态响应慢无法及时反映速度变化。通常T应远小于控制系统速度环的周期例如1/5到1/10同时保证在最低速时一个周期内也有足够的位置脉冲数。对于1024线的编码器如果最低速要求分辨率为1RPM那么T内至少需要1024/60 ≈ 17个脉冲T至少需要17 / (1024*1/60) ≈ 1秒这显然动态性太差。因此在超低速时常需结合下文的方法二。v_max与v100%的设定v_max是理论上根据最大位置差和周期T算出的极限值v_max 60 * x_max / T。而v100%是你希望速度输出范围对应的实际值。通常令v100% v_max此时FixPerConst 32768。但有时为了预留余量或匹配其他模块可以设置v100% v_max。务必注意如果实际速度超过v100%输出值将饱和在±1.0。位置差的计算与方向处理获取PositionDifference时必须处理编码器计数器的溢出和方向。对于32位计数器做差即可对于16位计数器需要考虑溢出翻转。方向信息通常编码在最高位或通过另一个变量传递在计算差值时需要将其还原为有符号数。2.2 方法二固定位置间隔法T法测速——velocityFixPos这种方法被称为“T法测速”。它的思路反过来我们不去固定时间而是固定一个位置变化量比如编码器的1个完整周期或1/512圈然后测量电机转过这个固定角度所花费的时间。速度与这个时间成反比。公式核心速度 (v) (固定位置间隔 X * 60) / (所用时间 t)在APIvelocityFixPos(Frac16 PeriodTime, Word16 FixPosConst)中PeriodTime电机转过一个固定机械角度X所花费的时间。它同样被归一化到[-1, 1)区间对应[-t_max, t_max]的实际时间。正负代表方向。FixPosConst这个常数封装了固定位置间隔X和系统最小可测量速度v_min的映射关系。根据公式FixPosConst 32767 * (v_min / v_max)。其中v_max k * v_mink是一个大于1的整数推荐50-100用于设定速度量程。为什么这种方法适合低速在极低速时固定周期法可能数个周期都看不到位置变化。而固定位置间隔法只要电机在动就一定能测到时间。速度越低转过固定角度的时间t越长测量反而越精确。但它的缺点是高速时时间t非常短对计时器的分辨率要求极高。参数设定与计算示例假设我们选择固定位置间隔为1/512圈即编码器每512个脉冲为一个测量单元计时器时间标度设定为0.2秒对应PeriodTime 1.0。最小可测速度v_min (60 * (1/512)) / 0.2 ≈ 0.586 RPM。若取k100则最大可测速度v_max 100 * 0.586 58.6 RPM。计算常数FixPosConst 32767 * (0.586 / 58.6) 32767 * 0.01 327取整。重要警告资料中特别指出PeriodTime的绝对值必须大于等于FixPosConst对应的归一化时间否则函数返回不准确。这对应着实际速度不能超过v_max。在实际编程中必须在调用函数前对PeriodTime进行限幅处理确保其不小于FixPosConst / 32767即v_min / v_max。2.3 两种方法的对比与融合应用特性固定周期法 (velocityFixPer)固定位置间隔法 (velocityFixPos)别名M法测速T法测速原理固定时间测位置差固定位置差测时间计算v (Δθ / T) * 60v (X / Δt) * 60精度特点高速时精度高低速时分辨率差低速时精度高高速时对计时器要求高实时性固定周期输出实时性好输出周期不固定依赖于位置事件适用场景中高速运行对动态响应要求高极低速运行启动/爬行阶段资源消耗需要周期性中断位置计数器需要高分辨率计时器响应位置事件在实际的高性能伺服驱动器中常常采用混合M/T法来兼顾宽速域。基本思路是在高速区采用M法当速度低于某个阈值时自动切换到T法。切换逻辑需要仔细设计避免在切换点附近速度计算值跳动。另一种更优雅的做法是使用频率-周期双模观测器同时维护基于时间和基于位置的两种速度估计并进行加权融合但这需要更复杂的算法实现。3. 开关磁阻电机换相算法深度解析开关磁阻电机以其结构简单、成本低、高速性能好等优点在一些特定领域如家电、泵类、高速主轴占有一席之地。但其控制的核心难点——换相与永磁同步电机或直流无刷电机有本质不同。SRM的转矩来源于磁阻最小化趋势而非磁场相互作用因此必须在电感上升区对相绕组通电在电感下降前及时关断。3.1 SRM换相的基本原理与控制挑战开关磁阻电机的转矩公式可以简化为T (1/2) * i^2 * (dL/dθ)。其中i是相电流dL/dθ是电感随转子位置θ的变化率。由此可见正向转矩只在dL/dθ 0电感上升区时产生。通电区间必须严格匹配这个区域。转矩与电流平方成正比与电流方向无关。因此功率电路通常使用不对称半桥只需单向电流。换相时机至关重要。开通角θ_on和关断角θ_off的选取直接影响平均转矩、转矩脉动、效率和噪声。资料中介绍的srmcmt3ph2spp系列函数就是针对三相、每相两个开关不对称半桥这种最常用拓扑的换相处理器。它不负责决定θ_on和θ_off的时刻而是根据上层逻辑给出的指令生成正确的功率管开关序列。3.2 换相处理器数据结构与初始化所有换相操作都围绕一个核心数据结构srmcmt3ph2spp_sData进行。理解其成员是理解整个流程的关键cmt_ctrl换相软件控制使能寄存器。它的低6位Ab, At, Bb, Bt, Cb, Ct分别控制A、B、C三相的下管bottom和上管top是否由软件本算法控制。置1表示软件控制置0则可能由硬件或默认状态控制。初始化时通常将所有位置1取得完全控制权。cmt_out换相输出控制数据寄存器。同样低6位定义各开关管的目标输出状态1开通0关断。真正的PWM硬件寄存器会受cmt_ctrl屏蔽后根据cmt_out来驱动。cmt_ptr_phase_on,cmt_ptr_phase_off,cmt_ptr_phase_sw这三个指针是状态机的核心。它们分别指向下一次应该开通、关断、进行软/硬开关的相位A1, B2, C3。每次执行相应的函数后指针会根据旋转方向自动更新到下一个相位。初始化函数srmcmt3ph2sppInit必须首先被调用。它的作用一是根据start_phase参数初始化上述三个相位指针确保电机从正确的相位开始启动二是将cmt_ctrl全部置位取得控制权并将cmt_out全部清零关闭所有开关管确保系统从一个确定、安全的状态开始。3.3 四步换相流程详解资料中的图6-1和代码示例6-1清晰地展示了一个完整的换相周期它由四个步骤组成分别由四个函数触发第一步相位开通 (srmcmt3ph2sppPhOn)时机在计算好的开通角θ_on时刻由定时器比较匹配中断触发。动作根据cmt_ptr_phase_on指针开通对应相位的上下两个开关管见表6-4例如开通A相时cmt_out的 Ab, At 位都置1。这相当于将该相绕组直接连接到直流母线电压上电流开始快速上升。此函数执行后cmt_ptr_phase_on指针按方向A-C-B 或 A-B-C更新。第二步软开关切换 (srmcmt3ph2sppSoftSw)时机在相位开通后第一个PWM重载中断中触发。这是一个非常关键但常被忽略的细节。动作根据cmt_ptr_phase_sw指针将对应相位的上管控制权交给PWM硬件而下管保持常开见表6-8开通A相后软切换cmt_ctrl的 At 位清零cmt_out的 At 位可能保持或忽略。此时该相进入PWM斩波调压模式通常采用斩下管的方式上管常开下管受PWM控制来调节电流。此函数更新cmt_ptr_phase_sw指针。为什么需要“软开关”这一步如果直接在θ_on时刻就开启PWM由于电感电流不能突变在第一个PWM周期内如果占空比不是100%下管关断时电流会通过上管的反并联二极管续流母线电压会施加反向电压在绕组上不利于电流的快速建立。先上下管全开让电流在母线电压下快速建立到一个较高值再切入PWM模式可以获得更快的电流响应减少转矩建立时间。这是SRM控制中的一个经典优化技巧。第三步相位关断 (srmcmt3ph2sppPhOff)时机在计算好的关断角θ_off时刻由另一个定时器比较匹配中断触发。动作根据cmt_ptr_phase_off指针关闭对应相位的上下两个开关管见表6-6。此时绕组电流需要通过电机绕组和开关管反并联二极管形成的续流回路衰减。此函数更新cmt_ptr_phase_off指针。第四步硬开关切换 (srmcmt3ph2sppHardSw)时机与作用资料中描述略显模糊。通常这一步并非在每个周期都调用。它用于在需要的时候例如特定故障模式或控制模式切换时将软件对开关管的控制权完全释放将cmt_ctrl中对应位置零让硬件或安全逻辑接管。在正常的PWM关断续流期间并不需要调用此函数。3.4 换相角度计算让电流提前建立对于高速运行的SRM一个严峻的问题是电感上升区的时间窗口非常短。如果等到转子到达对齐位置电感最大处才开始通电电流根本来不及建立到所需值导致转矩不足。因此必须提前导通即在转子尚未到达定子齿极时就开始通电这就是超前换相角。资料中提供的srmcacAngleCalc函数就是用于计算这个超前角θ_adv。其简化公式忽略电阻为θ_adv (L_un * i_desired / u_phase) * ω_actualL_un非对齐位置电感。这是电流建立回路的主要限制因素。i_desired期望达到的相电流峰值。u_phase施加在相绕组上的电压约等于母线电压乘以当前PWM占空比。ω_actual电机的实际机械角速度。公式的物理意义(L_un * i_desired / u_phase)代表在给定电压下电流从0上升到i_desired所需的时间因为di/dt V/L。将这个时间乘以角速度ω就得到了需要提前的角度电角度。速度越高这个角度就必须越大。代码示例6-2的实践解读参数标定使用前必须根据电机参数L_un,I_MAX,OMEGA_MAX和系统量程U_MAX,THETA_MAX计算缩放常数scale_const。这个常数将物理量计算压缩到Q15格式的运算中。调用时机该函数应在每次准备换相前被调用根据当前的电流指令、母线电压和反馈速度动态计算本次换相所需的超前角。角度合成计算出的adv_angle是相对于“重叠开始点”即电感开始上升的点THETA_EDGE的超前量。因此最终的开通角theta_on THETA_EDGE - adv_angle。这里使用减法因为是在时间轴上向前提前移动。实现方式示例中通过不断读取编码器位置position并与计算出的theta_on比较一旦超过即触发换相标志。这是一种软件查询方式。更高效的做法是利用定时器的输出比较功能将theta_on转换为定时器计数值直接产生中断精度和实时性更高。4. 从API到实战系统集成与调试要点理解了单个API只是第一步。将它们有机组合成一个稳定、高效的嵌入式控制系统才是真正的挑战。这里分享几个关键的实战经验。4.1 速度计算模块的集成策略传感器接口层无论是编码器还是霍尔传感器都需要一个稳定、抗干扰的接口层。对于正交编码器建议使用MCU的专用正交解码模块QEI并启用其4倍频计数以提升分辨率。对于霍尔传感器需配置输入捕获功能并编写消抖算法通常采用10-100us的延时再采样。速度计算任务调度对于velocityFixPerM法将其放在一个固定周期的定时器中断如1kHz中执行。对于velocityFixPerT法应将其放在位置捕获中断如编码器索引信号或每N个脉冲的软件分频中执行。如果采用混合M/T法则需要一个状态机来管理两种方法的切换和结果融合。低通滤波必不可少计算出的原始速度值通常噪声很大尤其是低速时。必须加入一阶或二阶低通数字滤波器。滤波器的截止频率需要仔细调整要在滤除噪声和保持系统动态响应之间取得平衡。一个经验是截止频率设为速度环带宽的5-10倍。方向处理与零速检测速度值应包含方向信息正负。在接近零速时由于传感器噪声和计算误差速度值可能在零附近抖动导致控制系统“抽搐”。需要实现一个零速死区当速度绝对值小于某个阈值如额定速度的0.1%时强制将速度输出置零。4.2 SRM换相控制的系统框架一个典型的SRM数字控制系统包含以下层次位置/速度检测层提供转子位置θ和速度ω反馈。换相逻辑层核心就是本文所述的srmcmt3ph2spp模块。它接收来自上层的“开通”、“关断”、“软切换”命令并输出具体的cmt_ctrl和cmt_out寄存器值。角度计算与调度层这是控制策略的大脑。它根据速度指令、反馈速度、电流指令利用srmcacAngleCalc或其他更复杂的算法如考虑饱和、互感动态计算θ_on和θ_off。然后根据当前转子位置调度换相逻辑层的三个动作开通、软切换、关断。调度通常由多个定时器输出比较OC模块实现将角度转换为定时器计数比较值。电流调节层在软开关切换后的PWM阶段通过电流采样和PID/PI调节器动态调整PWM占空比使相电流跟踪其指令值。电流指令可能来自速度环的输出转矩控制模式也可能是固定的斩波限值电流斩波模式。PWM驱动层将cmt_ctrl和cmt_out的值写入MCU的PWM模块对应的影子寄存器由硬件自动在下一个PWM周期更新输出确保开关动作的同步性和安全性。4.3 调试过程中常见的“坑”与解决思路电机启动抖动或失败可能原因1初始相位指针start_phase设置错误。SRM启动需要知道转子的初始位置。如果无传感器通常采用“对齐”方式依次给各相通一个短时小电流由于电感随位置变化检测电流上升率最大的相其对应的就是最小电感位置非对齐位置反推即可得到初始位置。如果有传感器则直接读取。可能原因2开通角θ_on太小。在启动时转速为0根据公式超前角也为0。如果θ_on设置得离对齐点太近电流来不及建立。启动时应采用一个固定的、较大的超前角如30度电角度。排查方法用示波器同时观察位置信号、相电流和PWM驱动波形。检查第一次换相触发时转子位置是否在预期区间电流是否开始上升。高速运行时转矩下降或失步可能原因1超前角θ_adv计算不准或未随速度调整。速度升高后必须增大超前角。检查srmcacAngleCalc的输入参数特别是u_phase和ω_actual是否正确。可能原因2关断角θ_off设置过晚。电流在电感下降区会产生负转矩。必须确保在电感开始下降前彻底关断。尝试逐步提前关断角观察平均电流和转矩变化。可能原因3PWM频率过低或电流环带宽不足导致高速时电流跟踪不上指令。需要提高PWM频率或优化电流环PID参数。排查方法在高速下用示波器观察电流波形是否能在导通区间内达到指令峰值并保持平顶。观察关断后电流衰减是否迅速。换相时刻有较大的电流尖峰或噪声可能原因软开关切换时机不当。如果从全开通切换到PWM模式的时机太晚电流可能已经超过斩波限值导致切换瞬间产生冲击。尝试在电流上升到指令值的70%-80%时就进行软切换。排查方法放大观察开通和软切换两个时刻附近的电流波形看是否存在不连续或突变。速度计算值跳动大对于M法检查在低速时一个采样周期内的位置增量是否过小如小于3个计数。如果是考虑切换到T法或增加采样周期。对于T法检查在高速时测量时间PeriodTime是否接近计时器分辨率极限。如果是考虑切换到M法。通用方法检查传感器信号是否受到干扰电源噪声、长线传输。确保编码器电源稳定信号线采用双绞线或屏蔽线。在软件中加入数字滤波。5. 进阶思考超越基础API的性能优化官方库提供的API是可靠的基础但在追求极致性能的应用中我们还可以做更多。速度观测器替代简单的M法/T法计算采用状态观测器如龙贝格观测器、滑模观测器来同时估算速度和位置并能有效抑制测量噪声甚至在传感器故障时提供一定冗余。自适应换相角控制srmcacAngleCalc的公式忽略了电阻和磁路饱和。实际中电感L_un会随电流变化电阻压降在低速时不可忽略。可以建立更精细的电机模型或通过在线参数辨识、查表等方式来动态修正换相角。转矩脉动抑制SRM固有的转矩脉动是其主要缺点。可以通过电流 profiling来实现即不追求电流为方波而是根据转子位置给定一个特定形状的电流指令如正弦波、梯形波或其变体使得各相合成转矩更加平滑。这需要更复杂的离线计算或在线查表。无位置传感器控制对于成本敏感或环境恶劣的应用去掉位置传感器是趋势。可以通过检测相绕组的瞬态电感通常通过注入高频脉冲或测量PWM关断期间的续流时间来实现来估算转子位置。这在低速和零速下是巨大挑战是目前SRM控制的研究热点。回过头看这份电机控制库文档虽然代码风格古朴但其蕴含的“固定时间/固定位置测速”、“四步换相流程”、“超前角计算”等思想至今仍是许多电机驱动产品的内核逻辑。理解它不仅是为了调用几个函数更是为了掌握电机控制中最本质的时空转换艺术——如何用离散的数字信号去精准地驾驭连续的旋转机械运动。当你下次调试电机听到它从嘶鸣到平稳鸣响时或许就能体会到这些看似枯燥的算法背后所蕴含的精确与力量。

相关新闻