ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PWM电机开环控制实战:驱动电路、参数与调试全攻略

PWM电机开环控制实战:驱动电路、参数与调试全攻略 做电机控制这几年手头接过不少“P0”级别的任务但“P0PWM电机开环控制”这个标题在我心里的分量一直很重。它不是那种挂着P0名头、实际半天就能糊弄完的杂活而是整个电机驱动项目的地基。你把这个地基打得稳后面上闭环、上速度环位置环、上各种故障诊断都是水到渠成的事你要是这里偷了懒后面每一个环节都会回来找你算账。说白了PWM电机开环控制就是“用一定频率的方波去控制直流电机的平均电压从而控制转速并且不依赖任何反馈”。很多入门资料把它写得特别简单好像就是GPIO翻转一下的事但真正在项目里把它做到可靠、稳定、能达到量产水平的至少要在驱动电路、PWM参数、保护逻辑这三个方向上有清晰的认识。这篇文章我就把这套东西完整拆开讲一遍结合我实际调试中的经验和踩过的坑尽量让刚接触这块的朋友少走弯路。1. 开环控制到底是什么先把底层逻辑打通1.1 开环与闭环的本质差异开环控制Open-Loop Control和闭环控制Closed-Loop Control最核心的区别就是“有没有反馈通路”。开环系统像一个只管发指令、不管结果的领导。你给电机一个固定占空比的PWM信号电机就按某个转速转至于这个转速是不是你想要的、中间有没有因为负载变大而掉速系统一概不关心。它的结构特别简单给定输入PWM占空比→ 功率驱动 → 电机。没有传感器没有反馈回路没有纠偏机制。闭环系统则多了一条从输出回到输入的反馈通路。拿电机转速闭环举例编码器或者霍尔传感器实时测量电机转速把实际转速送回控制器和期望转速做差差值经过PID调节器计算出一个新的控制量再去调整PWM占空比。这样即使负载波动、电源电压下降系统也能通过反馈不断修正把转速拉回目标值。我用了个很俗但很贴切的类比开环控制像盲人推车你使多大劲车走多快全靠你手上的感觉和电机的“脾气”闭环控制像正常人开车眼睛盯着仪表盘速度慢了就踩油门快了就松油门。眼睛就是反馈通路这个反馈就是让你能“纠偏”的关键。从项目角度看开环不是“低级”的代名词。很多对精度要求不高的场景——风扇、水泵、某些电动工具——开环完全够用而且成本低、系统简单、可靠性高。而所有复杂的闭环控制最终输出到执行器的信号依然是PWM。所以搞懂开环本质上是搞懂闭环的“执行末梢”。1.2 为什么P0阶段非选开环不可P0的意思是最高优先级通常意味着项目启动第一步就要搞定的事情。新项目切入电机控制时我从来不会建议一上来就上闭环PID。原因有几个第一闭环控制依赖模型参数。你要调PID至少要知道电机的响应特性比如从给PWM到转速稳定需要多久、摩擦力有多大、负载惯量是多少。这些参数在没有实际硬件的情况下全靠猜猜出来的PID参数根本没法用。而开环控制不需要任何模型给占空比就转简单直接正好用来摸清电机的“脾气”。第二开环是排查硬件问题的前提。你写了三段式PID上电发现电机在震荡你分不清是PID参数不对还是驱动电路有毛病还是PWM时序不对。这种时候问题变量太多根本没法定位。先把电机放在开环状态下用固定占空比驱动确认功率级、电流波形、MOS管发热全部正常再往上叠加算法才能逐步隔离问题。第三从项目管理的角度P0阶段的目标是打通链路而不是追求性能。链路就是单片机出PWM → 驱动芯片放大 → 电机转动。这条链路通畅了后面所有工作才有载体。先跑通再跑好这是我做项目的铁律。1.3 PWM占空比与电机转速的关系PWM控制直流电机转速的原理说穿了就是“斩波调压”。直流电机的转速近似正比于电枢两端的平均电压。PWM信号高低电平交替高电平占比就是占空比Duty[ U_{avg} Duty \times U_{VCC} ]比如12V供电占空比50%电机两端的平均电压就是6V空载转速大致就是全速的一半。注意这里说的是“近似”因为电机的反电动势、绕组电感、换向器和电刷的压降都会影响实际转速尤其在小占空比的时候死区效应比较明显转速和占空比的线性度会很差。占空比的计算公式很简单[ Duty \frac{T_{ON}}{T_{ON} T_{OFF}} \times 100% \frac{CCR}{ARR 1} \times 100% ]这里T_ON是高电平持续时间T_OFF是低电平持续时间。用定时器产生PWM时ARR决定PWM周期CCR决定高电平时间占空比就是CCR与ARR的比值。这个公式是后面所有调速计算的基础必须烂熟于心。2. 硬件方案选型与驱动电路设计2.1 H桥电路的基本原理PWM调速只能改变电机的速度但实际项目里电机经常还要反转这就需要一个能改变电枢电流方向的电路——H桥也就是四个开关管搭成的“H”形电路。H桥的四个开关管分别是左上、左下、右上、右下。导通左上和右下时电流从左往右流过电机电机正转导通右上和左下时电流反向电机反转。如果四个管子全部关断电机处于自由滑行状态如果同侧上下两个管子同时导通那就等于电源直接短路这叫“直通”是H桥电路最可怕的故障会在瞬间烧毁MOS管。为了避免直通控制信号必须保证“先关后开”即先关断正在导通的管子等一小段时间再打开另一个管子。这个等待时间就是“死区时间”。死区时间的设置必须在硬件和软件层面同时保证绝不能用“单片机执行速度快”这种理由来省略。H桥的另一种工作模式是制动即下管全开、上管全关电机两端接GND形成一个耗能回路电机快速减速。这种模式在动态控制里非常有用开环阶段简单了解即可。2.2 驱动芯片选型对比集成芯片还是分立MOS很多初学者会纠结一个问题到底是用分立MOS管搭H桥还是用集成驱动芯片我的建议很简单除非你有非常特殊的需求超大电流、超高压、极低成本否则一律用集成驱动芯片。集成驱动芯片的好处太多了内部集成了死区逻辑、过流保护、过温保护大大降低了外围电路的复杂度和调试难度芯片厂已经帮你验证过可靠性不用自己画四个MOS管去踩各种坑。我自己在实际项目中用过最多的几款芯片如下芯片型号最大电压最大电流开关管类型适合场景L298N46V2A双极性三极管教学、低压大电流试验TB661213.5V3.2AMOSFET小型机器人、5V/12V电机AT823618V6AMOSFET电动工具、稍大功率电机DRV887437V3.6AMOSFET车规级、需要电流检测的场景L298N是教科书里最常出现的芯片但说实话它内部用的是三极管饱和压降大损耗高发热严重尤其是在低压供电的场合1.5V到2V的压降会让电机的实际可用电压缩水很多。TB6612的MOS内阻比L298N低一个数量级体积也小对于5V、12V的小型直流电机来说是性价比很高的选择。AT8236这类国产芯片近年来做得越来越成熟内部集成了过流保护和温度保护适合功率稍微大一点的项目。如果是做那种几十瓦甚至几百瓦的直流电机那就必须上分立MOS管了。N沟道MOS管要放在低边对地高边需要用自举电路或者专用的半桥驱动芯片比如IR2104。这个复杂度比集成芯片高一个台阶P0阶段尽量不碰。2.3 关键参数计算与外围器件硬件设计不能只看芯片型号外围参数算不对照样出问题。第一个参数是电机的工作电流。选芯片和MOS管时必须知道电机的堵转电流也就是转子卡住时的最大电流。堵转电流可以用万用表直接测也可以用公式估算[ I_{stall} \frac{U_{VCC}}{R_{armature}} ]其中R_armature是电机电枢电阻一般数据手册会给出或者用万用表测也行。比如一个12V、电枢电阻2Ω的电机堵转电流就是6A。那么选型时芯片或者MOS管的持续电流至少要有1.5到2倍的裕量也就是9A到12A。千万不要卡着极限选电机启动瞬间的浪涌电流常常是额定电流的好几倍。第二个参数是续流二极管。电机是感性负载PWM关断瞬间电感中的电流不能突变必须有一个续流通路。如果没有续流二极管关断瞬间会产生极高的尖峰电压直接击穿MOS管。集成芯片内部一般已经集成了续流二极管但如果是分立MOS方案必须在每个MOS管旁边并联一个快恢复二极管站在电机的角度正负极之间可以直接反并联一个TVS管进一步吸收瞬态能量。第三个参数是储能电容。PWM斩波会让电源线上的电流呈现脉冲状如果电源内阻大母线电压就会剧烈波动严重时单片机复位、驱动芯片欠压保护。处理办法是在电源输入端并联一个电解电容和一个陶瓷电容的组合。电解电容容量用经验公式每安培电流配100uF到220uF。比如最大电流6A的系统至少并一个1000uF的电解电容在靠近H桥电源引脚的位置再放一个0.1uF瓷片电容。2.4 死区时间设置的工程细节死区时间到底设多少要看开关管的关断延迟和开通延迟。对于常见的集成芯片死区时间一般由芯片内部逻辑自动处理例如DRV8874的死区时间典型值在几百纳秒。对于使用半桥驱动芯片如IR2104加MOS管的方案死区时间需要自己设置常见范围是200ns到2us。死区时间过短有直通风险死区时间过长又会影响PWM波形的精度造成输出电压失真。一个实用的工程判断方法是把死区时间从大往小调同时用示波器观察H桥上下桥臂的栅极波形确保两个波形之间始终有明显的“断开间隙”再预留50%的余量。死区时间的实际生效位置也要确认有的芯片是PWM输入内部自动插入死区有的需要外部逻辑在死区期间强制关断两个管子。这个实现路径差别很大务必仔细看手册的时序图。我在调试中遇到过一次芯片内部已经集成死区、但代码里又错误地加了软件延时的情况结果PWM波形变成了一堆毛刺电机嗞嗞作响。这个坑很典型后面会细说。3. PWM信号生成与软件实现3.1 定时器产生PWM的原理单片机产生PWM核心是定时器的比较匹配机制。以STM32的通用定时器为例计数器从0递增到自动重装载值ARR再归零重新计数形成一个锯齿波。与此同时有一个比较寄存器CCR计数器计数的过程中实时和CCR比较计数小于CCR时输出高电平大于等于CCR时输出低电平。于是ARR决定周期CCR决定高电平时间PWM的频率和占空比就固定下来了。用公式表示就是[ f_{PWM} \frac{f_{CLK}}{(ARR 1) \times (PSC 1)} ][ Duty \frac{CCR}{ARR 1} \times 100% ]举个例子STM32的定时器时钟是72MHz我想输出20kHz的PWM预分频PSC设0那么ARR就应该是72MHz除以20kHz再减1也就是3599。占空比50%CCR就设1799或者1800误差在0.03%以内完全够用。这里有个注意点ARR是决定分辨率的瓶颈。占空比分辨率是1/(ARR1)ARR越大占空比调节的粒度就越细。但ARR越大在同样时钟频率下PWM频率就越低。调频率和调分辨率是矛盾的实际选型时要找到平衡点。3.2 PWM频率选择的依据与技巧PWM频率不是随便拍的它对电机的影响非常明显。频率太低比如几百赫兹电机电流纹波太大噪音刺耳转速脉动明显严重时电机会“一跳一跳”地转。频率太高比如几百千赫MOS管的开关损耗剧增芯片发热严重驱动能力反而下降。我的经验是直流有刷电机的PWM频率选10kHz到20kHz之间。10kHz以上已经超出了人耳的听觉上限听不到那种经典的“啸叫”声同时这个频段对MOS管是友好的开关损耗不算大。如果你用的是带霍尔传感器的无刷电机BLDCPWM频率通常也是20kHz和功率管的开关能力匹配。带齿轮箱的减速电机要特别小心齿轮箱的机械共振频率可能在几十赫兹到几千赫兹。如果PWM频率或占空比引起的扭矩脉动刚好落在共振点附近齿轮箱会发出很大的嗡嗡声。处理办法是调整PWM频率避开共振区或者在软件里加一个斜坡加速让转速快速通过共振区。还有一个细节如果你用PWM给舵机或者WS2811这类数字LED提供信号那完全是另一套逻辑。舵机要求50Hz频率、0.5ms到2.5ms的高电平脉宽WS2811需要800kHz的专用时序。这些场景千万不要和电机PWM混为一谈否则灯不亮或者舵机乱转。3.3 硬件PWM与软件模拟PWM的取舍用定时器硬件外设输出PWMCPU只需要在初始化时配置好寄存器之后完全不用管PWM波形由定时器硬件自动产生。这种方式精确、稳定、不占CPU是大功率电机驱动的标准做法。还有一种办法是用GPIO配合软件定时器中断在中断里翻转IO来模拟PWM。这种方式胜在灵活任意的引脚都能输出PWM没有定时器资源的限制。但它的缺点也很致命占空比和频率的精度受中断响应延迟影响而且PWM产生过程一直占用CPU中断里干不了其他事。如果主循环里还要做显示刷新、按键扫描、CAN通信那软件PWM的质量会很差。我的建议是P0阶段的电机PWM绝对用硬件定时器。STM32的HAL库里TIM1和TIM8是高级定时器TIM2、TIM3、TIM4、TIM5是通用定时器。高级定时器比通用定时器多了重复计数器和死区发生器还支持互补输出直接就能驱动半桥电路。如果只是驱动一个小电机用CCR寄存器的比较输出功能普通定时器就够了如果要接H桥并且引脚上有互补输出就直接用高级定时器。3.4 嵌入式代码实例用STM32输出PWM下面是一段基于STM32 HAL库的PWM输出配置代码用TIM3输出两路互补但不带死区的PWM占空比50%频率20kHz早期验证链路足够了。void Motor_PWM_Init(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; TIM_OC_InitTypeDef sConfigOC {0}; TIM_HandleTypeDef htim3; __HAL_RCC_TIM3_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); // PA6 - TIM3_CH1, PA7 - TIM3_CH2 GPIO_InitStruct.Pin GPIO_PIN_6 | GPIO_PIN_7; GPIO_InitStruct.Mode GPIO_MODE_AF_PP; GPIO_InitStruct.Pull GPIO_NOPULL; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, GPIO_InitStruct); __HAL_AFIO_REMAP_TIM3_ENABLE(); // 具体型号不同可能需要remap htim3.Instance TIM3; htim3.Init.Prescaler 72 - 1; // 72MHz/72 1MHz htim3.Init.CounterMode TIM_COUNTERMODE_UP; htim3.Init.Period 50 - 1; // 1MHz/50 20kHz htim3.Init.ClockDivision TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(htim3); sConfigOC.OCMode TIM_OCMODE_PWM1; sConfigOC.Pulse 25; // 占空比50%CCR25 sConfigOC.OCPolarity TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(htim3, sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_ConfigChannel(htim3, sConfigOC, TIM_CHANNEL_2); HAL_TIM_PWM_Start(htim3, TIM_CHANNEL_1); HAL_TIM_PWM_Start(htim3, TIM_CHANNEL_2); }这段代码里PSC设成了71ARR设成了49所以计数器时钟是1MHzPWM频率是1MHz/5020kHzCCR25对应50%占空比。启动之后PA6和PA7就会输出两路完全同步的PWM波形可以用来控制H桥的左右两个半桥。实际项目里一个电机至少需要三个控制信号PWM调速信号、方向信号正反转、使能信号快速刹车或关闭输出。PWM用定时器资源方向信号和使能信号用普通GPIO即可逻辑简单不占用定时器。4. 故障保护与可靠性设计4.1 过流保护不让冒烟的第一道防线电机驱动系统出了故障最常见的结果就是电流失控堵转、短路、半桥直通都会让电流飙升到电源能提供的最大值几毫秒内就能烧毁MOS管和铜箔。开环系统没有转速反馈无法通过“转速异常”间接判断电流问题所以过流保护必须靠硬件电路实现。最通用的方案是低边采样电阻加比较器。在H桥低边MOS管的源极和地之间串联一个小阻值采样电阻比如0.01Ω或0.02Ω。电机的电流流过采样电阻在电阻上产生电压电压等于电流乘以电阻。比如0.02Ω电阻10A电流时压降0.2V这个电压和参考电压比较一旦超过阈值比较器翻转立刻拉断PWM输入或者直接触发单片机的紧急刹车输入引脚。这个电路的设计要点是采样电阻的功率。电流平方乘以电阻就是电阻上的发热功率。10A电流流过0.02Ω电阻功率是2W所以要选额定功率至少3W到5W的电阻否则开一会儿电阻自己就烧糊了。采样电阻要尽量靠近H桥的地走线要短而粗。PCB上这一段走线的电阻也要计入采样电阻内所以很多量产方案会用四线开尔文接法来消除走线电阻的误差。如果只是P0验证阶段走线粗一点问题不大。还有一个常见的坑电机启动瞬间的浪涌电流很大有时候会比堵转电流还要高但持续时间只有几毫秒。过流保护的触发时间要选对太灵敏了启动就误保护太迟钝了真短路时又保护不住。集成驱动芯片内部的过流保护一般已经做了延迟处理比如几十微秒到几百微秒的滤波时间直接用默认配置即可。4.2 过温保护与电流限制的联动MOS管和驱动芯片的过温保护同样重要。MOS管的导通电阻会随着温度升高而变大温度越高导通损耗越大发热越严重形成正反馈如果不加限制很容易热失控。集成芯片一般内置过温保护温度超过阈值直接关断输出。但分立MOS方案就麻烦了得自己加NTC温度传感器贴在MOS管的散热片上用ADC采样温度。软件里做一个简单的滞回比较温度超过100℃降低PWM占空比上限超过120℃直接关断输出。这个保护策略在工程上叫“降额控制”比直接关机更人性化避免了设备频繁启停。开环系统虽然不能通过测转速来感知负载变化但可以通过电流间接感知。如果软件定期读取电流采样的ADC值发现电流持续超过额定值就逐步降低PWM占空比这相当于一个“软过流”策略。注意这已经算半个闭环了但它的目的不是精确调速而是保护系统P0阶段完全够用。4.3 上下电时序与启动浪涌处理上下电时序是很多新手忽略的问题。单片机刚上电时GPIO状态是不确定的可能是高也可能是低。如果PWM和方向引脚上电瞬间都是高电平H桥就会直通电机猛地转一下轻则吓一跳重则烧驱动。解决方法是给电机驱动芯片的使能引脚EN接一个下拉电阻确保上电时驱动芯片处于关断状态等单片机初始化完成、把PWM配置好之后再软件拉高EN引脚。另一种情况是断电时序系统正在运行突然掉电PWM停止输出但电机还在惯性转动反电动势会通过续流二极管倒灌到电源。处理方法是让单片机的掉电检测电路比如电源监控芯片在检测到掉电时立刻把所有PWM输出全部置为无效电平或者把H桥的下管全部打开让电机能量通过制动回路快速消耗掉。电机启动瞬间的浪涌电流也要重视。直接从0占空比跳变到50%电流冲击非常大而且对机械结构有冲击。软件里做一个斜坡启动也叫软启动即占空比从0开始每隔一个时间间隔增加一点比如每10ms增加1%500ms到达目标占空比。这种看似不起眼的细节能显著提高系统可靠性减少机械磨损。5. 实测调试与问题排查实录5.1 转速测量与开环标定方法开环控制的“盲”是相对的虽然不依赖反馈但调试阶段你总得知道电机转了多少转不然连占空比和转速的对应关系都摸不清。最简单的测速方法是买一个带霍尔传感器的直流电机霍尔输出频率正比于转速单片机或者示波器直接测量频率即可。如果电机没有编码器可以自己用红外对管加一个码盘或者更土的办法是用光电转速表贴在电机转轴上的反光贴手持式仪表直接读转速。拿到转速后我建议做一个“开环标定表”从0开始每5%占空比记录一次稳定转速一直测到100%把数据整理成一张表。这张表就是你后面做闭环控制时的“先验模型”。PID整定时用一个固定的控制量占空比去激励电机观察转速响应曲线得出电机的增益和时间常数这些参数都是基于这张初始化标定表的。标定过程中有一点要注意不同占空比下的转速稳定性不一样。低占空比时电机本身的摩擦力矩占比大转速波动明显高占空比时电源电压的波动会更直接影响转速。反复测几轮取平均值能减少随机误差。5.2 典型故障现象与排查速查表做电机驱动调试遇到问题不可怕可怕的是没有排查思路。我把自己踩过的坑整理成了一个速查表每次调试遇到问题就对着查效率非常高。故障现象可能原因排查方法电机完全不转无电流使能引脚没拉高PWM引脚配置错误万用表测EN电平示波器测PWM波形电机不转但电源电流很大H桥直通PWM死区时间不够方向引脚冲突测上下管栅极波形断开电机测空载电流电机只往一个方向转方向引脚逻辑错误H桥某一路MOS损坏交换方向引脚电平测四个MOS管D-S压降电机转速明显偏低供电电压不足PWM频率过高导致开关损耗大测母线电压降低PWM频率对比测试电机啸叫明显PWM频率落在可听频段占空比过低导致电流断续提高PWM频率到16kHz以上或加软启动芯片异常发烫开关频率过高占空比过低导致续流损耗大散热不够测效率优化PWM频率加散热片电流一大就复位电源电压跌落单片机欠压复位加大母线电容独立给驱动级供电电机反转时有异响方向切换瞬间没有制动H桥切换时序混乱确保方向切换前先关断PWM加死区延时这几种情况里H桥直通是最危险、最容易烧板子的一定要优先排查。用示波器同时看两个下管的栅极波形确保高电平的时间完全不重叠。如果其中一个管子意外击穿短路另一个管子会在下个半周期直接承受直通电流几毫秒就烧所以直通问题必须消灭在原理图阶段而不是在产品阶段。5.3 实测波形分析与调参笔记调试时最有用的一件工具是示波器软件模拟永远替代不了。上电后第一件事是把PWM引脚接到示波器上确认频率和占空比和预期一致再检查PWM波形有没有毛刺、有没有严重的过冲。高频的振铃往往意味着PCB走线电感过大或者去耦电容放得离驱动芯片太远。第二个要看的波形是电机两端的电压波形。开环PWM驱动时电机两端应该是一串等幅的矩形波低电平为0高电平接近电源电压。如果波形出现了明显的“平台”或者圆角说明电机的电刷接触不好或者电机内部的换向器磨损了。电机有刷电机长时间高占空比运行后电刷磨损是个大问题波形会逐渐恶化。第三个要看的是电流波形。用电流探头或者采样电阻直接看电流波形特别是启动瞬间和换向瞬间。启动瞬间电流会有一个很大的尖峰之后慢慢回落到稳态值换向瞬间电流会反向跳动这是正常的。但如果电流波形里有高频震荡可能是PWM频率和电机电感电容产生了谐振需要调整PWM频率或者加一个RC吸收电路。调参的经验法则先调PWM频率再调死区时间最后调软启动速率。PWM频率以“电机不叫、MOS管不烫”为准死区时间以“上下管不直通、输出波形不小”为准软启动速率以“机械不冲击、电流不超限”为准。这三个参数相互独立分别调到位系统就基本能稳定工作了。后面如果项目要继续往上走加上PID做闭环那我在开环阶段留下的标定表和电流数据就派上大用场了。PID的初始参数可以直接从开环响应里估出来比如电机从给50%占空比到转速稳定需要多长时间这个时间就是积分时间常数的量级参考转速随占空比变化的倍数就是比例增益的量级参考。所以我在实际做项目时一直提醒团队开环阶段的调试数据绝不是临时数据一定要整理归档它们是你项目后续所有工作的基础。从P0的“让电机转起来”到后面的“让电机精确地转”这中间的路不算短但每一段都有明确的方法和工具。把开环这步走扎实了后面不管上什么算法、配什么传感器心里都有底。
返回列表