
刚把这块样板跑稳的时候我心里其实挺感慨的。DRV8818PWPR 这颗驱动芯片配上 STM32F401RB 这颗控制器应该是很多做工业控制、小型机器人平台的朋友最先接触的组合之一。原因很直白DRV8818 是 TI 一颗很经典的、支持最高 2.5A 峰值电流的双极步进电机驱动封装是 HTSSOP带散热焊盘外围电路简单到只需要几个电阻电容就能把电流环搭起来而 STM32F401RB 虽然不是什么旗舰型号但 84MHz 主频、单精度 FPU、丰富定时器资源用来做步进电机的脉冲发生、加减速曲线计算、IO 控制完全绰绰有余成本还压得非常低。这块样板做下来我觉得真正有价值的不是“能不能转起来”而是“怎么把它调稳、调顺、调到能上产线或者上机器人底盘”。这篇文章就把我做这块板子过程中攒下的设计思路、关键参数、调试经验和踩坑记录完整放出来给正在做类似工作的朋友一个可以对照的参考。1. 方案选型与设计思路拆解1.1 为什么是 DRV8818PWPR 而不是 A4988 或者 DRV8825很多朋友上来就会问市面上几十块钱的 A4988 模块和 DRV8825 模块满地都是随便接个单片机就能转为什么偏偏要选一颗需要自己画外围电路、自己布板的驱动芯片这个问题其实很实在我的回答也实在模块化方案和板级方案的应用场景完全不同。A4988 和 DRV8825 的模块适合验证、桌面级小玩具、3D 打印机这类对 EMI、可靠性、散热要求不苛刻的场合。它们的导通电阻偏高散热条件一般持续电流能力有限而且模块上往往没有做完整的电流衰减模式控制接口很多细节被封装死了。DRV8818PWPR 不一样它是面向工业和机器人这类对可靠性有要求的场景设计的。它的 MOSFET 导通电阻 RDS(on) 典型值在 24V 供电、25℃环境下大概是 0.55Ω 左右高侧加低侧合计比那些模块化方案低不少意味着同样电流下芯片自身的发热更小。再加上 HTSSOP-16 封装自带散热焊盘PowerPAD能直接把热量导到 PCB 铜皮上持续输出能力比同级别的裸片方案扎实很多。还有一个关键点DRV8818 的电流衰减模式是可以通过引脚配置的。它有 M1 或 DECAY 引脚不同批次和封装引脚功能略有区分需要对应数据手册确认可以选快衰减、慢衰减或者混合衰减这让它在处理低电感电机、高转速场景时比固定衰减模式的驱动芯片灵活得多。我后面会单独展开讲衰减模式的选择逻辑这是很多人在低速时抖动、高速时丢步的隐性原因之一。1.2 STM32F401RB 在步进控制里的真正定位STM32F401RB 是一颗 Cortex-M4F 内核的芯片主频最高 84MHz带 128KB Flash 和 20KB SRAM封装 LQFP64。它做步进控制的核心优势不是算力多强而在于三个点首先是定时器资源丰富它有 8 个定时器TIM1、TIM2、TIM3、TIM4、TIM5、TIM9、TIM10、TIM11其中 TIM1 是高级定时器带互补输出TIM2-TIM5 是通用定时器可以方便地为每个电机轴分配一个独立的硬件定时器来产生步进脉冲其次是中断响应足够快84MHz 主频下定时器中断的响应延迟在几十纳秒到几百纳秒级别这对精准控制步进脉冲间隔非常关键最后是 IO 容忍度好大部分 IO 支持 5V 耐压哪怕驱动芯片的逻辑电平接口是 5V 系统不需要额外电平转换也能直接对接。在实际的项目里STM32F401RB 的定位更像一个“运动控制前端”它负责接收上位机或主控发来的运动指令解析目标位置和速度用定时器产生精确的脉冲序列给驱动芯片同时管理使能、方向、限位开关、急停这些逻辑。它不需要跑复杂的实时操作系统也不需要做大量的浮点运算一颗小芯片把这些事情处理得井井有条这就是它在这个方案里最大的价值。1.3 双极步进电机的基础概念与接线方式先说清楚一个容易混淆的点双极步进电机Bipolar Stepper Motor跟单极步进电机Unipolar的区别在于线圈绕组的中心抽头。双极电机每个相只有两根线引出一共四根线电机内部没有中心抽头电流必须双向流过线圈才能改变磁场方向所以驱动电路必须是 H 桥结构。单极电机则每相有中心抽头一共六根线或五根线电流只需要单向导通驱动电路可以用简单的达林顿管阵列。DRV8818PWPR 内部集成了两个全 H 桥正好驱动双极步进电机的两相绕组。接线时把电机的 A、A- 接到芯片的 OUT1A、OUT1B把 B、B- 接到 OUT2A、OUT2B。这时候特别注意绕组线的颜色定义不同厂家的电机线色标准不同不能机械地套用“红蓝一组、绿黑一组”这种经验最好用万用表电阻档测一下导通的两根线属于同一相这步做错了后面怎么调都白搭。双极电机的电流方向决定了转子位置所以驱动时序本质上是四个状态的循环A 相正流、B 相正流、A 相反流、B 相反流这就是所谓的整步驱动。如果把每个状态中间再插入电流渐变步骤就是半步、1/4 步甚至更细分的微步。DRV8818 的电流调节和微步能力就体现在内部 DAC 基准和斩波电路上。2. 硬件电路设计与关键参数计算2.1 逻辑侧电路VREF、ISEN 和电流限值的设定DRV8818 的电流设定不复杂但很关键。它通过外部电阻连接到 ISEN 引脚来设定 H 桥的输出电流限值同时 VREF 引脚提供一个内部参考电压。具体的电流计算方法是I VREF / (8 × RISEN)其中 VREF 是 VREF 引脚上的电压RISEN 是 ISEN 引脚对地的采样电阻阻值。注意这个 8 是芯片内部的固定增益系数不同的驱动芯片系数不一样比如 DRV8825 是另一个公式一定要查数据手册确认。以我实际用的一个 42 步进电机为例额定相电流 1.5A供电电压 24V。如果我想把电流限值设到 1.5A同时 VREF 直接接芯片内部的 3.3V 参考有的版本 VREF 可以直接接逻辑电源那么 RISEN 3.3 / (8 × 1.5) 0.275Ω。这个阻值不是标称系列值我会用两个 0.56Ω 的电阻并联得到 0.28Ω实际电流限值大约是 3.3 / (8 × 0.28) ≈ 1.47A跟 1.5A 的偏差在可接受范围内驱动芯片对电流限值的精度本来也不需要做到 1% 以内。很多人会忽略一个细节ISEN 采样电阻必须是低电感、大功率的合金电阻或绕线电阻不能用普通贴片厚膜电阻因为步进电机斩波电流频率一般在 20kHz~50kHz普通厚膜电阻的电感特性和温漂会让电流波形畸变还会导致发热严重。我建议用 2512 封装的合金电阻额定功率 1W 以上PCB 上铺铜散热。另外 ISEN 引脚的走线要直接从电阻两端引出采用开尔文接法避免采样线上叠加功率电流路径上的压降这个在高电流时差异很明显。2.2 电源侧设计VM 引脚和去耦电容VM 是电机驱动电源引脚我这个板子用的是 24V 输入。DRV8818 的 VM 工作范围是 8V 到 45V24V 对于额定电压 2.4V、额定电流 1.5A 的 42 电机来说电压余量很大这能保证高速时电流上升速率足够。但高电压也带来一个副作用斩波电流纹波更大电机的电磁噪声和振动更明显所以 VM 引脚旁边的去耦电容必须到位。我实测下来VM 引脚旁边放一个 100μF 的电解电容低 ESR 类型再并联一个 0.1μF 的陶瓷电容效果比较稳。100μF 电容负责吸收斩波产生的中低频纹波0.1μF 负责高频噪声。另外整个电机电源入口要加一个 TVS 管或者至少一个反接保护二极管因为电机是感性负载断电瞬间 VM 电压会反冲如果电源设计不扎实芯片很容易在关断瞬间被打坏。驱动芯片的地和逻辑地最终要单点汇合避免大电流地回路穿过逻辑电路区域。我遇到过一块板子因为地线布局不当电机一转单片机就开始随机复位后来重新分割了地平面把功率地和数字地在电源输入端单点连接问题就消失了。这个问题在模块化方案里不明显因为模块上已经把布局做完了但自己做板子就完全暴露出来了。2.3 PWM 斩波频率和电流衰减模式的选择逻辑DRV8818 内部有一个固定频率的 PWM 斩波器频率由外部电阻 ROSC 设定计算公式大致是 fPWM 1 / (ROSC × 1e-9)具体系数需要查数据手册我这里用的 100kΩ 电阻对应约 40kHz。斩波频率的选择要平衡几个因素频率太高MOSFET 开关损耗增大芯片发热加剧频率太低电流纹波大电机噪声和振动明显尤其在低速时会产生明显的“嘶嘶”声。40kHz 这个档位实际听感不错因为超出了人耳最敏感的频段电机噪音会小很多。但要注意如果电机电感特别小比如那种扁平型、低电感的高速电机40kHz 下的电流纹波可能非常大这时候需要提高斩波频率或者在 ISEN 电阻两端并联一个小电容来滤波。我手上这颗 42 电机的相电感是 2.5mH24V 供电、40kHz 斩波下的电流纹波实测在 5% 以内表现满意。电流衰减模式是 DRV8818 的一个重点特性。慢衰减模式下续流期间电流下降慢电流波形更接近理想正弦低速平稳性更好但高速时因为电流来不及下降会导致实际电流偏大、转矩波动快衰减模式下电流下降快高速性能好低速时振动变大。混合衰减模式是折中方案低速时慢衰减为主高速时自动切到快衰减。我实际测试中发现对于普通 42 电机、转速在 0-300 RPM 范围内慢衰减模式的低速平稳性最好超过 300 RPM 后快衰减模式的高频表现更优。所以在可选的情况下我会做一个衰减模式选择引脚的控制而不是固定死一种模式这样在不同工况下可以灵活切换。3. 软件实现STM32F401RB 的步进脉冲生成逻辑3.1 整体软件架构不用延时函数阻塞用定时器中断驱动步进电机控制最忌讳的就是在主循环里用 delay 函数来翻转电平。因为主循环里一旦有别的任务按键扫描、OLED 刷新、串口通信、传感器读取脉冲时序就会被打乱轻则电机抖动重则丢步。我在这块板子上的软件架构很清晰所有步进脉冲的产生都放在硬件定时器中断里处理主循环只负责运动指令的接收和解析。具体做法是TIM2 配置为输出比较模式周期可动态调整。每次进入中断翻转一次 STEP 引脚的电平或者直接切换输出比较寄存器的值来产生硬件 PWM这个后面讲然后根据当前的目标速度计算出下一个脉冲的周期更新定时器的 ARR 寄存器。这样脉冲序列完全由硬件定时器保证不受主循环负载影响MCU 还能有充足的剩余资源处理上层逻辑。用硬件定时器产生的脉冲可以做到非常精准脉冲间隔的抖动在几十纳秒级别这对运动控制来说已经完全足够。相比之下单纯用 GPIO 翻转加延时函数的方式脉冲间隔抖动有几十微秒在低速时还能凑合速度一高就露馅了。3.2 梯形加减速曲线的实现要点步进电机直接从一个静止状态给很高频率的脉冲必丢步这是物理规律。原因很简单电机转子的机械惯性存在电磁转矩在极短时间内产生的角加速度不足以让转子跟上脉冲序列的设定位置差转子就会失步。所以实际控制中必须给电机一个加减速曲线。我最常用的加减速曲线是梯形加减速加速段、匀速段、减速段三段组成。加速段的加速度恒定速度线性上升匀速段保持最大速度减速段加速度恒定速度线性下降。这种曲线实现简单计算量小效果对大多数场合够用。S 型加减速曲线更平滑但计算复杂度高对 MCU 的浮点性能和实时性要求高如果不是对冲击和机械振动有苛刻要求的场景梯形已经够用。具体实现上我在 STM32F401RB 上用一个简单的状态机初始化目标位置、最大速度、加速度。每次定时器中断中根据当前位置和目标位置的关系计算出当前应该的速度在加速段则加速度增加在减速段则减速度降低然后把速度转换成定时器周期写入硬件寄存器。加减速过程通过中断内增量式更新不需要预先规划整条速度-时间曲线节省内存。计算过程中的关键细节是避免浮点数运算拖慢中断。STM32F401RB 虽然有 FPU但浮点运算在中断里还是会比定点慢不少。我实际用定点数实现速度用“每分钟转数 × 256”这样放大后的整数表示周期用“定时器时钟频率 × 60 / (转速 × 每转脉冲数)”来反算整个过程只做乘除法不做 sin 等超越函数中断执行时间在 2μs 以内完全能支撑 40kHz 以下的脉冲频率。3.3 方向控制与使能控制的最佳实践方向引脚 DIR 和使能引脚 EN 的控制看似简单但有个细节很有讲究方向切换必须先于步进脉冲有效沿出现在 STEP 引脚。这是大多数驱动芯片数据手册都写明的时序要求——DRV8818 要求 DIR 信号相对 STEP 上升沿的最小建立时间约为 500ns具体看手册时序表。如果脉冲频率较高在中断里先翻转 DIR 再产生 STEP那么 DIR 的建立时间就是两次中断之间的间隔通常是足够的。但有一种情况需要注意在脉冲序列中间切换方向并且 SETP 频率很高时。比如 10kHz 的脉冲频率一个周期只有 100μs中断程序里先置 DIR再进入下一个周期产生脉冲这个建立时间是足够的。但如果是外部信号直接触发方向切换或者主循环和中断乱序操作 DIR 引脚就可能出现芯片还在执行上一段脉冲时方向已经翻转导致电机瞬间反向堵转的情况。我最终的做法是方向切换也在定时器中断里完成并且用一个“待切换方向”变量缓存确保切换节点只在两个脉冲之间的安全时刻执行。使能引脚 EN 的逻辑也可以加一个超时保护当上位机长时间没发新指令超过设定时间比如 200ms后自动关闭使能让电机掉电保持这样既能省电又能防止电机长时间堵转发热。3.4 核心代码框架示例下面是我在这个项目里用的核心代码框架简化版重点看定时器中断里如何更新周期和输出脉冲// 定时器中断处理函数TIM2_IRQHandler void TIM2_IRQHandler(void) { // 清除中断标志 TIM2-SR ~TIM_SR_UIF; // 翻转 STEP 引脚产生一个完整脉冲半周期高、半周期低 GPIOA-ODR ^ STEP_PIN; // 如果当前是上升沿高电平说明一个脉冲输出完成更新下一次的周期 if (GPIOA-ODR STEP_PIN) { // 根据加减速状态更新当前速度这里以简单的梯形加减速为例 if (accel_state ACCEL) { current_speed accel_step; if (current_speed target_speed) { current_speed target_speed; accel_state RUN; } } else if (accel_state DECEL) { current_speed - accel_step; if (current_speed 0) { current_speed 0; accel_state STOP; // 到达目标关闭输出 TIM2-CR1 ~TIM_CR1_CEN; step_enable 0; return; } } // 更新定时器周期周期 定时器时钟频率 / (2 * 当前转速 * 每转脉冲数) uint32_t period TIM2_BASE_CLOCK / (2u * step_per_rev * current_speed); TIM2-ARR period; } }注意这段代码演示的是最简逻辑实际项目中我还会加细分支持——当 DRV8818 工作在 1/2、1/4、1/8 微步模式时每转脉冲数是整步数的对应倍数定时器周期计算要相应调整。STM32CubeMX 中把 TIM2 预分频设为 0定时器时钟直接用内部 APB1 的 84MHz这样周期值就是脉冲周期的精确时钟周期数精度最高。4. 实际调试过程与现场排错记录4.1 第一步空载低速验证基本转动方向焊好样板、烧入最简程序后我最先做的一步不是追求转速而是验证电机能不能以最慢的速度、最整的步进方式转起来。我会把定时器周期设得很大比如每秒只给 200 个脉冲也就是 0.2 转/分钟的极低速度按 200 整步每转计算然后观察电机是否顺畅地步进。这一步能暴露很多基本问题如果电机完全不转优先测量 VM 引脚电压是否到位、EN 引脚是否使能正确低电平使能逻辑DRV8818 的 nEN 是低有效、STEP 引脚是否有脉冲波形输出如果电机发热很快但不转大概率是接线把绕组的同名端接反了两个 H 桥输出的电流方向互相抵消转子只在那里振荡而不连续旋转。这种“绕组极性接反导致转矩对消”的问题很难一眼看出来用示波器看输出波形、用逻辑分析仪看 STEP/DIR 时序会更容易定位。我实际还踩过一个坑因为 ISEN 采样电阻用得偏大电流限值被设得过低电机虽然通电但不产生足够的保持转矩用手轻轻一捏就失步。后来确认是电阻并联计算错误把两个 0.56Ω 电阻的并联值算成了 0.56Ω忘记除 2导致实际电流只有设定值的一半左右。这类基础计算错误在调试中最容易让人走弯路建议每个电阻值都用万用表实测确认后再焊上。4.2 第二步中高速测试与电流波形测量低速转动没问题后我会逐渐提高脉冲频率同时观察电机的转速和噪音。这个阶段最有效的工具是示波器把电流探头或者用采样电阻两端的电压波形代替接到电机绕组线上直接看电流波形是否符合预期。正常情况下斩波电流波形应该是类似于三角波的形状平均值接近设定值峰值限制在 ISEN 设定的限值内。如果在某个速度段出现波形振荡剧烈、峰值明显超出设定值就要检查斩波频率是否太低、电源电压是否跌落、衰减模式设置是否合理。我实际调试中遇到的一个典型问题是电源用的是一个 24V 2A 的开关电源当电机工作在高速大电流状态时电源输出电压跌落严重导致电流波形削顶电机转矩不足。解决方法是把电源换成 24V 4A 的型号并缩短电源线长度、加粗线径压降问题立刻缓解。还遇到过另一个有趣的现象电机在某个特定速度下出现“嘶鸣”声像蝉叫一样。用示波器看电流波形发现这时的斩波频率和电机的机械谐振频率发生了共振叠加效果被放大。这个问题的根源不是驱动电路问题而是机械系统的固有频率。最简单的解决方法是改变机架的固定方式或者在速度曲线上做一个“跳频”处理检测到即将进入谐振速度区间时快速跳过这段速度范围而不是线性爬升。这个方法在工业数控领域也常用效果立竿见影。4.3 第三步带上负载后的实测表现与参数修正空载测试通过后我把电机装到实际负载上我这里是一个小型两轴云台负载约 1.2kg发现低速启动时的手感明显变软而且偶尔会丢步。排查后确认是启动加速度设置过大电机从零速加速到目标转速的加速度超出了电机的转矩-加速度能力边界。解决方法是把加速度减小到原来的 60%并且把启动速度适当降低一点从原来的 5RPM 降到 2RPM 开始起步。有经验的朋友会知道步进电机的输出转矩随转速升高而下降所以高转速时的加速度能力反而更差有些人只限制启动速度而忽略了高速段的加速度极限也会导致高速丢步。我最后采用的速度曲线是启动速度 2RPM最大速度 120RPM加速段的加速度根据负载质量重新标定。这个标定的过程有点像汽车调校油门响应没有固定公式必须在实际负载下反复测试。另外微步细分的实际效果也被验证了。整步驱动每转 200 脉冲下电机在低速时的振动非常明显用手能感觉到一卡一卡的变化切换到 1/4 微步每转 800 脉冲通过 MS1、MS2 引脚配置后低速平稳性改善非常明显但要注意的是微步并不能提高电机的绝对精度它只是让运动更平滑定位精度仍然取决于机械精度和闭环反馈。如果项目对定位精度有硬性要求该上编码器闭环的系统还是得加编码器微步不能替代。4.4 加电时序与保护逻辑的工程化处理工业环境下使用还有一个容易忽视但很重要的点上电时序。驱动芯片的逻辑电源VCC和电机电源VM的上电顺序如果不合理可能导致芯片内部逻辑混乱、输出端出现异常电平轻则电机抖动重则烧毁芯片。DRV8818 数据手册推荐的顺序是逻辑电源先上、电机电源后上并且 nEN 在电机电源上电前保持为高使能无效。我在板子上加了一个 RC 延迟电路控制 VM 的 MOSFET 开关确保 VM 在逻辑电源稳定 100ms 后才开始上升这个细节在批量生产时非常关键。还有一个保护逻辑值得加上当检测到电机堵转目标位置和实际位置长期不一致或者电流异常增大时程序应自动切断使能并报警。在没有安装编码器的情况下可以通过检测 VM 电流间接判断堵转也可以用简单的外部电压比较器监测 ISEN 电阻上的电压当它持续超过设定值一段时间时触发急停。虽然这一步增加了几个元件的成本但在机器人关节或自动化设备上这可能是避免机械损坏的最后一道防线。5. 常见问题与排查技巧速查表调试过程中遇到的问题千奇百怪但大多数都能归到几个经典类别里。我把实测中遇到的典型问题整理成一个速查表方便朋友们遇到问题时快速定位现象可能原因排查顺序与处理方法电机不转、无噪声STEP 无脉冲、nEN 未使能示波器测 STEP 引脚检查 nEN 逻辑电平低有效检查 GPIO 配置为推挽输出电机不转、芯片发热绕组接线同名端接反、电流限值过低用万用表确认两相绕组检查 ISEN 电阻阻值电机发热异常电流限值超过额定、斩波频率过低降低 VREF 电压或增大 ISEN 电阻确认 ROSC 对应频率电机只往一个方向转DIR 信号变化无效、程序未切换方向示波器测 DIR 电平变化确认初始化时将 DIR 置为确定状态低速时振动大整步驱动、衰减模式不当切换微步模式尝试慢衰减模式高速时丢步加速度过大、电源功率不足、快衰减不匹配减小加速度更换更大功率电源改用混合衰减模式有“嘶嘶”声斩波频率落入人耳敏感频段、机械谐振调整斩波频率改变机械固定方式软件跳频电机转动时 MCU 复位功率地回路串扰、电源纹波过大单点接地、功率地远离 MCU 模拟区域、加 TVS/LC 滤波这张表不是万能的但能覆盖我碰到过的九成问题。有几个排查思路可以说说示波器双通道同时看 STEP 和 DIR 可以秒判时序类问题如果怀疑接地问题用一根粗线直接短接功率地和逻辑地试一下如果故障消失说明地线布局有问题如果怀疑电源问题用稳压电源直接跨过 PCB 的电源走线给 VM 供电对比测试结果能快速定位是不是 PCB 走线压降过大。还有一个我特别想强调的细节排查任何问题先确认软件层面的逻辑正确性再看硬件。很多时候程序里某个 GPIO 配置成了模拟输入而不是推挽输出导致引脚电平被内部上拉电阻拉高看似硬件故障其实源头在代码。我的习惯是每块新板子焊接完成后先烧一个 GPIO 自检程序把所有踩过的输出引脚循环置高置低用万用表逐一测量确认硬件通路正常后再跑真正控制固件这套流程能帮我省下大量的无效调试时间。6. 经验总结与后续扩展方向整个项目做下来我最深的体会是DRV8818PWPR 和 STM32F401RB 的组合非常契合中小型工业设备和机器人平台的需求因为它把硬件复杂度和软件灵活性平衡到了一个很舒服的位置。硬件上外围元件不多成本可控软件上STM32F401RB 的定时器资源和中断响应让步进控制可以做得非常精细从整步到微步再到加减速曲线全部能在这颗芯片上流畅跑起来。如果要在这个基础上做功能扩展我个人建议优先考虑两个方向。第一个方向是闭环化在电机尾部加装磁性编码器如 AS5600 或 TLE5012B读取实际角度通过简单 PID 或闭环步进算法把位置误差拉回。这能解决步进电机在变负载、冲击工况下的丢步问题是很多桌面级机器人升级到准工业级的关键一跃。第二个方向是加网络控制STM32F401RB 本身不带以太网但可以通过 SPI 接 W5500 或者其他网络模块让设备变成工业现场总线或以太网控制的一个节点这样多轴联动、远程监控就都有了基础。再分享一个最后的小技巧如果你手头的电机额定电流较大、DRV8818 的 2.5A 峰值不够用可以考虑外部加功率 MOSFET 来拓展电流能力或者直接换一颗 DRV8825 甚至更大电流的驱动芯片软件层面基本不用动只需要按新芯片的电流计算方式重新标定 ISEN 电阻。这种“换驱动芯片而不换控制架构”的兼容性是我当初选择 STM32F401RB 作为控制核心的一大原因它的定时器资源足够适配各种类型和档位的步进驱动器。这块板子目前已经跑了接近一个月的高强度测试无论连续往复运动还是随机点位运动表现都算可靠。如果你正在设计类似的工业控制板遇到具体的电路设计或者软件参数问题欢迎参照我文章里提到的思路逐步排查验证这些方法都是在实践中反复验证过的照着做能省下不少弯路。