当前位置: 首页 > news >正文

基于NXP KV31F MCU的永磁同步电机FOC控制实战解析

1. 项目概述:为什么选择KV31F这颗MCU?

在工业自动化、家电和消费电子领域,电机控制正变得越来越“聪明”。从简单的开环调速到复杂的无传感器矢量控制,对微控制器(MCU)的要求早已不是简单的IO口翻转。你需要一个能快速处理三角函数、进行Park/Clark变换、执行PID运算,同时还能精准生成六路互补PWM、实时采样多路电流电压的核心。几年前,这可能意味着你需要一颗DSP外加一颗MCU,或者一颗价格不菲的高端处理器。但现在,像NXP Kinetis KV31F这样的跨界选手,让事情变得简单多了。

我手头这个项目,核心需求是为一款小型永磁同步电机(PMSM)驱动器开发控制板。需求很明确:需要实现磁场定向控制(FOC),支持霍尔传感器和编码器接口,具备过流、过压保护,同时系统成本要严格控制。在选型阶段,我对比了多家厂商的Cortex-M4产品线,最终把KV31F放到了首选位置。原因很简单:它几乎是为电机控制“量身定制”的。100MHz的主频配合硬件FPU,做一次浮点乘法只需一个时钟周期,这让复杂的FOC算法环路能在几十微秒内完成;12通道的FlexPWM定时器,轻松搞定三对互补带死区的PWM输出,还自带故障保护输入,硬件层面就能实现紧急关断;双路1.2MSPS的16位ADC,可以同步采样两相电流,对消除采样延迟、提高控制精度至关重要。128KB的Flash和24KB的RAM,对于存储FOC库、通信协议栈和运行实时控制系统来说,空间是足够且富余的。最关键的是,它把这么多电机控制专用外设集成在一颗QFN或LQFP封装的芯片里,BOM成本和PCB面积都得到了很好的控制。

2. 核心架构与电机控制专用外设深度解析

2.1 ARM Cortex-M4内核与FPU:算法加速的基石

KV31F的核心是那颗100MHz的ARM Cortex-M4。对于电机控制而言,M4相较于M0/M3最大的优势在于其DSP扩展指令集和可选的单精度浮点单元(FPU)。在我们的FOC算法中,充斥着大量的矩阵运算、三角函数(如sin/cos用于坐标变换)和浮点乘法。如果没有FPU,这些运算将由软件库模拟,耗时可能是硬件执行的数十倍。

例如,进行一次32位浮点数乘法,软件模拟可能需要30-50个时钟周期,而硬件FPU只需1个周期。这意味着在100MHz下,一次乘法从可能超过500ns缩短到10ns。整个FOC算法循环包含多次这样的运算,FPU带来的性能提升是颠覆性的,它使得在更高PWM频率(如20kHz)下运行复杂的控制算法成为可能,从而获得更平滑的转矩和更低的噪音。

注意:虽然KV31F包含FPU,但在编译器设置中务必启用硬件FPU支持(例如在Keil或IAR中勾选Use Single Precision)。否则,编译器仍会调用软件浮点库,无法发挥硬件性能。

2.2 电机控制脉宽调制模块:FlexPWM

这是KV31F的“王牌”外设。它并非普通的通用定时器,而是专为驱动三相桥臂而设计的复杂PWM发生器。

2.2.1 核心特性与工作模式该模块提供了多达12路PWM输出(取决于具体型号和引脚复用),这些输出被组织在多个子模块中,每个子模块有独立的计数器。对于三相全桥驱动,我们通常使用3对互补通道(即6路PWM)。FlexPWM的强大之处在于:

  • 互补输出与死区插入:可以轻松配置一对输出(如PWM_A和PWM_B)为互补模式,并硬件插入可编程的死区时间。死区时间是为了防止同一桥臂的上、下管同时导通造成短路,这个时间通常根据功率管的开关特性在几百纳秒到几微秒之间。硬件死区生成极大地减轻了CPU负担,也保证了时序的绝对精确。
  • 故障保护输入:模块支持多个故障输入引脚。当外部保护电路(如过流比较器)触发故障信号时,FlexPWM能在几个纳秒内将所有PWM输出强制设置为安全状态(通常全部拉高或拉低),实现硬件级的快速关断,这对于保护功率器件至关重要。
  • 中央对齐与边沿对齐:支持这两种PWM模式。在电机控制中,中央对齐(对称)模式更为常用,因为它能产生对称的PWM波形,有助于减少电流谐波和电机噪音。
  • 双缓冲寄存器:允许在下一个PWM周期开始前更新占空比,避免了在PWM周期中间更新寄存器可能导致的脉冲畸形,确保了控制输出的平滑性。

