
前阵子接了个活任务优先级直接被标成了 P0要把一台直流电机按设定速度转起来不要求精准定位转速误差允许百分之几但必须立刻能跑、稳定可靠、两周内交样。当时第一反应是上编码器加 PID后来冷静一想这属于典型的过度设计——系统要的就是 PWM 开环控制先把电机以可控转速转起来把底层链路打通。很多项目里你也会遇到同样的情况开环控制并不是低端的代名词它是电机控制的地基。这篇就把我从 PWM 信号生成、驱动电路选型、软件实现到调试踩坑的完整链路拆开讲清楚给正准备做电机控制、或者接到类似 P0 任务的朋友一个可以直接上手的参考。先说清楚一个很多人容易忽略的事实开环控制的关键不在于不接反馈而在于把给出去的信号和电机的实际响应之间的关系掌握得足够准。PWM 的占空比、频率、死区、驱动电路的压降、电机的反电动势系数这些参数共同决定了一个占空比下电机到底能转到多少转。把这些底层逻辑理清楚哪怕后面要做闭环也是在开环这个地基上叠 PID而不是推倒重来。1. 为什么开环控制在电机项目里永远是 P0 优先级1.1 先理解开环在电机控制里的真实含义开环控制就是你给电机一个 PWM 信号电机转起来你不再回头去测量它的实际转速也不根据实际转速修正输出。听起来很简单但在工程上给一个 PWM 信号这件事本身就有一堆门道。占空比设多少、频率选多大、H 桥怎么控制、电源能供多大电流这些全是你作为设计者需要提前想清楚的。我做这个项目时需求方给的技术参数很朴素12V 直流有刷电机空载额定转速 5000 RPM带一个轻负载的风扇叶轮转速在 2000 到 4000 RPM 之间可调就行。这个场景就是典型的开环适用场景负载基本恒定、转速精度要求不高、成本要低、开发周期要短。如果这时候我非要在电机屁股后面装一个 1024 线编码器然后写位置环速度环双环 PID实验台调参就得调一星期完全没必要。开环控制真正适用的场景大概是这几类负载基本恒定比如风扇、水泵、散热器转速精度要求不高误差在 5% 到 10% 都能接受项目初期做可行性验证需要先跑通机械结构和功率链路成本敏感能省掉编码器和驱动算法芯片的预算1.2 为什么说开环是闭环的前提很多初学者有一个误区觉得开环控制就是瞎转转多快完全听天由命。其实不是。开环控制精不精取决于你对系统模型的把握。你至少要知道供电电压、电机内阻、反电动势系数、空载电流、堵转电流这几个参数基本决定了这个电机在某个占空比下能转到什么速度。我习惯在调试之前先把电机的几个关键参数测一遍用万用表量电机内阻用稳压电源直接供额定电压测空载电流和空载转速用手捏住轴测堵转电流记录电机的额定电压和额定转速反电动势系数 Ke 可以用额定转速反推有了这几个参数开环 PWM 的占空比设计就不是拍脑袋。电机稳态时满足这个关系式U_avg I × R Ke × n其中 U_avg 是 PWM 的平均电压I 是电枢电流R 是电枢电阻n 是转速。假设负载不变、电流近似不变那么转速和 U_avg 基本成正比。而 U_avg 又等于占空比 D 乘以电源电压 U_supply。这一条线性链就是你开环调速的全部理论基础。1.3 开环控制的快体现在哪里我做这个 P0 任务的时候从拿到电机到让它稳定转起来只花了大半天时间。这其中有几个原因MCU 的 PWM 外设是现成的驱动芯片是通用的 H 桥软件上只需要配置定时器输出 PWM再做电压-转速标定不需要任何控制算法的调参过程。相比之下闭环控制不仅仅是多一个编码器接口还要处理 PID 参数整定、滤波、环路带宽和采样延时这些都会显著拉长调试周期。如果你是一个刚接触电机控制的开发者我强烈建议先把开环链路完整做一遍。这一遍跑通了你对 PWM、驱动、电源、电流这些概念都会有直观理解后面做闭环会顺手得多。2. 开环 PWM 控制最核心的三个参数频率、占空比、死区2.1 PWM 频率不能任意选要和电机电感匹配PWM 频率的选择是很多人一上手就会踩的坑。频率选低了电流脉动大电机会发出刺耳的啸叫而且转速波动明显频率选高了MOS 管的开关损耗和驱动芯片的发热会明显增加。直流有刷电机本质上是电阻加电感的负载模型。电感对电流有平滑作用PWM 频率越高电流脉动越小但那是在理想情况下。实际上 H 桥驱动芯片的开关损耗随频率线性上升功率管功耗太大就会过热保护。我在实际项目中的经验值如下场合推荐频率原因直流有刷电机调速15kHz-20kHz超出人耳听觉范围避免啸叫舵机控制50Hz舵机内部电路按此频率解析脉宽BLDC/PMSM 驱动8kHz-20kHz与电机电气时间常数匹配直流无刷风扇20kHz-25kHz兼顾噪音和开关损耗电磁阀/继电器驱动100Hz-1kHz低频率即可满足动作需求我这个项目用的是 16kHz原因很简单人耳对 16kHz 以上的声音敏感度急剧下降电机电感在这个频率下的电流纹波足够小驱动芯片 AT8236 的开关损耗也在可接受范围内。2.2 占空比转速标定的起点占空比决定了电机的平均电压也就决定了电机的大致转速。占空比 D 和平均电压的关系很简单U_avg D × U_supply还是上面那个电机12V 供电想要 3000 RPM。电机额定 5000 RPM 对应 12V简单按比例算3000 / 5000 × 100% 60% 占空比。但这里有一个关键的非线性因素电机本身的内阻会在低电压时产生明显的电压降而且电机存在一个启动死区占空比太低时电机根本不会转。我做标定实验时发现这个电机从 0 占空比往上加大概到 5% 左右才开始有转动的迹象到 10% 空载转速才比较稳定。所以实际标定时我不会直接按线性比例算而是先用几个测试点做曲线设 20% 占空比记录转速设 40% 占空比记录转速设 60%、80%、100%分别记录转速把五个点连成线后续按这条标定曲线反查占空比这个标定过程最多花十分钟但能显著提升开环控制的转速准确性。要注意的是标定必须在实际负载下进行。空载标定的曲线在带载后会整体下移因为负载扭矩需要额外的电枢电流而电流在电阻上的压降会进一步吃掉一部分有效电压。占空比的调节还有一个实操细节不要把占空比直接从 0 跳到目标值会发生一个类似堵转的大电流冲击可能触发驱动芯片的过流保护也会让电机轴受到机械冲击。正确做法是加软启动斜坡比如每 10ms 将占空比增加 1%让电机缓慢加速到目标值。这个办法对延长电机和减速齿轮的寿命非常有帮助。2.3 PWM 死区H 桥上下臂不能同时导通如果你的电机驱动是 H 桥结构PWM 信号需要同时控制四个开关管。上下桥臂如果同时导通等于电源直接对地短路瞬间大电流会烧毁驱动管。死区时间就是在上下桥臂切换之间插入的短暂延时保证一个管子完全关断后再打开另一个。死区时间太短无法避免直通短路死区时间太长波形失真增加电机的有效电压下降还会引入额外的谐波损耗。一般 MOSFET 驱动芯片的死区建议在 100ns 到 2us 之间具体看器件的导通和关断延时。我用的 AT8236 芯片内置了死区时间管理所以不需要我在 MCU 侧额外配置。但如果你用分立器件搭 H 桥就必须自己处理这个问题。STM32 的高级定时器如 TIM1 和 TIM8有专门的死区插入功能配置一个寄存器值就能自动在互补 PWM 输出之间插入死区。这一点在做三相 BLDC 控制时尤其重要我后面在踩坑部分会再展开讲。2.4 一个容易忽略的参数PWM 极性PWM 极性决定了输出信号的逻辑有效电平。大多数驱动芯片的 EN 引脚和 IN 引脚的逻辑是正逻辑即高电平有效。但不同厂家的芯片略有差异有的芯片要求 PWM 占空比高电平时间越长转速越慢这一点手册里通常会写清楚。我调试时吃过一次亏电机怎么都不转查了半天发现驱动芯片的 PWM 输入引脚内部是反逻辑MCU 输出 50% 占空比对应的是半功率反转。这种问题用示波器量一下引脚波形和驱动输出来检查会直观很多。3. 从单片机引脚到电机线圈几种主流驱动方案的真实差别3.1 为什么不能直接用单片机引脚驱动电机单片机的 GPIO 输出电流一般在 10mA 到 20mA 之间而一个普通的直流有刷电机空载电流可能就要几十毫安带载以后几百毫安甚至几安培。直接接上去的后果就是引脚烧坏、单片机重启严重时芯片直接返厂。正确的链路是单片机输出 PWM 信号到驱动电路驱动电路提供大电流给电机。驱动电路的选择基本上决定了你能驱动的电机功率级别和系统效率。3.2 分立元件方案三极管和 MOS 管热词里有一个很常见的搜索词三极管控制电机。这是很多入门者的第一课。用一个小三极管如 S8050驱动一个很小的玩具电机是可以工作的但有三点限制三极管的饱和压降大0.5V-1V 以上、续流二极管必须外加、电流大了三极管发热严重。所以这种方案一般只用于 200mA 以下的小电机。功率稍大一点的场合更建议用 N-MOS 管加续流二极管的结构。MOS 管的导通电阻小压降低效率高。AK 热词里提到的 AO3400A 就是一颗很常用的低压 N-MOSVgs 阈值低可以直接用 3.3V 逻辑驱动适合小功率电机的单管斩波控制。单管方案只能控制电机转速不能换向。需要正反转的场合就得用 H 桥。3.3 H 桥驱动芯片对比L298N、TB6612、AT8236H 桥是直流电机正反转控制的标准拓扑。简单说就是四个开关管围成一个桥对角导通时电机的电流方向相反从而实现正转和反转。PWM 加在其中一个开关管上就能同时调节转速和方向。市场上最常用的三款 H 桥驱动芯片我列个对比表型号最大持续电流导通压降/电阻特点适用场景L298N2A饱和压降 1.2V-2.5V发热大经典芯片兼容 5V/12V模块带稳压和散热片学习验证、大电流低速TB66121.2A导通电阻约 0.5Ω体积小MOS 管效率高直接 3.3V 逻辑兼容小型机器人、玩具车AT82366A导通电阻约 0.15Ω内置电流镜像输出大功率内置保护功能多稍大功率直流电机、电动工具L298N 是很多入门教程的首选也是我最不建议用在正式项目里的芯片。它的导通压降太大了12V 供电经过内部达林顿管后实际到电机两端的电压可能只有 8V 左右电机转速直接损失三分之一。而且它在 1A 以上电流时散热片温度飙升得很厉害很多实验室的 L298N 模块最终都烧掉了保险丝。TB6612 作为 L298N 的替代在小型项目里更实用MOS 管的导通损耗小很多体积也小唯一要注意的是它的持续电流只有 1.2A峰值 3A超过就会过热保护。AT8236 是我这个项目选的驱动芯片。它内部是一个大功率 H 桥持续电流 6A峰值可到约 8A导通电阻只有 0.15Ω 左右。芯片还内置了限流环路、过流保护和过热保护。最关键的是它有一个电流镜像输出脚输出一个小电流信号正比于电机工作电流方便 MCU 的 ADC 去采样。这在开环阶段是很好的辅助观察窗口——不需要装编码器你也能知道电机是不是堵转、负载是不是突然变大。3.4 H 桥 PWM 调制方式单极性还是双极性H 桥的 PWM 调制方式对控制效果有直接影响。单极性调制是一边的上下桥臂用低频方向信号另一边的高频 PWM 调节电压。电枢两端的平均电压在 0 到 U 之间连续可调。双极性调制则是对角两个开关管同时高频动作电枢两端电压在 U 和 -U 之间切换平均电压等于 (2D-1)×UD50% 时输出为 0。单极性调制的优点是电流纹波小、损耗低、电磁干扰小缺点是存在换向死区问题在电流过零附近有非线性。双极性调制的优点是低速线性度好正反转切换平滑但损耗和纹波都更大。开环调速一般用单极性调制就足够了我做的这个 AT8236 方案就是单极性调制一个 IN 引脚控制方向电平一个 PWM 引脚控制速度。4. 让电机转起来一套可以直接抄的 PWM 开环控制实现4.1 单片机侧 PWM 生成STM32 和 51 的差异控制链路中单片机的任务只有一个生成频率和占空比都精确的 PWM 波形。不同单片机做这件事的方便程度差别很大。51 单片机没有硬件 PWM 模块只能靠定时器中断去翻转 IO 口频率和占空比的精度都很难保证。大概代码如下// 51单片机软件模拟PWM // 定时器0中断周期10us一个PWM周期100次中断1ms对应1kHz void timer0_isr() interrupt 1 { pwm_cnt; if (pwm_cnt pwm_duty) { MOTOR_PIN 1; } else { MOTOR_PIN 0; } if (pwm_cnt 100) { pwm_cnt 0; } }这种方法虽然能转起来但定时器中断频繁进入MCU 大部分算力都耗在翻转 IO 上了代码环境再复杂一点就会卡顿。所以我建议即使是在 51 平台上也尽量用带硬件 PWM 的增强型 51这类芯片现在也很便宜。STM32 的硬件 PWM 就从容得多。定时器产生 PWM 波形CPU 只需要设置寄存器值其余时间可以干别的事情。我用 STM32F103 的 TIM2 通道输出 PWM配置过程如下// 以STM32 HAL库为例 // 1. 初始化定时器时基 htim2.Init.Prescaler 72 - 1; // 72MHz/72 1MHz htim2.Init.Period 62; // 1MHz/63 ≈ 15.87kHz htim2.Init.CounterMode TIM_COUNTERMODE_UP; HAL_TIM_PWM_Init(htim2); // 2. 配置PWM通道 sConfigOC.OCMode TIM_OCMODE_PWM1; sConfigOC.Pulse 31; // 50%占空比0-62之间 sConfigOC.OCPolarity TIM_OCPOLARITY_HIGH; HAL_TIM_PWM_ConfigChannel(htim2, sConfigOC, TIM_CHANNEL_1); // 3. 启动PWM输出 HAL_TIM_PWM_Start(htim2, TIM_CHANNEL_1); // 4. 运行时调整占空比 __HAL_TIM_SET_COMPARE(htim2, TIM_CHANNEL_1, target_duty);频率计算方法是PWM 频率 定时器时钟 / (Prescaler 1) / (Period 1)。Prescaler71 时计数时钟为 1MHzPeriod62 时 PWM 频率为 1MHz/63约 15.87kHz非常接近 16kHz 的目标。占空比就是 Compare 值除以 Period1即 CCR / (ARR1)。4.2 PWM DMA批量控制多通道的高级玩法热词列表里出现了一个很值得讲的名词PWM DMA。STM32 的定时器比较寄存器支持更新事件触发 DMA 请求你可以预先在内存里放一串占空比数据然后自动周期性加载到寄存器里全程不需要 CPU 干预。这项技术的价值主要体现在两处。第一多个电机需要精确同时调速时用 DMA 可以保证各通道 PWM 占空比在同一时刻被更新避免软件依次写寄存器带来的时间错位。第二需要输出一段预定义的动态波形时比如软启动斜坡、S 型速度曲线可以用 DMA 循环传输数据实现波形播放效果。// 用DMA更新PWM占空比数组实现软启动斜坡 uint16_t pwm_ramp[100]; for (uint16_t i 0; i 100; i) { pwm_ramp[i] (i 1) * 20; // 占空比从1%线性升到100% } HAL_TIM_PWM_Start_DMA(htim2, TIM_CHANNEL_1, (uint32_t *)pwm_ramp, 100);配合定时器的更新中断可以用这种方式实现完全独立于 CPU 的 PWM 波形序列控制。我之前做摄像头同步闪光灯曝光控制时用过这个思路实际效果非常稳定。4.3 STM32 高级定时器中心对齐模式和 ADC 采样同步如果你的项目最终必然走向 BLDC 或 PMSM 控制那 STM32 的高级定时器TIM1 和 TIM8就必须学会用了。普通定时器只能输出简单的边沿对齐 PWM高级定时器支持中心对齐模式、互补输出、死区插入、刹车输入等一系列面向电机驱动的功能。中心对齐模式的特点是计数从 0 向上计数到 ARR再向下计数回 0生成的 PWM 波形高电平位于周期的中间两边对称。这种模式在 BLDC 控制中非常有用配合 ADC 触发采样可以在 PWM 周期的特定相位点比如计数器归零时刻采集母线电流这个时刻的电枢电流正好处于续流阶段采样的值能真实反映相电流的有效分量。这就是热词里提到的中心对齐模式和 ADC 采样时刻点设置问题的答案。说回开环控制中心对齐模式还有一个好处减少电流尖峰和电磁噪音因为开通和关断时刻的电流变化率比边沿对齐模式小。代价是 PWM 频率要设置成模式的 ARR 值对应的两倍递增关系计算时容易出错。我建议初学阶段先用边沿对齐模式把逻辑跑通后续需要开发 FOC 或 BLDC 时再切换中心对齐模式。4.4 舵机的开环控制50Hz 脉宽调制开环 PWM 控制里还有一个经典场景是舵机。舵机虽然内部有电位器反馈但对外部控制而言它是开环位置指令——你给它一个脉宽它就转到对应角度。标准舵机的控制信号是 50Hz20ms 周期高电平时间 0.5ms 到 2.5ms 对应 0 到 180 度。// 舵机控制STM32 PWM配置 // 假设定时器时钟1MHzARR19999PWM频率50Hz htim2.Init.Period 19999; // 1MHz/20000 50Hz // 0度脉宽0.5ms → CCR 500 // 90度脉宽1.5ms → CCR 1500 // 180度脉宽2.5ms → CCR 2500 __HAL_TIM_SET_COMPARE(htim2, TIM_CHANNEL_1, 1500);舵机控制最容易出的问题是频率设置错误。有的人会把占空比算成百分比比如 1.5ms / 20ms 7.5%如果这时候把 ARR 设成 99即 1% 步进那么 CCR 只有 7 到 8对舵机来说角度分辨率几乎不可用所以舵机控制的精髓是用固定 50Hz 频率控制脉宽在 0.5ms-2.5ms 之间。4.5 驱动芯片电平匹配和使能管理用 MCU 控制驱动芯片时还要注意电平匹配的问题。早期的驱动芯片如 L298N 是 5V 逻辑而现在的 MCU 很多是 3.3V 供电。TB6612 和 AT8236 这类芯片的输入逻辑电平范围都兼容 3.3V直接用没问题。但 L293D 这类老型号在某些电压组合下可能无法可靠识别 3.3V 高电平需要电平转换电路。驱动芯片一般都有 EN使能引脚高电平才允许输出。调试时建议把 EN 引脚接在单片机上用软件先拉低等确认 PWM 信号正常以后再拉高使能避免上电瞬间电机乱动的风险。有些模块直接把 EN 接到了 VCC这种情况下上电瞬间如果 MCU 引脚还没初始化驱动输入悬空可能导致电机瞬间转动一下这是很多初学者第一个感到困惑的问题。5. 我踩过的开环控制深坑完整排查链路与修复5.1 电机啸叫PWM 频率选到了人耳敏感区这个项目调试到一半时测试过 8kHz 的 PWM 频率。电机转起来以后实验室里出现一种尖锐的嘶嘶声刚开始我以为是电机轴承缺油把电机拆下来空转还是响。后来用示波器量电枢电流波形发现电流纹波频率正好是 8kHz与人耳最敏感频段重合。解决方式是直接把频率从 8kHz 提到 16kHz。频率翻倍后电流纹波幅度也下降了验证效果立竿见影。这个问题的本质是电机的定子铁芯在交变电磁力作用下产生振动振动频率等于 PWM 频率频率落在 2kHz-15kHz 范围内时人耳就能听到。5.2 电机一启动单片机复位电源共地问题电机空转时一切正常一加载负载单片机立刻复位偶尔还会出现随机重启。用示波器测量 MCU 电源引脚发现启动瞬间 VDD 跌到了 2V 以下。根因是电机的大电流路径和单片机共用同一根电源线而 12V 转 5V 的 LDO 就接在电机电源后面。电机启动瞬间电流从几百毫安飙升到 2A 以上电源走线的寄生电阻和电感让 5V 电源跌落严重。排查链路测量 5V 供电点发现跌落断开电机单独给电机供电MCU 不再复位确认是共电源路径干扰重新设计电源拓扑12V 电源先进入驱动芯片和电机USB 的 5V 单独给 MCU 供电两个电源地单点连接另外在电机电源两端并联一个大容量电解电容470uF 以上就近吸收堵转产生的瞬态电流最终方案是采用独立供电并在电机两端并联续流电容。由于 H 桥驱动芯片内部已经集成了续流二极管这个电容量的是吸收母线的电压尖峰而不只是给感性电流续流。之后电机的启停再也不会影响单片机稳定性了。5.3 PWM 引脚输出一直为高复用功能配置遗漏这是一个特别基础但极其常见的错误。STM32 的引脚默认状态下是 GPIO 模式只要不设置为复用功能Alternate Function定时器的 PWM 信号就无法输出到引脚下。现象是占空比代码写好、定时器启动成功但引脚输出一直是高电平或低电平无法出现波形。解决办法是在 GPIO 初始化时设置引脚复用GPIO_InitTypeDef GPIO_InitStruct {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_TIM2_CLK_ENABLE(); GPIO_InitStruct.Pin GPIO_PIN_0; GPIO_InitStruct.Mode GPIO_MODE_AF_PP; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, GPIO_InitStruct);具体是哪个复用功能号查数据手册的 AF 表格TIM2 的通道通常映射到 PA0 的 AF1。如果复用号配错引脚也不会输出波形。这个问题排查起来非常耗时因为软件逻辑、定时器配置、GPIO 配置看着都没问题但最后就是这个 1 行的复用设置漏了。5.4 软启动缺失导致的过流保护第一次做带负载测试时我直接在主循环里把占空比从 0 跳到 60%。电机瞬间启动电流冲击很大AT8236 的过流保护触发电机在约 200ms 后被切断随后自动恢复。这里的原因很好理解电机静止时反电动势为零电枢回路只有电阻限制电流堵转电流可以轻松达到额定电流的 5-10 倍。修复方式是在软件里加一个斜坡启动逻辑// 软启动每10ms占空比增加1% for (uint16_t i 0; i 60; i) { __HAL_TIM_SET_COMPARE(htim2, TIM_CHANNEL_1, i); HAL_Delay(10); }这个斜坡让电机从静止状态逐步加速启动电流被控制在合理范围内机械冲击也小很多。斜坡时间长短取决于负载转动惯量惯量大的减速机构建议拉到 500ms 甚至 1 秒以上。5.5 占空比过低电机不转启动死区电压有一次我把目标转速设在了额定转速的 8%也就是占空比 8% 左右。电机没有任何反应但加大占空比到 20% 又能转。我最初以为是代码 bug后来用示波器量电机两端电压发现 8% 占空比下平均电压只有 0.96V而这个电机由于电刷接触压降和内阻力矩输出已经无法克服轴承静摩擦了。这种情况在开环控制里叫启动死区或转矩死区。解决办法有两种一种是在软件里做非线性补偿当目标占空比低于 10% 时将占空比直接映射到 10%同时限制最低转速另一种是用分段启动策略先以 30% 占空比启动电机转动起来后再降到目标值。因为我做的是风扇调速不存在频繁低速启动的需求所以我选了前一种直接把可调速范围限制在 10%-100% 之间。5.6 P0 紧急任务的另一个深坑驱动芯片散热AT8236 在持续大电流下发热明显。我在第 4 小时连续满载测试时红外测温枪显示芯片表面温度到了 90 度以上。查了数据手册最高结温是 150 度但超过 100 度时芯片会进入热降额状态输出电流能力下降电机会比预期转速低。排查方法是用示波器看电机电流和供电电压确认芯片输入没有异常然后在芯片底部的散热焊盘上覆盖大面积铜箔加装一个小铝散热片。这之后温度稳定在了 70 度左右。开环大电流应用最常见的散热问题往往不是芯片本身而是 PCB 布局没有把散热焊盘引出足够多的铜皮。尽量多打过孔连接到底层的地铜皮散热效果会明显改善。5.7 PWM 死区导致的波形失真与噪音另外一个让我困惑了很久的现象是电机低速运转时电机会发出一种咔咔的不规则噪音用示波器看电机两端电压波形发现换向瞬间有电压尖峰波形带有明显的振铃。这个项目用的是单极性 H 桥按理说没有上下桥臂直通风险不需要在 MCU 侧添加死区。但驱动芯片内部实际实现的是 PWM 调制在高侧关闭、低侧开启的瞬间换向时电流没有连续续流路径导致电压尖峰。这是芯片内部的时序问题外部无法完全消除。解决的思路是确保 PWM 频率不要过高AT8236 手册建议最高 60kHz我用了 16kHz留足余量给电机两端并联一个 100nF 的高频陶瓷电容吸收振铃尖峰。这个电容要选 X7R 材质耐压高于母线电压的 1.5 倍。6. 开环 PWM 做到什么程度就该换闭环了最后说一个很重要的工程判断什么时候应该停下来不要继续在开环控制上死磕。我见过不少工程师在开环方案里反复优化试图让转速精度从 10% 修正到 3%不断加软件补偿结果系统还是对负载变化无能为力。开环控制的本质限制在于它永远无法感知负载突变。风扇叶片被异物卡住开环系统不会发现机器人轮子打滑开环系统依然输出占空比但实际速度已经变了。以下几种情况出现时应该果断从开环升级到闭环转速精度要求高于 5%或者在不同负载下需要恒定转速系统需要检测堵转、负载异常等故障状态而依赖电流采样还不能有效判断的需要位置控制即使是简单的转 N 圈停下来系统从低速到高速过程中希望速度过渡平滑不能有明显波动闭环升级的第一级通常是在电机上加编码器增量式或霍尔式然后做速度環 PID。这个过程中开环阶段积累的所有经验都是有用的PWM 频率、驱动芯片选型、电源设计、软启动逻辑这些底层架构完全不用推翻重来。你只是多了一层反馈让占空比从一个固定值变成一个由误差驱动的自动调节量。以我这次 P0 项目收尾时的状态为例开环方案交付后客户又追加了新需求——希望在负载有变化时转速能兜底稳定在设定值附近。我把编码器相关硬件加入系统把开环占空比作为 PID 的前馈量输入再把 PID 输出作为修正量叠加。最终效果是负载从轻载切换到重载时转速跌落被控制在 100 RPM 以内这比纯闭环从零调起快了一个量级也让我对为何先做好开环有了更实际的体会。如果你正在做类似项目我的建议是先花一个下午把文章里的开环链路完整走一遍把占空比、频率、死区、驱动芯片、电源地这五件事彻底搞清楚后面无论做闭环还是做多电机控制你都会少走非常多弯路。