1. 项目概述与CMPSS核心价值在搞电机驱动、数字电源或者任何需要实时保护与精密模拟信号监控的嵌入式系统时我们总会遇到一个经典难题如何让微控制器这颗“数字大脑”快速、可靠地感知外部的“模拟世界”比如电机的相电流是否瞬间超过了安全阈值电源的输出电压有没有异常跌落这时候一个高性能的比较器子系统Comparator Subsystem, CMPSS就成了连接数字与模拟世界的守门员。它不是简单的“比大小”电路而是一套集成了可编程参考源DAC、可配置数字滤波器和灵活输出路径的片上系统。最近在调试TI的TMS320F280015x系列MCU它的CMPSS_LITE模块设计得非常精妙寄存器配置逻辑清晰但细节繁多稍有不慎就会导致保护失灵或者误动作。这篇文章我就结合手册和实际调试经验把这套寄存器的里里外外、配置的坑与技巧给大家掰开揉碎了讲清楚。对于TMS320F280015x这类专注于实时控制的MCU而言CMPSS的技术价值直接体现在系统的可靠性和响应速度上。它允许你用内部高精度DAC设定一个或多个电压阈值外部模拟信号比如经过运放调理的电流采样信号与之比较后产生的数字跳变可以直接触发PWM的紧急关断Trip或者作为中断源通知CPU从而实现纳秒级的硬件保护。这比软件ADC采样再判断的方式快了几个数量级在电机堵转、电源短路等故障发生时这几百纳秒的差距可能就是烧毁MOS管和系统安然无恙的区别。CMPSS_LITE作为该系列中的精简版本保留了核心的比较、DAC和滤波功能去掉了部分高级特性如斜坡发生器但其寄存器配置逻辑是相通的掌握了它就掌握了利用硬件比较器进行快速故障保护的核心技能。2. CMPSS_LITE架构与寄存器全景解析要玩转CMPSS_LITE首先得在脑子里建立起它的架构模型。简单来说一个CMPSS_LITE模块包含两个独立的比较器高比较器COMPH和低比较器COMPL。每个比较器都有一个对应的内部DAC数模转换器来提供参考电压以及一个独立的数字滤波器来抑制输入噪声。整个模块的配置就是通过操作一系列内存映射寄存器来完成的。手册里的Table 13-37列出了所有CMPSS_LITE_REGS寄存器我们可以按功能把它们分成几大类这样理解起来更有条理核心控制与状态寄存器这是配置的起点和状态查询的终点。COMPCTL (偏移 0h)比较器总开关、输入源选择、输出反相、输出路径选择的核心控制寄存器。可以说比较器怎么工作基本由它决定。COMPHYSCTL (偏移 1h)迟滞控制寄存器。这是抗干扰的关键通过设置一定的回差电压防止输入信号在阈值附近抖动时输出频繁跳变。COMPSTS (偏移 2h)状态寄存器。只读用于实时读取高/低比较器经过数字滤波后的输出状态COMPxSTS及其锁存值COMPxLATCH。COMPSTSCLR (偏移 3h)状态清除寄存器。用于清除COMPSTS中的锁存状态位或者配置通过EPWM同步周期信号自动清除锁存。内部DAC配置寄存器负责为比较器提供精准的参考电压。COMPDACHCTL (偏移 4h)和COMPDACLCTL (偏移 24h)分别控制高、低DAC。功能包括使能消隐Blank功能、选择消隐信号源、选择同步加载源SYSCLK或EPWMSYNCPER。消隐功能在特定时间段内屏蔽比较器输出常用于避免PWM开关瞬间的噪声干扰。DACHVALS/DACLVALS (偏移 6h/12h)高/低DAC的影子寄存器。我们通常先向这里写入目标DAC值。DACHVALA/DACLVALA (偏移 7h/13h)高/低DAC的活动寄存器。DAC实际输出的电压值由此寄存器决定。影子寄存器的值会在特定同步事件由SWLOADSEL选择发生时自动加载到活动寄存器这实现了无毛刺的DAC值更新。数字滤波器配置寄存器决定如何“净化”比较器的原始输出防止噪声引起误触发。CTRIPHFILCTL/CTRIPLFILCTL (偏移 18h/16h)高/低滤波器控制寄存器。配置滤波器的输入源、采样窗口大小SAMPWIN和投票阈值THRESH。这是实现多数表决滤波算法的核心。CTRIPHFILCLKCTL/CTRIPLFILCLKCTL (偏移 19h/17h)及其扩展寄存器CTRIPxFILCLKCTL2 (偏移 39h/37h)高/低滤波器时钟预分频控制寄存器。它们共同决定滤波器采样时钟的周期即采样周期 (CLKPRESCALE 1) * SYSCLK周期。CTRIPxFILCLKCTL2提供了高8位与CTRIPxFILCLKCTL的低8位组成16位预分频值允许极长的滤波时间。写保护锁寄存器COMPLOCK (偏移 1Ah)锁寄存器。这是一个安全特性可以一次性锁定COMPCTL、COMPHYSCTL、DAC控制寄存器以及滤波器控制寄存器的写访问。一旦相应位置1只有系统复位才能解锁。这可以防止关键配置在程序跑飞时被意外修改。注意所有带有“EALLOW”写保护的寄存器如COMPCTL、COMPHYSCTL等在修改前都需要执行EALLOW指令解锁修改后再用EDIS指令锁定。这是C2000系列MCU保护关键系统配置的标准做法。理解这个寄存器地图就像拿到了一张硬件模块的接线图。接下来我们就要深入每个关键寄存器看看每一根“线”具体该怎么接。3. 核心寄存器详解与配置策略3.1 COMPCTL比较器控制中枢COMPCTL寄存器是配置的“大脑”。它分为高、低比较器对称的两部分我们以低比较器Bit 8-15为例拆解高比较器Bit 0-6完全同理。Bit 15 - COMPDACE比较器/DAC使能作用整个CMPSS模块的总开关。0-禁用1-启用。实操要点务必在配置完所有其他参数后最后才将此位置1。如果先使能比较器而DAC值、滤波器等还未正确配置可能导致不可预知的输出甚至瞬间触发错误保护。我的习惯是在初始化函数的末尾执行使能操作。Bit 14 - ASYNCLEN低比较器异步路径使能作用当CTRIPLSEL或CTRIPOUTLSEL选择为“3”锁存的滤波器输出时此位决定是否将原始的、未经滤波的异步比较器输出与锁存后的滤波器输出进行“或”操作。为什么需要这个这提供了灵活性。例如你可以让滤波器处理常规的、带噪声的阈值判断但同时允许一个极大的、明确的过载信号通过异步路径立即触发保护实现“慢速滤波快速应急”的双重机制。Bit 13-12 - CTRIPOUTLSELCTRIPOUTL信号源选择Bit 11-10 - CTRIPLSELCTRIPL信号源选择作用这两个字段分别选择输出到外部引脚CTRIPOUTL和内部信号CTRIPL的来源。选项都是0-异步比较器输出1-同步比较器输出2-数字滤波器输出3-锁存的数字滤波器输出。关键区别CTRIPL通常是内部使用连接到ePWM模块的Trip-Zone输入用于硬件强制关断PWM。CTRIPOUTL可以映射到GPIO引脚供外部电路或其他外设使用或者用于监控。异步 vs 同步异步输出延迟极小几个纳秒但可能因比较器自身响应和噪声产生毛刺。同步输出在系统时钟SYSCLK边沿采样后输出消除了亚稳态问题但引入一个时钟周期的延迟。滤波器输出 vs 锁存滤波器输出滤波器输出是实时变化的。锁存输出则会在每次EPWMSYNCPER信号或软件清除时更新并在一个PWM周期内保持稳定这对于需要与PWM周期同步的稳定触发信号非常有用。配置策略对于需要最快硬件保护的场景如过流保护我会选择CTRIPLSEL 0异步输出并将CTRIPL直接连接到ePWM的Trip输入实现最快响应。同时设置CTRIPOUTLSEL 2滤波器输出连接到引脚用于软件监控或调试这样既能快速保护又能通过滤波后的信号观察稳定状态。Bit 9 - COMPLINV低比较器输出反相作用0-不反相1-反相。当输入电压 DAC参考电压时比较器原始输出为高。如果你希望低电平表示“超阈”就可以开启反相。常见应用在低侧电流采样中采样电阻的电压通常与电流成正比。我们希望电流超过设定值时产生一个高电平触发信号。如果DAC设定的是上限阈值那么当采样电压比较器正端高于DAC电压负端时原始输出为高符合直觉无需反相。Bit 8 - COMPLSOURCE低比较器输入源选择作用0-反相输入端-连接内部DAC同相输入端连接外部引脚。1-反相输入端-连接外部引脚同相输入端连接内部DAC。重要提示这个选择极其重要它决定了比较的逻辑。通常我们把需要监控的外部信号接在比较器的正端把内部DAC设定的阈值接在负端-。这样当外部信号超过阈值时输出为高。因此最常见的配置是COMPLSOURCE 0即外部信号从正端输入DAC接负端。3.2 COMPHYSCTL让比较器“沉稳”起来比较器在面对噪声时很容易“发抖”即在阈值附近产生一连串的脉冲输出。COMPHYSCTL寄存器就是用来解决这个问题的它通过引入迟滞Hysteresis。Bit 3-0 - COMPHYS迟滞设置作用设置迟滞电压的大小。0-无迟滞1-典型迟滞值2-2倍典型值3-3倍4-4倍。工作原理假设DAC设定阈值Vref为1.0V典型迟滞电压Vhys为10mV。当输出为低时实际触发翻转的阈值是Vref Vhys 1.01V。一旦输出翻转为高要再次翻转为低的阈值就变成了Vref - Vhys 0.99V。这就形成了一个“死区”信号必须变化超过2*Vhys20mV才能改变输出状态有效抑制了噪声。配置心得迟滞值不是越大越好。你需要根据输入信号的最大噪声峰值来设定。例如信号噪声大约±5mV那么选择1倍典型迟滞如果典型值是10mV通常就够了。如果迟滞设得太大比如4倍40mV可能会掩盖真实的小幅度信号波动。在电机控制中我通常从1倍开始用示波器观察CTRIPOUT信号在阈值附近的稳定性再进行调整。3.3 DAC配置寄存器设定精准的裁判线内部DAC是CMPSS的“标尺”。它的配置相对直接但有几个细节需要注意。DAC值寄存器DACxVALS / DACxVALA影子与活动寄存器机制这是保证DAC输出无毛刺的关键。你向DACxVALS写入新值这个值不会立即生效。只有当特定的加载事件发生时由COMPDACxCTL.SWLOADSEL选择DACxVALS的值才会同步到DACxVALA从而改变实际的DAC输出电压。加载事件选择SWLOADSEL0 - SYSCLK在每次对DACxVALS执行写操作后经过一个SYSCLK周期值被加载。这适用于需要随时快速更新阈值的场景。1 - EPWMSYNCPER在EPWMSYNCPER信号的上升沿加载。这是最常用、最安全的方式尤其是在电机控制和电源应用中。它可以确保DAC值的更新与PWM周期严格同步避免在PWM周期中间改变阈值导致不可预测的比较结果。你需要通过RAMPSOURCE字段为这个DAC选择合适的EPWMSYNCPER源。DAC数值计算DAC是12位的0-4095。其输出电压公式通常为Vdac (DAC_VAL / 4095) * Vdac_ref。其中Vdac_ref是DAC的参考电压需要查阅芯片数据手册的电气特性章节。例如如果Vdac_ref 3.0V要设置1.5V的阈值则DAC_VAL (1.5 / 3.0) * 4095 ≈ 2047。消隐控制BLANKEN, BLANKSOURCE作用在特定的时间段内强制将比较器输出置为无效状态通常为低这个时间段由EPWM模块的BLANK信号定义。为什么需要消隐在PWM开关特别是上管开通的瞬间功率回路中会产生很大的电压尖峰和噪声可能通过采样电路耦合到比较器输入端导致比较器误触发。消隐功能就是在已知的噪声窗口内暂时“捂住”比较器的耳朵。配置使能BLANKEN并通过BLANKSOURCE选择一个EPWM模块的BLANK输出信号。这个BLANK信号的宽度需要在对应的ePWM模块中配置好使其覆盖开关噪声的持续时间。3.4 数字滤波器寄存器软件实现的硬件抗抖数字滤波器是CMPSS的“软件降噪”核心采用多数表决Majority Vote算法。CTRIPxFILCTL寄存器FILINIT (Bit 15)滤波器初始化。写1会将滤波器内部的所有采样值立即初始化为当前滤波器的输入值。这个操作非常有用。在使能滤波器或改变滤波器参数前先进行初始化可以避免滤波器从不确定的历史状态开始工作导致初始输出错误。THRESH (Bit 14-9)表决阈值。这是滤波器的核心参数。它定义了在采样窗口内需要有多少个相反状态的样本出现滤波器的输出才会改变状态。实际使用的阈值是 THRESH 1。例如THRESH设置为4则需要至少5个相反状态的样本输出才会翻转。SAMPWIN (Bit 8-3)采样窗口大小。定义了每次进行多数表决时观察的连续样本数量。实际窗口大小是 SAMPWIN 1。FILTINSEL (Bit 2-0)滤波器输入选择。通常选择0即使用对应比较器的输出作为滤波输入。也可以选择外部数字信号这提供了将其他数字逻辑信号接入CMPSS滤波器进行滤波的可能性。CTRIPxFILCLKCTL寄存器CLKPRESCALE (Bit 15-0)采样时钟预分频值。滤波器采样时钟周期 (CLKPRESCALE 1) * T_sysclk。这个值决定了滤波器的“反应速度”。CLKPRESCALE越大采样间隔越长滤波器对慢速噪声的抑制越好但对真实信号变化的响应也越慢。滤波器配置实战计算假设系统时钟SYSCLK为100MHz周期10ns我们需要滤除宽度小于1us的噪声脉冲。确定采样周期为了捕捉到1us的噪声采样周期必须小于噪声宽度。我们选择采样周期为200ns即采样频率5MHz。那么CLKPRESCALE (200ns / 10ns) - 1 19。确定采样窗口我们希望只有在噪声持续一定时间后才认为它是有效信号。假设需要连续采样5个点。则SAMPWIN 5 - 1 4。这意味着滤波器会维护一个包含5个连续样本的窗口。确定表决阈值我们要求窗口内绝大多数样本状态一致才改变输出。设定为需要至少4个相同样本才翻转。则THRESH 4 - 1 3。 这样一个宽度小于200ns * (5-3)400ns的噪声脉冲即样本数不足4个就会被滤波器滤除。而一个持续1us5个样本的有效信号变化则能通过滤波器。避坑指南滤波器的延迟 SAMPWIN * (CLKPRESCALE1) * T_sysclk。在上述例子中延迟最大约为4 * 20 * 10ns 800ns。在计算硬件保护响应时间时必须将这个滤波延迟考虑进去。如果系统要求保护响应时间极短如500ns你可能需要减小SAMPWIN或CLKPRESCALE或者考虑使用异步路径CTRIPxSEL0并配合适当的迟滞来抗噪。4. 从寄存器到代码实战配置流程与DriverLib应用理解了寄存器最终要落地到代码。TI提供了DriverLib库函数它封装了寄存器操作让配置更直观、更不易出错。手册的Table 13-56和13-57给出了寄存器与DriverLib函数的映射关系非常实用。下面我以一个典型的电机相电流过流保护配置为例展示完整的配置流程。场景使用CMPSS1的低比较器监控电机相电流内部DAC设定阈值使用数字滤波输出CTRIPL1连接到ePWM1的Trip Zone实现硬件关断。4.1 初始化步骤与代码示例#include driverlib.h #include device.h void CMPSS1_ConfigForOverCurrentProtection(void) { // 步骤1解锁EALLOW保护寄存器 EALLOW; // 步骤2配置GPIO引脚为模拟比较器输入功能假设电流采样信号接在CMP1A引脚 // 具体GPIO配置请参考数据手册的引脚复用表此处为示例。 // GPIO_setPinConfig(GPIO_0_CMPSS1A); // 示例函数 // 步骤3配置低比较器控制 (COMPCTL) // 输入源外部信号从正端输入DAC接负端 (COMPLSOURCE 0) // 输出不反相 (COMPLINV 0) // CTRIPL源选择数字滤波器输出 (CTRIPLSEL 2) // CTRIPOUTL源也选择滤波器输出用于监控 // 异步路径暂时禁用 // 注意先不使能模块 (COMPDACE 0) CMPSS_configLowComparator(CMPSS1_BASE, CMPSS_NEGATIVE_INPUT_DAC, // 负端接DAC CMPSS_POSITIVE_INPUT_PIN, // 正端接外部引脚 false); // 输出不反相 CMPSS_configOutputsLow(CMPSS1_BASE, CMPSS_TRIP_FILTER, // CTRIPL来自滤波器 CMPSS_TRIP_FILTER); // CTRIPOUTL来自滤波器 // 步骤4配置迟滞 (COMPHYSCTL) // 根据噪声水平选择2倍典型迟滞 CMPSS_setHysteresis(CMPSS1_BASE, CMPSS_HYSTERESIS_2X); // 步骤5配置低DAC (COMPDACLCTL, DACLVALS) // 5.1 配置DAC控制使能EPWMSYNCPER同步加载选择EPWM1作为同步源 CMPSS_configDACLow(CMPSS1_BASE, CMPSS_DAC_LOAD_ON_EPWMSYNCPER, // SWLOADSEL 1 CMPSS_DAC_SYNC_EPWM1, // RAMPSOURCE 0 (EPWM1SYNCPER) CMPSS_DAC_VALUE_SYSDIV1, // DAC时钟分频保持默认 CMPSS_DAC_REF_VDDA, // DAC参考电压选择VDDA false); // 不使能消隐后续单独配置 // 5.2 设置DAC阈值电压对应的数字值 (假设VDDA3.3V阈值电压1.65V) // DAC值 (1.65V / 3.3V) * 4095 2047.5 ≈ 2047 uint16_t dacValue 2047; CMPSS_setDACValueLow(CMPSS1_BASE, dacValue); // 写入影子寄存器DACLVALS // 步骤6配置数字滤波器 (CTRIPLFILCTL, CTRIPLFILCLKCTL) // 6.1 初始化滤波器内部状态 CMPSS_initFilterLow(CMPSS1_BASE); // 6.2 配置滤波器参数采样窗口45个样本阈值3需4个相同样本时钟预分频19200ns 100MHz CMPSS_configFilterLow(CMPSS1_BASE, 19, 4, 3); // (clkprescale, sampwin, thresh) // 步骤7可选配置消隐功能假设需要EPWM1的BLANK信号 // 首先需要在对应的ePWM1模块中配置好BLANK信号的产生此处仅使能CMPSS的消隐接收。 CMPSS_configBlankingSourceLow(CMPSS1_BASE, CMPSS_BLANKING_SOURCE_EPWM1); CMPSS_enableBlankingLow(CMPSS1_BASE); // 步骤8配置状态锁存清除方式 (COMPSTSCLR) // 选择在EPWMSYNCPER信号到来时自动清除锁存状态便于每个PWM周期重新评估 CMPSS_enableLatchResetOnPWMSYNCLow(CMPSS1_BASE); // 步骤9最后使能整个CMPSS1模块 CMPSS_enableModule(CMPSS1_BASE); // 步骤10锁定寄存器防止误写根据安全需求可选 // 例如锁定比较器控制和滤波器配置 // HWREGH(CMPSS1_BASE CMPSS_O_COMPLOCK) | (CMPSS_COMPLOCK_COMPCTL | CMPSS_COMPLOCK_CTRIP); // 步骤11重新锁定EALLOW保护 EDIS; // 步骤12配置ePWM1的Trip-Zone子模块将CMPSS1的CTRIPL1作为其触发源之一并配置为高电平有效触发CBC周期逐波限流或OST单次触发保护。 // 此部分属于ePWM配置此处省略。通常使用EPWM_enableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_CMPSS1);等函数。 }4.2 关键操作与调试技巧配置顺序很重要遵循“先静态后动态先参数后使能”的原则。即先配置DAC值、滤波器参数、输入输出选择等静态参数最后再打开模块使能COMPDACE和可能用到的同步触发。错误的顺序可能导致短暂的非预期输出。善用影子寄存器对于DAC值DACxVALS和滤波器的SAMPWIN/THRESH等参数修改后需要等待同步事件生效。在调试时如果你修改了DAC值但发现比较阈值没变检查一下SWLOADSEL配置和同步信号EPWMSYNCPER是否正常。状态监控与清除在中断服务程序或主循环中可以通过CMPSS_getStatus(CMPSS1_BASE)读取COMPSTS寄存器获取COMPHSTS/COMPLSTS当前滤波输出和COMPHLATCH/COMPLLATCH锁存输出的状态。使用CMPSS_clearFilterLatchLow(CMPSS1_BASE)可以手动清除锁存位。使用CTRIPOUT引脚调试将CTRIPOUTL/H映射到GPIO引脚用示波器观察是调试CMPSS行为最直观的方法。你可以看到原始比较器输出、滤波后输出、消隐效果等一目了然。5. 常见问题排查与实战心得在实际项目中配置CMPSS时难免会遇到一些“坑”。下面是我总结的几个典型问题及排查思路。问题1比较器似乎没有输出或者输出常高/常低。排查清单电源和引脚确认模拟比较器所需的模拟电源VDDA和地VSSA是否稳定。确认输入信号引脚已正确配置为模拟功能而非数字GPIO。模块使能检查COMPCTL寄存器的COMPDACE位是否已设置为1。DAC配置确认DAC已使能COMPDACE1也包含了DAC。用万用表测量DAC输出引脚如果芯片引出电压或通过ADC读取内部测试点验证DAC值是否已正确加载到活动寄存器DACxVALA。检查SWLOADSEL和同步信号。输入源选择确认COMPxSOURCE位设置正确。最常见的错误是信号接反了。如果你的信号接在CMPx_A引脚通常应配置为COMPxSOURCE0正端输入。输出路径选择确认CTRIPxSEL和CTRIPOUTxSEL选择的信号源是否是你期望观察的例如是原始输出还是滤波后输出。你可能配置为观察滤波器输出但滤波器参数过于苛刻导致无输出。问题2数字滤波器没有达到预期的滤波效果仍有毛刺。排查思路参数计算错误重新核算CLKPRESCALE、SAMPWIN和THRESH的值。记住公式实际窗口大小 SAMPWIN 1实际翻转阈值 THRESH 1。确保采样周期由CLKPRESCALE决定远小于噪声宽度而窗口大小和阈值足以覆盖噪声持续时间。时钟问题确认SYSCLK频率与你计算时假设的一致。滤波器未初始化在使能或重配置滤波器前没有执行CMPSS_initFilter操作导致滤波器内部状态是随机的。务必在配置后或使能前初始化。输入信噪声过大滤波算法只能抑制一定宽度和幅度的噪声。如果噪声本身幅度很大或持续时间很长超过了滤波器的抑制能力就需要从硬件上优化采样电路比如增加RC滤波、优化布局布线。问题3消隐功能不起作用在PWM开关时刻仍然误触发。排查步骤消隐使能确认COMPDACxCTL中的BLANKEN位已置1。信号源选择确认BLANKSOURCE选择的EPWM模块是否正确并且该EPWM模块确实产生了BLANK信号。BLANK信号宽度在产生BLANK信号的ePWM模块中检查其死区子模块或事件触发子模块中配置的BLANK脉冲宽度是否足够覆盖开关噪声的持续时间。通常需要根据实际电路用示波器测量来确定。时序对齐确保CMPSS的消隐窗口与PWM开关噪声在时间上是对齐的。这需要仔细规划ePWM各事件的时序。问题4使用DriverLib函数配置后行为与直接写寄存器不一致。可能原因DriverLib函数为了通用性可能会在函数内部执行一些额外的操作或检查。例如某些配置函数可能会在修改配置前自动禁用模块修改后再启用。这可能导致短暂的配置窗口期。建议在时序要求极其苛刻的场合或者需要精确控制配置顺序时在理解寄存器的基础上直接操作寄存器可能是更可靠的选择。使用DriverLib时仔细阅读其函数说明了解其副作用。调试时可以单步执行并随时读取相关寄存器值确认配置是否按预期写入。个人心得CMPSS是一个强大的硬件外设但它的强大建立在精细的配置之上。我的习惯是在系统初始化阶段用一个专门的函数来配置CMPSS并且为每个CMPSS实例的配置添加详细的注释说明其用途、阈值电压、滤波参数设计依据等。在调试阶段一定要把CTRIPOUT信号引出来用示波器看这是最直接的调试手段。同时结合CPU读取状态寄存器在软件里做二次判断或记录可以构建起从硬件快速保护到软件精细管理的多层次保护体系。记住没有一劳永逸的参数所有的阈值、迟滞、滤波时间常数都需要在你的实际硬件和负载环境下进行最终测试和微调。