2.2.2 配置实战:生成三相SVPWM波形假设我们要生成20kHz的PWM频率,系统时钟为100MHz。

  1. 计算重装载值:对于中央对齐模式,PWM频率 = 系统时钟 / (2 * PWM_MOD)。因此,PWM_MOD = 系统时钟 / (2 * PWM频率) = 100MHz / (2 * 20kHz) = 2500。
  2. 初始化子模块:配置计数器为中央对齐模式,设置MOD寄存器为2500。
  3. 配置通道:将三个子模块的A、B通道配对设置为互补模式。使能死区插入,根据MOSFET的规格设置死区时间寄存器DTCNT0DTCNT1。例如,如果死区时间需要200ns,系统时钟为100MHz(周期10ns),则DTCNT值应设置为20。
  4. 更新占空比:在FOC算法中,我们计算出三相电压的占空比(DutyA, DutyB, DutyC)。将这些值写入对应通道的比较值寄存器VAL1。由于采用了双缓冲,写入操作会在下一个PWM周期生效。
  5. 故障保护配置:将外部过流比较器的输出连接到指定的故障输入引脚,并在FlexPWM中配置该故障输入,设置故障发生时所有输出强制为高阻态或固定电平。
// 示例:FlexPWM子模块初始化代码框架(基于NXP SDK) pwm_config_t pwmConfig; PWM_GetDefaultConfig(&pwmConfig); pwmConfig.prescale = kPWM_Prescale_Divide_1; // 不分频 pwmConfig.reloadLogic = kPWM_ReloadPwmFullCycle; // 全周期重载 pwmConfig.clockSource = kPWM_BusClock; // 时钟源选择 pwmConfig.enableDebugMode = false; PWM_Init(PWM1, kPWM_Module_0, &pwmConfig); // 初始化子模块0 // 配置PWM通道为互补模式并插入死区 pwm_signal_param_t pwmSignal[3]; pwmSignal[0].pwmChannel = kPWM_PwmA; pwmSignal[0].dutyCyclePercent = 50.0f; // 初始占空比 pwmSignal[0].deadtimeValue = 200; // 死区时间,单位ns pwmSignal[0].pwmLevel = kPWM_HighTrue; pwmSignal[0].faultState = kPWM_PwmFaultState0; // 故障状态 // 类似配置PwmB和另一个子模块的通道... PWM_SetupPwm(PWM1, kPWM_Module_0, pwmSignal, 3, kPWM_CenterAligned, 20000, PWM_SRC_CLOCK_FREQ);

2.3 高精度模拟数字转换器:双16位ADC

KV31F集成了两个独立的16位逐次逼近型(SAR)ADC模块,每个最高采样率可达1.2 MSPS(在12位模式下)。在电机控制中,它们主要用于:

  • 相电流采样:通常使用两个采样电阻接入电机驱动器的下桥臂,或使用霍尔电流传感器。两个ADC可以配置为硬件触发同步采样,精确捕获同一时刻的两相电流,第三相电流可通过基尔霍夫定律计算得出(Ia + Ib + Ic = 0)。这种同步性对FOC算法的准确性极为关键。
  • 直流母线电压采样:用于过压、欠压保护以及电压前馈补偿。
  • 温度、位置传感器信号采样

2.3.1 同步采样与硬件触发配置为了实现高精度的电流采样,必须让ADC的采样时刻与PWM中心点对齐(对于中央对齐PWM),以避开功率管开关瞬间的噪声干扰。

  1. 触发源:将FlexPWM的子模块计数器与ADC的硬件触发输入关联。例如,可以配置当PWM计数器达到谷底(中央对齐模式的中心点)时,产生一个触发信号给ADC。
  2. 同步采样:配置ADC_A和ADC_B使用同一个硬件触发信号启动转换。在ADC配置中,设置相同的采样窗口和转换时间。
  3. DMA传输:为了不占用CPU时间,配置DMA在ADC转换完成后自动将结果搬运到指定的内存数组(例如adcResultBuffer[2])。CPU只需在控制循环中读取这个数组即可。
