拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

直流减速电机PWM调速全解析:STM32配置、H桥驱动与故障保护

直流减速电机PWM调速全解析:STM32配置、H桥驱动与故障保护 1. 从玩具车到机械臂直流减速电机配PWM到底在玩什么很多人第一次接触“直流减速电机PWM”这个组合大概率是拆了玩具车、做了个循迹小车或者想给自己的3D打印机换个挤出机电机。但真正上手之后才发现电机是转起来了可转速忽快忽慢、低速时抖得像筛糠、MOS管烫得能煎鸡蛋——这些问题几乎成了每个嵌入式新手的必经之路。直流减速电机说白了就是“直流电机齿轮箱”的打包方案。直流电机本身转速高常见的有几千到上万转、扭矩小配上减速齿轮组之后转速降到几百甚至几十转扭矩放大几十倍。这个特性让它特别适合需要“慢而有力”的场景智能小车的驱动轮、云台俯仰控制、自动门锁的推杆、机器人关节……你说得上来的运动控制一半以上都在用它。而PWM脉冲宽度调制就是控制它转速最直接的手段。核心逻辑不复杂给电机供电的电压不变但通过快速开关改变一个周期内“通电时间”的比例等效于改变了平均电压。占空比高平均电压高转得快占空比低转得慢。就这么简单。但“简单”和“能用”之间隔着一整个太平洋。PWM频率选多少合适为什么低频时电机啸叫、高频时MOS管发热H桥驱动和单管驱动有什么区别STM32的PWM输出怎么配置才能不翻车遇到“飞车”故障怎么保护这些问题没有现成答案得靠实际调试一点点摸出来。这篇文章就是把我自己在直流减速电机PWM控制上踩过的坑、试过的参数、烧过的管子一次性整理清楚。从驱动电路选型到STM32CubeMX配置从频率计算到故障保护尽量给出可以直接抄的作业。不管你是刚焊完第一块驱动板的学生还是正在调机器人关节的工程师应该都能找到能用的东西。2. 核心参数选型与PWM调速原理拆解2.1 直流减速电机的关键参数怎么读拿到一个直流减速电机标签上通常标着几行参数但很多人扫一眼就过了。实际上这几个数字直接决定了你后面PWM怎么配、驱动怎么选。额定电压是最基础的。常见的有6V、12V、24V。注意这个电压是电机设计的“甜点电压”低于它扭矩会明显下降高于它转速能上去但寿命会缩短。我见过有人拿12V电机硬上24V空载时确实猛一加载就冒烟。减速比是第二个关键参数。比如标注“1:48”意思是电机内部转子转48圈输出轴才转1圈。输出转速电机额定转速÷减速比。假设电机本体是12000rpm减速比48输出就是250rpm。这个转速决定了你的应用场景250rpm大概是一秒4圈适合做小车驱动如果是机械臂关节可能需要更低比如30rpm那就选减速比更大的型号。额定扭矩和堵转扭矩要区分开。额定扭矩是能长期工作的扭矩堵转扭矩是输出轴完全卡住时的最大扭矩通常是额定的3到5倍。如果你设计的机构容易卡死必须按堵转扭矩来选驱动能力否则一卡住驱动管就烧了。还有一个容易被忽略的参数空载电流和堵转电流。空载电流可能只有几十毫安堵转电流能到几安甚至十几安。驱动电路和电源必须扛得住堵转电流的冲击不然每次机械限位就是一次炸机现场。2.2 PWM调速的底层逻辑与频率选择PWM控制电机转速的原理用一个生活化的类比想象你在推一个秋千不是一直用力推而是每隔一小段时间推一下。推的时间长占空比高秋千荡得高推的时间短秋千荡得低。只要推的频率够快秋千看起来就是连续摆动。但电机不是秋千它是个电感负载。PWM频率太低电流断续电机会发出人耳能听到的啸叫低速时还会一顿一顿的。频率太高MOS管的开关损耗成倍增加发热严重驱动电路效率下降。实测下来有刷直流电机的PWM频率一般选在8kHz到20kHz之间比较合适。8kHz以下开始进入人耳听觉范围电机啸叫明显20kHz以上开关损耗开始主导驱动管温度上升很快。我自己的小车项目习惯用15kHz左右既避开听觉敏感区又不会让MOS管太烫。还有一个坑低速启动问题。占空比低于某个阈值比如10%时平均电压不足以克服电机的静摩擦力和齿轮箱阻力电机根本不转但电流一直在走全部变成热量。这时候要么加一个启动“kick”脉冲先给个高占空比短暂冲一下要么用闭环控制自动补偿。注意PWM频率不是越高越好也不是越低越省电。选频率的本质是在“电流连续性”和“开关损耗”之间找平衡点15kHz左右对大多数有刷电机是甜点区间。2.3 驱动方案选型从三极管到专用H桥芯片驱动直流减速电机最原始的方式是用一个NPN三极管或者N沟道MOS管做低边开关。PWM信号给到栅极电机接在电源和漏极之间。这种方式只能单向转而且电机两端没有续流路径关断瞬间电感产生的反向电动势会把MOS管打穿。所以只能加续流二极管但效率低、无法正反转。要做正反转必须用H桥。H桥的本质是四个开关管组成一个“H”形电机在中间横杠上。对角导通决定转向同侧导通就是刹车。自己用四个分立MOS管搭H桥不是不行但要注意死区时间——上下管绝对不能同时导通否则电源直接短路瞬间炸管。我早期自己搭的H桥就是因为没加死区烧了六颗IRF3205之后才老实去用专用芯片。专用H桥驱动芯片是更稳妥的选择。常见的有L298N、TB6612、DRV8833、A4950这些。L298N是老牌方案能扛2A但内部压降大约2V效率低现在不太推荐。TB6612和DRV8833都是MOSFET输出压降小、发热低适合1A到3A的小型减速电机。A4950能到3.5A带过流保护是我目前在小车项目里用得最多的。对于更大功率的电机比如24V、5A以上的建议用栅极驱动芯片加分立MOS管的方案或者直接用集成大电流H桥模块。关键参数看三个持续电流、峰值电流、导通电阻。导通电阻越小发热越少但价格也越贵。3. STM32平台PWM配置与驱动实操3.1 CubeMX里配置PWM输出的关键步骤以STM32F103C8T6为例用TIM1的CH1输出PWM频率设为15kHz。CubeMX里的操作步骤不复杂但有几个参数容易配错。第一步在Pinout视图里找到TIM1的CH1引脚通常是PA8设置为“PWM Generation CH1”。注意不要选成“CH1N”那个是互补输出用于驱动H桥的高端和低端需要配合死区配置新手容易搞混。第二步进入Configuration标签下的TIM1设置。Clock Source选Internal Clock。Prescaler和Counter Period两个参数一起决定PWM频率。计算公式PWM频率 定时器时钟 ÷ (Prescaler1) ÷ (Counter Period1)STM32F103的TIM1挂在APB2总线上系统时钟72MHz时TIM1时钟也是72MHz。要得到15kHz设Prescaler 0不分频Counter Period 72,000,000 ÷ 15,000 - 1 4799所以Prescaler填0Counter Period填4799PWM频率就是15kHz。第三步PWM Generation Channel 1的Mode选“PWM mode 1”Pulse填初始占空比可以填0。CH Polarity选“High”意思是计数器值小于Pulse时输出高电平。第四步别忘了在NVIC里使能TIM1的更新中断如果需要动态调占空比或做保护逻辑。如果只是固定占空比输出可以不使能中断。生成代码后启动PWM只需要两行HAL_TIM_PWM_Start(htim1, TIM_CHANNEL_1); __HAL_TIM_SET_COMPARE(htim1, TIM_CHANNEL_1, 2400); // 50%占空比Counter Period是4799所以50%占空比就是2400。要调转速就改这个比较值0对应0%4800对应100%实际到不了100%会差一个计数周期。提示如果你用的是高级定时器TIM1或TIM8还需要调用HAL_TIM_PWM_Start之前先调用__HAL_TIM_MOE_ENABLE主输出使能否则PWM没有输出。这个坑我踩过debug了半天以为定时器没配好其实是MOE没开。3.2 驱动电路搭建与接线要点以TB6612为例接线逻辑很清晰。TB6612有两个电机输出通道每个通道需要三个控制信号AIN1、AIN2和PWMA。AIN1和AIN2决定转向PWMA决定速度。接线对照表TB6612引脚接STM32引脚说明VCC3.3V逻辑供电VM电机电源如12V电机供电GND共地逻辑地和电源地必须共地AIN1普通GPIO如PB0方向控制1AIN2普通GPIO如PB1方向控制2PWMATIM1_CH1PA8速度控制AO1电机正极接电机AO2电机负极接电机STBY普通GPIO或3.3V使能高电平工作转向逻辑AIN11、AIN20正转AIN10、AIN21反转两个都为0是滑行停止两个都为1是刹车短接电机两端。刹车和滑行的区别在实际项目里很重要。刹车是让电机绕组短路产生反向制动转矩停得快但电流大滑行是断开电机靠惯性慢慢停。小车过弯时用刹车能更快减速但电源会被反向电流冲击需要做好滤波。电源部分必须加滤波电容。电机电源输入端并一个100μF电解电容和一个0.1μF陶瓷电容逻辑电源端并一个0.1μF。电机启停瞬间的电流波动很大没有电容缓冲逻辑电路容易被拉复位。3.3 动态调速与DMA联动方案固定占空比输出很简单但实际项目里往往需要动态调速——比如小车根据传感器反馈调整速度或者做S形加减速曲线。最直接的方式是改__HAL_TIM_SET_COMPARE的值但频繁调用会占用CPU。更好的方案是用DMA把预先算好的占空比数组直接搬到CCR寄存器。配置步骤在CubeMX里给TIM1的CH1添加DMA请求方向Memory to Peripheral数据宽度Half Word16位。生成代码后定义一个占空比数组。调用HAL_TIM_PWM_Start_DMA(htim1, TIM_CHANNEL_1, (uint32_t*)dutyArray, length)。这样DMA会自动把数组里的值依次写入CCR每个PWM周期更新一次。你可以预先算好一条S形速度曲线的占空比序列让电机平滑加减速CPU只需要在DMA传输完成中断里做下一步逻辑。这个方案在做多路电机同步控制时特别有用。比如四轮小车要做原地旋转四个轮子的速度曲线可以用四个DMA通道同时输出保证严格同步。注意DMA传输完成中断里如果还要继续下一段曲线需要重新调用HAL_TIM_PWM_Start_DMA但要注意在中断里调用HAL库函数可能有时序问题建议只置一个标志位在主循环里处理。4. 调试过程中的典型故障与排查实录4.1 电机飞车最危险的故障没有之一“飞车”是指电机突然以全速运转完全不受PWM控制。这在有减速箱的电机上尤其危险因为输出扭矩大可能直接打坏机械结构。飞车的原因通常有三个。第一个是MOS管击穿短路H桥的一侧上下管同时导通电源直接加到电机两端。用万用表测MOS管的D-S极如果正反向都导通基本就是击穿了。第二个是驱动芯片逻辑混乱比如TB6612的AIN1和AIN2同时收到高电平但PWM还在给信号芯片内部逻辑可能输出异常。第三个是PWM信号丢失驱动芯片默认输出全导通。我遇到过一次飞车原因是STM32复位时GPIO处于浮空输入状态TB6612的AIN1和AIN2被外部干扰拉高同时PWM引脚没有输出驱动芯片进入了一个奇怪的状态。后来在AIN1和AIN2上加了10kΩ下拉电阻问题解决。预防飞车的措施方向控制引脚加下拉电阻PWM引脚在初始化时先设为低电平输出再切换为复用功能驱动芯片的STBY引脚用GPIO控制并默认拉低。4.2 MOS管发热严重从波形找原因MOS管发热是PWM驱动电机的常见问题。用手摸驱动芯片烫得不能碰说明要么导通电阻太大要么开关损耗太高。用示波器看栅极波形是最直接的排查手段。正常的PWM波形应该是干净的方波上升沿和下降沿陡峭。如果上升沿缓慢超过1μs说明栅极驱动电流不足MOS管在米勒平台区停留时间过长这段时间同时有高电压和大电流损耗巨大。解决办法是减小栅极电阻或者加栅极驱动芯片。对于分立MOS管方案栅极电阻一般选10Ω到100Ω之间。电阻越小开关越快但容易引起振荡电阻越大开关越慢损耗越大。实测10Ω到22Ω是比较安全的范围。另一个原因是PWM频率太高。前面说过20kHz以上开关损耗明显增加。如果你的应用对噪声不敏感把频率降到8kHzMOS管温度能降十几度。还有一个容易被忽略的点续流二极管的选型。H桥关断时电机电感产生的反向电流需要通过续流二极管回流。如果二极管的反向恢复时间太长会产生很大的反向恢复电流增加损耗和EMI。用肖特基二极管如SS34比普通整流二极管好很多。4.3 低速抖动与启动死区低速时电机抖动本质上是PWM占空比低于某个阈值后平均电压不足以维持连续转动。电机转一下、停一下看起来就是抖动。解决思路有两个。硬件上可以增加减速比让电机工作在更高的转速区间通过齿轮箱降速。软件上可以用“启动kick”策略检测到目标占空比低于阈值时先输出一个短时间的高占空比脉冲比如50%持续50ms让电机转起来再降到目标值。更高级的方案是加编码器做闭环控制。用PID算法根据实际转速动态调整占空比低速时自动补偿。这个方案成本高一些但效果最好。我自己的平衡车项目就是用编码器加增量式PID可以实现1rpm的稳定低速转动。提示启动死区的阈值因电机而异一般在5%到15%之间。可以写个简单的校准程序从0%慢慢增加占空比记录电机开始连续转动的最小值把这个值存在Flash里作为启动补偿。4.4 常见问题速查表现象可能原因排查方法解决措施电机不转PWM没启动、MOE没使能、STBY拉低示波器测PWM引脚检查HAL_TIM_PWM_Start和MOE电机全速飞车MOS击穿、方向引脚浮空万用表测MOS D-S更换MOS、加下拉电阻低速抖动占空比低于启动阈值逐步增加占空比测试加kick脉冲或闭环控制MOS管发热开关损耗大、频率过高示波器看栅极波形减小栅极电阻、降频率电机啸叫PWM频率在人耳范围调整频率到15kHz以上改Prescaler或Period逻辑电路复位电源波动大示波器看电源纹波加滤波电容、分开供电转向不受控AIN1/AIN2逻辑错误查真值表检查GPIO输出电平5. 进阶玩法从开环到闭环的控制升级5.1 编码器反馈与PID调速开环PWM控制最大的问题是转速随负载变化。电池电压从12V降到10V同样的占空比转速就掉了。加编码器做闭环是解决这个问题的正道。编码器选型看两个参数线数和接口类型。常见的有霍尔编码器和光电编码器。霍尔编码器便宜、抗干扰好适合小车光电编码器精度高适合精密控制。线数决定分辨率比如11线编码器配1:30减速比输出轴转一圈产生330个脉冲。PID参数整定是个经验活。我的习惯是先调P让系统有基本响应但不振荡再加I消除稳态误差最后加D抑制超调。对于直流减速电机P一般在0.5到2之间I在0.01到0.1之间D可以很小或者不用。注意PID计算周期要和PWM更新周期匹配。如果PID算得太快积分项会累积过快导致振荡算得太慢响应跟不上。一般PID周期设在1ms到10ms之间。5.2 故障保护机制的设计工业场景下电机驱动必须有多重保护。过流保护、过温保护、堵转保护一个都不能少。过流保护最简单的方式是用采样电阻加比较器。在电机电源回路串一个0.01Ω的采样电阻运放放大后送给STM32的ADC。ADC采样值超过阈值时立刻关闭PWM输出。响应时间要快最好在微秒级否则MOS管扛不住。堵转保护可以通过检测电流和转速的异常组合来判断。电流大但编码器没有脉冲说明电机卡住了。这时候应该先尝试反转解脱如果连续几次都不行就停机报警。软件保护之外硬件上还可以加自恢复保险丝PTC。电流超过额定值时PTC发热断开冷却后自动恢复。虽然响应慢但作为最后一道防线很可靠。5.3 多电机同步与协同控制机器人项目经常需要多个电机协同工作。比如四足机器人的十二条腿、机械臂的六个关节。多电机同步的关键是统一的时基和同步更新。用STM32的多个定时器分别输出PWM时各个定时器的计数器是独立运行的启动时刻有先后。要同步的话可以用一个主定时器触发其他定时器。STM32的TIM1可以作为主定时器通过TRGO输出触发信号其他定时器配置为从模式接收触发后同时启动。另一种方案是用一个定时器输出多路PWM。STM32的通用定时器一般有4个通道高级定时器有4个通道加互补输出总共8路。如果电机数量不超过这个数用同一个定时器的不同通道天然就是同步的。更新占空比时也有讲究。最好在定时器更新事件UEV里统一更新避免不同通道的占空比在不同时刻生效导致短暂的转速不匹配。用DMA传输可以保证所有通道在同一时刻更新。5.4 从有刷到无刷PWM控制的延伸思考直流减速电机是有刷电机结构简单、驱动容易但有刷片的磨损限制了寿命。无刷直流电机BLDC没有刷片寿命长、效率高但驱动复杂得多。BLDC的PWM控制需要六路PWM输出驱动三相H桥还要根据霍尔传感器或反电动势检测转子位置按顺序换相。STM32的高级定时器TIM1正好有六路互补输出CH1/CH1N、CH2/CH2N、CH3/CH3N配合死区配置可以直接驱动三相桥。从有刷到无刷的过渡PWM的基础知识完全通用但换相逻辑和位置检测是新的门槛。如果已经玩透了有刷电机的PWM调速下一步升级到BLDC是个很自然的方向。我在实际项目里的体会是有刷减速电机适合快速验证和低成本方案无刷电机适合对寿命和效率有要求的场景。PWM控制的核心逻辑在两者之间是相通的掌握了频率选择、死区配置、故障保护这些基本功换到任何电机类型都不会从零开始。最后分享一个调试小技巧每次改完PWM参数先用示波器看波形再接电机。波形对了再接负载能省下不少烧管子的钱。
返回列表