// 示例:配置ADC硬件触发同步采样(框架) adc_config_t adcConfig; ADC_GetDefaultConfig(&adcConfig); adcConfig.clockSource = kADC_ClockSourceAlt; // 选择时钟源 adcConfig.clockDivider = kADC_ClockDivider2; // 分频,满足转换时间要求 adcConfig.resolution = kADC_Resolution12Bit; // 12位模式 ADC_Init(ADC1, &adcConfig); // 配置硬件触发,例如来自PWM ADC_EnableHardwareTrigger(ADC1, true); ADC_SetHardwareTriggerSource(ADC1, kADC_HardwareTriggerSource0); // 选择触发源,需与PWM输出关联 // 配置DMA adc_dma_config_t dmaConfig; dmaConfig.enableDMA = true; dmaConfig.dmaChannel = 0; // 分配DMA通道 ADC_EnableDMA(ADC1, &dmaConfig);

实操心得:ADC的采样精度极易受到电源噪声和开关噪声的影响。务必在硬件上做好模拟部分的隔离:为VDDA使用独立的LDO供电,并紧靠芯片引脚放置10uF和100nF的退耦电容。采样电阻的走线要短而粗,并使用差分走线方式连接到ADC输入引脚,必要时在信号入口添加RC低通滤波(需计算相位延迟)。

2.4 通信接口:系统连接的桥梁

KV31F提供了丰富的通信外设,用于构建完整的控制系统:

  • UART:通常用于与上位机调试软件通信,打印日志、参数,或接收简单的控制指令。KV31F有多个UART,可以将其中一个用于调试,另一个用于连接蓝牙或Wi-Fi模块。
  • SPI:高速接口,可用于连接外部高精度ADC、DAC、Flash存储器或数字隔离器。在一些对电流采样精度要求极高的场合,可能会外接Σ-Δ型ADC,并通过SPI读取数据。
  • I2C:用于连接EEPROM(存储电机参数、用户设置)、温度传感器或OLED显示屏等低速外设。

在电机控制系统中,通信的实时性要求不如控制环路高,但可靠性必须保证。特别是UART调试接口,是开发阶段排查问题的生命线。建议在软件中实现一个非阻塞的、基于环形缓冲区的串口收发驱动,避免因打印日志而阻塞关键的中断服务程序。

3. 硬件设计要点与电源管理策略

3.1 电源架构设计

KV31F的电源设计是系统稳定性的根基。芯片工作电压范围为1.71V至3.6V,典型使用3.3V。其电源引脚包括:

  • VDD / VSS:数字核心电源。
  • VDDA / VSSA:模拟部分电源(ADC、DAC、比较器、内部参考电压)。这是关键!必须与数字电源分开,即使最终使用同一个3.3V LDO,也必须在PCB上通过磁珠或0Ω电阻进行隔离,并分别布置退耦电容网络。理想的方案是使用独立的低噪声LDO为VDDA供电。
  • VBAT:为RTC和部分低功耗模式下需要保持的寄存器供电。如果不需要保持功能,应将其连接到VDD。

推荐电源方案

  1. 输入电源(如24V)通过DC-DC降压至5V。
  2. 使用两颗低压差线性稳压器(LDO),一颗用于VDD(如AMS1117-3.3),另一颗专用于VDDA(如TLV70433)。LDO的噪声和PSRR指标对ADC性能有直接影响。
  3. 在每个电源引脚附近,严格按照数据手册建议,放置容量递减的电容:例如,一个10uF的钽电容或陶瓷电容,并联一个100nF和一个10nF的陶瓷电容,分别滤除低频、中频和高频噪声。

3.2 时钟系统配置

KV31F的时钟源灵活,为不同性能与功耗需求提供了选择:

  • 外部晶振:主晶振(3-32 MHz)提供高精度时钟源,是运行在100MHz高性能模式的基础。外部32.768kHz晶振可用于RTC,实现精确计时和低功耗唤醒。
  • 内部时钟:包含48 MHz、4 MHz和32 kHz的内部RC振荡器。在不需要高精度定时或对成本极度敏感的应用中,可以使用内部时钟,省去外部晶振。48MHz IRC可用于USB功能,4MHz和32kHz IRC则用于低功耗模式。

电机控制应用的典型时钟树配置

  1. 高性能模式:使用外部8MHz晶振,通过片内锁相环(PLL)倍频至100MHz,作为系统核心时钟(fSYS)。总线时钟(fBUS)通常设为50MHz,Flash时钟(fFLASH)设为25MHz(需注意Flash访问等待周期的配置)。
  2. 低功耗模式:在电机待机或停止时,可切换到非常低功耗运行(VLPR)模式。此时使用内部4MHz或32kHz时钟,系统频率大幅降低,功耗可降至毫安甚至微安级。当需要重新启动电机时,再快速切换回高性能模式。

3.3 PCB布局布线注意事项

电机驱动板是数字、模拟、大功率电路的混合体,布局布线至关重要:

  1. 分区布局:将PCB清晰地划分为功率区(MOSFET、驱动IC、电流采样)、模拟区(运放、ADC滤波电路)、数字区(MCU、通信接口)和电源区。各区之间用地平面或开槽进行隔离。
  2. 电流采样回路:采样电阻的走线必须采用开尔文连接(四线制),将电流信号以差分形式直接引至ADC输入引脚或运放输入端,路径尽可能短,并远离高频开关节点。
  3. 地平面处理:采用单点接地或分地策略。通常将功率地(PGND)和信号地(AGND/DGND)在一点连接,例如在电源输入电容的负端。确保模拟地路径干净,不被数字地的大电流污染。
  4. 去耦电容:如前所述,MCU的每个电源引脚都必须有就近的退耦电容。特别是VDDA的退耦电容,其接地端应直接连接到安静的模拟地平面。
  5. PWM输出驱动:MCU的PWM输出引脚到栅极驱动IC的输入路径应短,并考虑串联一个小电阻(如22-100欧姆)以减缓边沿,减少振铃和EMI。

4. 软件开发框架与电机控制算法实现

4.1 开发环境与驱动库

NXP为Kinetis系列提供了完善的软件开发套件(SDK),其中包含外设驱动库(Driver)、硬件抽象层(HAL)以及丰富的示例代码。对于初次接触的开发者,强烈建议从SDK开始,它可以快速搭建项目框架,避免从寄存器层面直接操作的繁琐和易错。

开发流程

  1. 安装工具链:如Keil MDK、IAR Embedded Workbench或MCUXpresso IDE。
  2. 使用MCUXpresso Config Tools:这是一个图形化配置工具,可以直观地配置引脚复用、时钟树、外设参数(如PWM频率、ADC采样),并自动生成初始化代码。这对于配置像KV31F这样外设复杂的MCU来说,效率提升巨大。
  3. 导入SDK示例:SDK中通常包含电机控制相关的示例工程,例如基于PMSM或BLDC的FOC示例。这些是极好的学习起点。

4.2 电机控制软件架构

一个典型的FOC软件架构包含以下层次:

  1. 硬件抽象层:基于SDK驱动,封装PWM、ADC、GPIO、定时器、通信等底层硬件操作。提供统一的接口,如PWM_SetDutyCycle()ADC_ReadPhaseCurrents()
  2. 电机驱动层:实现具体的电机控制算法。核心是一个定时中断服务程序(ISR),其执行频率通常是PWM频率的1倍或2倍(如20kHz或40kHz)。在这个中断中,按顺序执行:
    • ADC数据读取与处理:从DMA缓冲区读取同步采样的电流值,进行偏移校正、标定。
    • 位置/速度反馈获取:从编码器接口或霍尔传感器读取位置信息,计算电角度和转速。
    • Clarke变换:将三相静止坐标系下的电流(Ia, Ib)转换为两相静止坐标系下的电流(Iα, Iβ)
    • Park变换:将(Iα, Iβ)转换为随转子旋转的两相旋转坐标系下的直轴电流Id和交轴电流IqId用于控制磁场(通常设为零),Iq直接控制转矩。
    • PI调节器:对IdIq的误差分别进行PI运算,输出旋转坐标系下的电压VdVq
    • 逆Park变换:将(Vd, Vq)转换回两相静止坐标系下的(Vα, Vβ)
    • 空间矢量脉宽调制:将(Vα, Vβ)转换为三相占空比信号(DutyA, DutyB, DutyC)
    • 更新PWM占空比:将计算出的占空比写入FlexPWM的比较寄存器。
  3. 应用层:处理速度指令给定、启停控制、故障处理、参数整定、与上位机通信等逻辑。这部分通常在主循环中运行,或由更低优先级的定时器/中断触发。

4.3 关键算法模块实现细节

4.3.1 速度与位置估算对于无传感器FOC,需要在中断中运行观测器算法(如滑模观测器、龙贝格观测器或模型参考自适应)来估算反电动势,进而计算转子位置和速度。这对CPU算力要求较高,KV31F的M4内核和FPU在此大显身手。

4.3.2 PI参数整定电流环PI参数直接影响系统的动态响应和稳定性。一个实用的“试凑法”步骤是:

  1. 先将IqId的积分项Ki设为0。
  2. 逐步增大比例项Kp,直到电机启动时电流响应迅速但有轻微超调或振荡。
  3. 然后逐步加入较小的Ki,以消除静差。Ki太大会引起低频振荡。
  4. 使用阶跃响应或在线调试工具观察波形,微调参数。速度环的PI参数整定类似,但带宽应远低于电流环(通常低一个数量级)。

避坑指南:在中断服务程序中,避免使用浮点数除法、sqrt()sin()/cos()等耗时函数。对于sin/cos,可以使用查找表(LUT)或CORDIC算法进行优化。对于SVPWM中的一些常数运算,可以提前计算好并存储为常量。

5. 调试技巧与常见问题排查

5.1 调试工具与方法

  1. 实时变量观测:利用IDE的实时变量查看功能,或通过SWD/JTAG接口,可以实时观察关键变量(如IqIq_ref, 速度, 角度)的变化。这对于调试控制环路至关重要。
  2. 串口打印:在非时间关键路径(如应用层)使用串口打印状态和错误信息。注意使用格式化输出(如printf)会消耗大量时间和资源,在中断中绝对禁止使用。
  3. GPIO引脚调试:在关键代码段(如ADC中断入口、FOC计算开始和结束)用GPIO引脚输出高低电平,然后用示波器测量脉冲宽度,可以精确测量代码段的执行时间,确保满足实时性要求。
  4. 逻辑分析仪:用于抓取多路PWM波形、ADC触发信号、编码器信号等,验证硬件时序是否正确。

5.2 常见问题与解决方案

问题1:电机启动抖动或无法启动。

  • 排查
    • 相位顺序:检查电机UVW三相线与驱动板输出顺序是否匹配。交换任意两相线试试。
    • 电流采样极性:确认电流采样电路的放大倍数和偏置电压正确,采样值在ADC量程内且随电流变化方向正确。如果极性反了,会导致正反馈,系统失稳。
    • 转子初始位置:对于无传感器启动,初始位置估算不准会导致启动失败。可以尝试先进行“对齐”操作:强制给一个固定的电压矢量,将转子拉到一个已知位置。
    • PI参数KpKi值可能过大或过小。从非常小的Kp开始,逐步增加。

问题2:电机运行有异常噪音或振动。

  • 排查
    • PWM死区时间:死区时间不足会导致上下管直通,过大则会导致输出波形畸变,引起转矩脉动。用示波器测量同一桥臂的上下管驱动信号,确保有正确的死区间隔。
    • ADC采样点:确保ADC在PWM周期的“安静”时刻(如中央对齐模式的中心点或下溢点)触发采样,避开开关噪声。
    • SVPWM算法:检查SVPWM扇区判断和矢量作用时间计算是否正确。一个常见的错误是占空比计算溢出或符号错误。
    • 速度环PI参数:速度环带宽过高或积分饱和会引起振荡。适当降低KpKi

问题3:ADC采样值跳动大,控制不稳定。

  • 排查
    • 硬件滤波:在ADC输入引脚增加RC低通滤波(如1kΩ + 100pF),截止频率需远高于控制带宽(如1kHz),同时计算其带来的相位延迟是否可接受。
    • 软件滤波:对ADC采样值进行软件滤波,如移动平均滤波或一阶低通滤波。
    • 电源噪声:用示波器探头(带宽限制到20MHz)直接测量VDDA引脚,观察是否有明显的开关噪声。加强电源退耦。
    • 地线干扰:检查电流采样回路的地线是否被功率地的大电流污染。

问题4:系统偶尔死机或跑飞。

  • 排查
    • 看门狗:务必启用独立看门狗(IWDG)或窗口看门狗(WWDG),并在主循环和关键任务中及时“喂狗”。这是应对软件跑飞的最后防线。
    • 堆栈溢出:检查在中断中是否分配了大数组或进行了深度递归调用。调整启动文件中的堆栈(Stack)和堆(Heap)大小。
    • 中断冲突:确保高优先级的中断(如PWM周期中断、ADC完成中断)服务程序执行时间足够短,不会阻塞其他重要中断。
    • EMC问题:强电磁干扰可能导致MCU复位。检查PCB布局,强电与弱电隔离是否良好,关键信号线是否尽可能短,时钟线是否包地。

开发基于KV31F的电机控制系统,是一个软硬件深度结合的过程。从精准的硬件设计到高效的软件实现,每一个环节都考验着工程师对细节的把握。这颗芯片提供的丰富外设和充足性能,为实现高性能、高可靠性的电机驱动方案打下了坚实的基础。在实际项目中,耐心调试、逐步迭代,并善用芯片提供的所有调试手段,是成功的关键。

http://www.rkmt.cn/news/1493997.html

相关文章:

  • MPV_lazy终极指南:打造你的专属Windows播放器配置方案
  • 嵌入式MCU电气规格深度解析:从Flash、ADC到通信接口的实战避坑指南
  • TensorFlow Callbacks深度解析:训练监控与自动干预实战指南
  • i.MX RT500接口时序实战:从SWD调试到高速通信的硬件设计指南
  • 【控制】基于DQN的控制器和VTOL植株的SIMULINK模型matlab代码
  • 别再傻傻点鼠标了!OptiSystem 这10个快捷键,让你仿真效率翻倍(附避坑指南)
  • 破解风机盘管温控器适配难题:3A全域适配方法论如何实现高效节能管控? - 资讯快报
  • Kinetis K22F低功耗模式下I2S/SAI时序参数深度解析与实战
  • Linux内核学习轨迹第六部:VFS四大核心对象:super_block/inode/dentry/file(第二节)
  • 嵌入式系统设计实战:从K20数据手册电气规格到稳定硬件实现
  • 嵌入式低功耗设计实战:从KL33数据手册解读到系统级优化
  • K20外设时序深度解析:从SPI、I2C到SDHC的实战配置与调试
  • 别再只盯着CVE-2019-8451了:手把手教你用Burp Suite复现Jira SSRF漏洞(附环境搭建避坑指南)
  • C++多线程--条件变量
  • 手把手调试 RuoYi-Vue-Plus 数据权限:用IDEA断点摸清 PlusDataPermissionInterceptor 的完整工作流
  • 从数据手册到设计实战:KL15微控制器电气特性深度解读与低功耗优化指南
  • 门窗装修避坑指南:从选购到安装,一站式杜绝翻车(长沙南山世博特版) - 涂伟
  • 2026年6月蜂窝板吊顶厂家推荐:铝扣板/集成吊顶/客厅吊顶,家装与工程实力品牌深度解析! - 品牌推荐用户报道者
  • LLM数据注入攻击全景解析:从训练投毒到RAG劫持的四层攻防实战
  • MC68HC908AT32 SPI与TIMA-4定时器寄存器配置与实战应用详解
  • 探寻宜春高纯石英粉源头厂家的神秘面纱 - GrowthUME
  • 2026南昌冰淇淋蓝莓寿司门店排行:鲜度与创意实测 - 奔跑123
  • 商家小程序怎么做
  • 保姆级教程:用MMSegmentation+UperNet+Swin-T搞定停车场场景语义分割(附完整代码与数据集)
  • 量子传感新突破:GQSPI框架解决非对称信号检测难题
  • 30K+ AI产品经理进阶指南:4个月从0到实战,掌握大模型调优核心技能!2026年AI产品经理学习路线
  • Visio 2021从入门到放弃?不!这5个隐藏功能让你画图效率翻倍(附实战案例)
  • MuleSoft+LLM企业级AI集成:构建可信可审计的AI工作流
  • 5步掌握Beyond Compare 5激活:从密钥生成到永久使用
  • 北京不锈钢橱柜定制厂家排行:工艺与服务核心维度实测 - 奔跑123