☰
霍尔传感器加STM32直流电机调速:从PWM到PID闭环实战
2026/10/15 18:39:53 网站建设 项目流程

简介:一份基于霍尔传感器与STM32的直流电机调速系统课程设计报告,面向自动化、电气电子及相关专业的本科生,也适合嵌入式入门开发者参考。资源为单个PDF文档,大小约762KB,以Cortex-M3处理器为核心,完整展示从课题要求、总体方案论证到硬件电路设计与实现的流程。当前已有803人学习下载。报告重点覆盖霍尔传感器电路制作与信号转换原理、转速采样电路设计、数码管显示电路、STM32微控制器编程,以及控制器、电源、键盘、显示和驱动模块的选型对比;同时结合PWM控制方式,提出200rpm~3000rpm测量范围、误差10rpm的设计指标。通过该资源,读者可以快速掌握直流电机速度采集、显示与闭环调速的系统化设计方法,获得一套可用于课程设计或项目起步的完整参考方案。

1. 霍尔传感器加 STM32 的直流电机调速:为什么这套方案值得照着做

基于霍尔传感器和 STM32 的直流电机调速系统设计,是我在多个模拟项目里反复用过的一套低成本闭环方案。很多第一次做调速的人上来就是 PWM 开环:给个占空比,电机转起来就完事。结果负载稍微一变化,比如小车爬坡、风机进风阻力变大,转速立刻往下掉,这时候才发现开环根本守不住目标转速。霍尔传感器加一个磁钢、配合 STM32 的输入捕获定时器,就能用十几块钱的零件把转速测回来,再做 PID 闭环,把转速稳稳压住。这套方案不需要昂贵的光电编码器,不怕灰尘和油污,安装容错性也好,非常适合有刷直流电机的入门调速项目、课程设计和产品原型。

适合做这件事的人有两类:一类是手里有直流电机、想从开环 PWM 升级到闭环但预算有限的新手;另一类是已经在用编码器方案、想知道霍尔反馈能不能在成本敏感的场景里替代它做粗调速的工程师。前者能照着本文把硬件和代码跑通,后者能看到这套方案的精度边界——霍尔测速做不了高分辨率定位,但做恒速控制足够。我的判断是:只要目标不是角度定位,而是转速稳定,霍尔传感器加 STM32 就是同类方案里性价比最高的一条路。

2. 方案选型与资源规划:霍尔反馈、PWM 驱动与 STM32 定时器怎么分配

把标题拆开看,这套系统本质上是三个模块的拼装:转速检测用霍尔传感器、控制运算用 STM32、功率驱动用 MOSFET 加 PWM。三个模块单独看都不难,难的是选型和资源分配。这一章先把方案为什么这么做讲清楚,免得后面电路焊完了才发现选型错了。

2.1 三种直流电机调速方案对比:开环、霍尔反馈、光电编码器

先看最常见的三条路线:纯开环 PWM、霍尔传感器反馈、光电编码器反馈。我的建议是先把表格看明白,再对号入座。

方案成本抗污染能力安装难度速度分辨率适合场景
PWM 开环最低无影响极简单无反馈,转速随负载漂移对转速无要求的玩具、风扇
霍尔反馈低强,不怕灰尘油污简单,磁钢对气隙要求宽松每转几个脉冲,粗调速够用恒速控制、闭环入门、工业粗调速
光电编码器高弱,怕灰尘遮挡对同轴度要求高每转几百到上千脉冲定位、精密调速、伺服

我做这类项目时首选霍尔,理由很实际:有刷电机的轴伸端贴一个磁钢,霍尔传感器隔着 1 到 3 毫米气隙就能数脉冲,不需要和电机做刚性连接。光电编码器装上去如果轴心对不正,转起来会刮擦甚至损坏码盘,而且车间环境里金属粉尘一多,光栅盘很快就失效。霍尔传感器是磁感应,非接触、全密封,脏了擦一擦继续用。代价是分辨率低——每转一个磁极就只有一个脉冲,转速分辨率受脉冲频率限制,这一点要提前接受。

分辨率不够的时候也有补救办法:在电机轴上做一个塑料码盘,圆周对称嵌 2 到 6 个小磁钢,脉冲数就翻倍了。但磁钢装多了会产生动平衡问题,而且两个磁钢之间的间距如果小于霍尔传感器的触发窗口,脉冲会漏计。我一般建议先按每转 1 个脉冲起步,系统跑通了再考虑加密。

2.2 霍尔测速原理:开关型与锁存型、M 法与 T 法怎么选

霍尔传感器在直流电机测速场景里常用两类:单极开关型和锁存型。单极开关型只要有足够的南磁极靠近就输出有效电平,离开就复位,适合每转只过一个磁钢的结构;锁存型需要南磁极和北磁极交替经过才翻转电平,适合圆周上交替分布多对磁钢的码盘。做入门测速,单极开关型加上单个磁钢最省事,接线少,调试点也少。

测速算法上要选测量策略。M 法是在固定时间窗口内数脉冲个数,适合高速段,转速越高脉冲越多、分辨率越好;T 法是测量相邻两个脉冲的时间间隔,适合低速段,转速越低周期越长、相对误差越小。霍尔单磁钢结构每转只有一个脉冲,低速时脉冲间隔很长,用 M 法在 100 毫秒窗口里根本数不到几个脉冲,误差很大,所以这类结构天然适合 T 法。

T 法的换算公式很简单:转速等于 60 秒除以(脉冲周期乘每转脉冲数)。比如每转 1 个脉冲、测到相邻脉冲间隔是 20 毫秒,转速就是 60 除以 0.02 秒,等于 3000 转每分。STM32 的定时器输入捕获功能就是为测这个时间间隔设计的,硬件上数 1 微秒一个的计数脉冲,软件里把相邻两次捕获值相减就得到周期。这个方案我用了很多次,低速到 100 转每分依然有 1000 微秒以上的计数差值,稳定性足够。

2.3 STM32 定时器资源分配:PWM 输出和霍尔捕获不抢同一个定时器

选好 STM32 之后,定时器资源分配是很多人第一步就翻车的点。调速系统需要两路定时功能:一路输出 PWM 给 MOSFET,一路捕获霍尔脉冲测周期。如果这两件事放在同一个定时器的两个通道上,就会出现一个尴尬局面——PWM 的周期由自动重载寄存器决定,捕获测周期也依赖同一个计数器回绕,改占空比和改测速分辨率会互相牵扯。

我常用的分配方案是:TIM3 的通道 1 输出 PWM,引脚用 PA6;TIM4 的通道 1 做输入捕获,引脚用 PB6。两路都是 16 位定时器,互不干扰,而且 PA6 和 PB6 在常见的最小系统板上都引出来了,不用飞线。如果项目里还需要一个固定的控制节拍来做 PID 采样,就再占一个基本定时器 TIM6,让它每 10 毫秒产生一次中断,作为闭环控制周期。三路资源分配如下表。

定时器通道 / 中断功能关键参数
TIM3CH1(PA6)PWM 输出驱动 MOSFET计数频率 1 MHz,输出 10 kHz
TIM4CH1(PB6)霍尔脉冲输入捕获计数频率 1 MHz,上升沿触发
TIM6更新中断PID 控制节拍10 ms 周期更新一次占空比

这里有一个值得记住的原则:测周期和输出可调波形的定时器一旦公用,调试时任何一个参数的修改都会互相影响,排查问题会变成两倍工作量。分开之后,PWM 频率随便调,捕获测速的精度不受影响,反之亦然。这也是我为什么强烈建议初学者不要省这一个定时器。

3. 硬件搭建:从元器件清单到 MOSFET 低边驱动与电平匹配

方案定了就开始动手。硬件这一章的目标是焊出一块能稳定跑 10 到 15 伏电机的小板子,做完之后通电不冒烟、霍尔信号干净、单片机不复位。下面按元器件、接线、驱动电路三个部分讲。

3.1 元器件清单与选型理由:霍尔、MOSFET、续流二极管一个都不能省

做这个系统我用到的元器件不多,但每一件都有明确的职责,缺一件就会出现后面章节里那些经典故障。清单和选型理由列在下面。

元器件推荐规格作用注意点
主控STM32F103C8T6 最小系统板产生 PWM、捕获霍尔信号、跑 PID确认引脚引出到 PA6、PB6
霍尔传感器单极开关型霍尔,开漏输出检测磁钢,输出脉冲需要外部上拉电阻
磁钢直径 3 到 6 毫米的小圆磁片粘贴在电机输出轴上随轴旋转固定要牢靠,防止高速甩脱
功率管逻辑电平 N-MOSFET低边 PWM 驱动电机确认栅极阈值电压低于 3.3V
续流二极管快恢复二极管,电流大于电机额定电流吸收关断瞬间的电机感性电流不能省略,否则 MOSFET 容易被击穿
上拉电阻10 千欧霍尔输出上拉到供电电平霍尔供电 5V 时上拉到 5V
栅极电阻10 欧母左右抑制栅极驱动振铃放在驱动源和栅极之间
栅极下拉电阻10 千欧防止上电瞬间 MOSFET 误开通接到源极即地
电源电容470 微法电解电容吸收电机脉动电流尽量靠近电机电源端子

MOSFET 的选型是这里最容易踩坑的。很多人的第一反应是找一个便宜的大功率管,不看栅极阈值电压,结果 3.3 伏的单片机根本推不开它,管子一直工作在放大区,热得能煎蛋。正确做法是选逻辑电平型 N-MOSFET,数据手册里标明确认栅极电压在 2 到 3 伏就能完全导通的那种,并且导通电流余量留到电机峰值电流的两倍以上。

霍尔传感器选型时注意封装。贴片小体积的霍尔适合焊在转接板上贴在电机外壳旁边,直插的则方便用支架固定。我习惯先把磁钢贴在轴上,然后拿霍尔传感器靠近转起来试,找到触发稳定的气隙范围,再用热熔胶或其他方式固定位置。这个调试动作能省掉后面很多信号不稳定带来的迷惑。

3.2 霍尔传感器接线:开漏上拉、5V 容忍引脚与信号线走线

霍尔传感器的输出级通常是开漏结构,这意味着它自己没有能力输出高电平,必须靠外部上拉电阻把信号线拉到供电电压。上拉电阻选 10 千欧比较平衡:阻值太小电流大,阻值太大沿变缓,影响脉冲边沿。上拉电阻的一端接霍尔供电正极,另一端接信号线,信号线再进单片机的捕获引脚。

供电关系要理清楚。霍尔传感器可以工作在 3.3 伏也可以工作在 5 伏,我一般让它跟单片机共用 3.3 伏,输出高电平就是 3.3 伏,省掉电平匹配问题。如果项目里霍尔必须用 5 伏供电,就要确认单片机引脚是 5 伏容忍引脚,PB6 这一类的 FT 引脚可以,但普通引脚不行,会烧输入级。这一点在原理图阶段就要核对,不能等焊完再测。

走线上有一条血泪经验:霍尔信号线绝对不能和电机电源线平行走,哪怕只平行 10 厘米,电机换向火花都能让霍尔脉冲上叠加一串毛刺。正确的做法是信号线单独走,和电机线拉开距离,必要时用双绞线把霍尔信号和地线绞在一起,让干扰耦合在两根线上相互抵消。另外霍尔传感器和磁钢之间的气隙如果过大,脉冲会时有时无,表现为转速突然掉到一半又跳回来。

3.3 MOSFET 低边驱动:栅极电阻、下拉电阻与续流路径

单向调速用低边驱动就够了,也就是 MOSFET 放在电机和地之间,电机正极接电源,负极接 MOSFET 漏极,源极接地,栅极接单片机的 PWM 引脚。这种结构最简单,只有一个开关管,不需要半桥或者全桥那样复杂的高端驱动。做双向调速才需要 H 桥,那要解决死区问题,是另一个复杂度等级。

栅极电路我习惯加两个电阻:驱动源到栅极之间串一个 10 欧姆的电阻,用来抑制栅极电容充放电引起的振铃;栅极到地并一个 10 千欧的下拉电阻,防止单片机还没初始化时栅极悬空导致 MOSFET 意外导通。很多人觉得下拉电阻多余,实际遇到上电瞬间电机猛转一下的问题时就会发现,这个电阻是救命的。

续流二极管的位置和方向是新手最容易接反的。电机是感性负载,MOSFET 关断瞬间电流不能突变,如果没有续流路径,漏极电压会瞬间冲到几十伏,把管子击穿。二极管要并接在电机两端,方向要让电机正常通电时它是截止的:电机正极端的二极管阴极接电机正极,阳极接电机负极,这样关断瞬间电机的感性电流从二极管回路续流,直到电流衰减完。注意用快恢复二极管,普通整流二极管的反向恢复时间太长,在 10 千赫兹的开关频率下会发烫。

电源和地线处理决定整块板的可靠性。电机电源和单片机电源建议分开:电机用一个独立的稳压电源,单片机用另一个 3.3 伏来源,两边的负极要在电机电源负极端单点相连,然后再引出到单片机地。我见过不少人直接共用一个电源,结果电机一启动,电压跌落直接让单片机复位,后面调了三天代码才发现是硬件问题。

4. 固件实现:PWM、霍尔测速与 PID 调参落地的关键代码

硬件就绪之后,固件部分是整个系统的灵魂。这一章给出三块可以抄作业的代码:PWM 初始化、霍尔脉冲捕获、PID 控制。每块代码后面都解释参数怎么算、改哪里,直接照着改就能跑。

4.1 输出 10kHz PWM:预分频和重载值这样算才不会烧管子

先算清楚时钟。STM32F103 的定时器时钟在系统主频 72 兆赫兹时也是 72 兆赫兹。PWM 频率由预分频值和自动重载值共同决定:计数频率等于 72 兆赫兹除以预分频值加一,PWM 频率等于计数频率除以重载值加一。我常用的组合是预分频 71、重载 99,这样计数频率是 1 兆赫兹,PWM 频率是 10 千赫兹,占空比分辨率有 100 级,每级百分之一。

/* PWM:TIM3_CH1 -> PA6,输出 10kHz,占空比可调 */ void PWM_Init(void) { // 预分频 71:72MHz / 72 = 1MHz 计数频率 htim3.Init.Prescaler = 71; // 自动重载 99:1MHz / 100 = 10kHz PWM 频率 htim3.Init.Period = 99; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(&htim3); TIM_OC_InitTypeDef oc = {0}; oc.OCMode = TIM_OCMODE_PWM1; // 计数值小于比较值时输出有效 oc.Pulse = 0; // 初始占空比 0,先别让电机转 oc.OCPolarity = TIM_OCPOLARITY_HIGH; oc.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim3, &oc, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); }

代码逻辑是先配置定时器基础参数,再配置输出通道的工作模式,最后启动输出。Pulse 字段是占空比的直接体现,实际占空比等于 Pulse 除以 100,所以 Pulse 从 0 到 99 对应 0% 到 99%。修改占空比的入口是 HAL 的通道比较值函数,把 Pulse 填进去即可。

PWM 频率不是越高越好。低于 1 千赫兹时电机会发出明显的可听啸叫,高于 50 千赫兹时 MOSFET 的开关损耗占比迅速上升,管子发热并且驱动电路也要跟上。10 到 20 千赫兹是直流电机调速的工程经验区间,我默认 10 千赫兹起步。如果电机转动时噪音大,再往 15 到 20 千赫兹调;如果 MOSFET 发烫,先降频率而不是先换管子。

4.2 霍尔脉冲输入捕获:1MHz 计数、回绕处理与数字滤波

霍尔脉冲用 T 法测周期,硬件上要配置成上升沿捕获。定时器以 1 兆赫兹计数,每次上升沿到来时把当前计数值锁存到捕获寄存器,两次捕获值之差就是脉冲周期,单位是微秒。这个配置下,低速脉冲周期很长时计数差值依然充足,测速精度有保证。

/* 霍尔脉冲 -> PB6 (TIM4_CH1),1MHz 计数,上升沿捕获 */ void IC_Init(void) { // 预分频 71:计数频率 1MHz,每 tick = 1us htim4.Init.Prescaler = 71; htim4.Init.Period = 0xFFFF; // 16 位自由计数,溢出回绕 htim4.Init.CounterMode = TIM_COUNTERMODE_UP; HAL_TIM_IC_Init(&htim4); TIM_IC_InitTypeDef ic = {0}; ic.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING; // 上升沿触发 ic.ICPrescaler = TIM_ICPSC_DIV1; // 不分频 ic.ICFilter = 0x08; // 数字滤波:连续 8 次采样一致才确认边沿 HAL_TIM_IC_ConfigChannel(&htim4, &ic, TIM_CHANNEL_1); HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_1); // 开启中断 }

逻辑说明:预分频把计数频率定在 1 兆赫兹,每计数一次就是 1 微秒;重载值设成 0xFFFF 让计数器在 65535 处回绕,配合回绕处理代码就能无限测量。数字滤波 ICFilter 是应对霍尔信号毛刺的第一道防线,它让输入信号连续 8 次采样一致才判定为有效边沿,窄毛刺会被直接忽略。调大滤波值可以滤更宽的干扰,但也会引入边沿延迟,影响低速测量精度,一般 0x04 到 0x0F 之间调。

捕获中断里做差值计算,关键是要处理计数器回绕。如果本次捕获值比上一次小,说明计数器在两次捕获之间回绕过一次,差值要加上 65536 再减一次回绕修正。这是 16 位定时器测周期的经典写法,漏掉这一步,每次回绕后转速都会瞬间变成一个错误的巨大数值。

volatile uint32_t g_hall_period_us = 0; // 最近一次霍尔脉冲周期,单位 us volatile uint32_t g_hall_ready = 0; // 置 1 表示已经有有效测量 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM4) { static uint32_t last_tick = 0; uint32_t this_tick = TIM4->CCR1; // 本次上升沿的捕获值 uint32_t delta; if (this_tick >= last_tick) delta = this_tick - last_tick; // 常规情况 else delta = (0x10000 - last_tick) + this_tick; // 处理计数器回绕 if (delta > 10) { // 小于 10us 的差值当毛刺丢弃 g_hall_period_us = delta; g_hall_ready = 1; } last_tick = this_tick; } }

回绕处理的代码逻辑是:比较两次捕获值大小,如果本次小于上次就加上 65535 的补码差。中间的抖动过滤条件 delta 大于 10 微秒才更新测量值,这样连续毛刺造成的极短差值就不会污染转速数据。注意回调里的逻辑要尽量精简,不要在中断里做浮点运算和除法,那些放到主循环里做,避免中断占用时间过长影响其他功能。

周期到转速的换算很简单,放到主循环里执行。每转 1 个脉冲时,转速等于 60 秒除以脉冲周期秒数。脉冲周期 20 毫秒对应 3000 转每分,200 毫秒对应 300 转每分。这个换算在低速段表现很好,但转速很高时脉冲间隔变得很短,计数差值只有几百甚至几十微秒,量化误差就大了,那时才需要切到 M 法去数脉冲。多数入门项目不需要混合测速,T 法够用。

4.3 位置式 PID 加抗积分饱和:控制周期 10ms 的参数怎么设

闭环控制我习惯用位置式 PID,配积分限幅和输出限幅。之所以不用教科书上那种不带限幅的写法,是因为直流电机调速的实际工况里,启动瞬间反馈转速接近零,误差很大,积分项会在几秒内快速累积,把输出推到满占空比,之后转速冲过头要花很长时间才回落,表现为一冲一冲的震荡。积分限幅和输出限幅就是为了掐住这两种情况。

typedef struct { float Kp, Ki, Kd; float integral; // 积分累积值 float last_err; // 上一次误差 float out_min, out_max; // 输出限幅 } MotorPID; /* 位置式 PID 更新,带抗积分饱和 */ float MotorPID_Update(MotorPID *pid, float target, float feedback) { float err = target - feedback; // 目标转速 - 实测转速 pid->integral += err; // 积分累积 if (pid->integral > 100) pid->integral = 100; // 积分限幅 if (pid->integral < -100) pid->integral = -100; float diff = err - pid->last_err; // 微分项用前后误差差 pid->last_err = err; float out = pid->Kp * err + pid->Ki * pid->integral + pid->Kd * diff; if (out > pid->out_max) out = pid->out_max; // 输出限幅 0~100 if (out < pid->out_min) out = pid->out_min; return out; }

主循环的骨架是把 PWM 初始化、输入捕获初始化、然后循环读取速度、执行 PID、写占空比。控制周期我用 10 毫秒,也就是每秒更新 100 次占空比。这个周期和有刷电机的机械时间常数匹配得很好,不会因为控制太快导致微分项放大噪声,也不会因为控制太慢跟不上负载扰动。

MotorPID g_pid = {0.5f, 0.02f, 0.01f, 0.0f, 0.0f, 0.0f, 0.0f, 100.0f}; int main(void) { HAL_Init(); SystemClock_Config(); // 配置 72MHz 主频 PWM_Init(); // TIM3 输出 10kHz PWM IC_Init(); // TIM4 捕获霍尔脉冲 uint16_t target_rpm = 3000; while (1) { if (g_hall_ready) { float period_s = g_hall_period_us / 1000000.0f; float now_rpm = 60.0f / (period_s * 1.0f); // 每转 1 个脉冲 float duty = MotorPID_Update(&g_pid, target_rpm, now_rpm); __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, (uint16_t)duty); } HAL_Delay(10); // PID 采样周期 10ms } }

参数设置的顺序比数值本身更重要。我从不让新手直接抄参数,而是教他们三步走:先把 Ki 和 Kd 设成 0,只留 Kp,从 0.2 开始逐渐加到转速出现临界震荡;出现震荡后把 Kp 减半作为工作值;再恢复 Ki,从 0.02 起步慢慢加,直到稳态误差消失;最后加一点 Kd 抑制超调。这套流程走下来,参数有物理意义,出了问题也知道往哪个方向调。

5. 调试与避坑:霍尔毛刺、PID 震荡、上电复位与 MOSFET 发热

固件写完不代表系统能跑。这一章写四个我在类似项目里真实踩过的坑,每条都按现象、原因、解决来梳理。如果你照着做遇到问题,先来这一章对照。

5.1 现象一:速度数值乱跳,霍尔毛刺把上升沿数多了一倍

现象:串口打印的转速在几千转之间毫无规律地跳变,但电机实际转速肉眼看是稳的。有时候转速突然变成正确值的两倍,过一会儿又正常。

原因:霍尔信号线上叠加了毛刺脉冲,输入捕获把这些毛刺当成新的上升沿,导致测出的脉冲周期只有真实周期的一半甚至更短。毛刺来源有两个,一是电机碳刷换向火花通过空间耦合到信号线,二是信号线和电机电源线在同一个线槽里平行走了十几厘米。

解决:先在硬件上补上拉电阻和信号线双绞,再把输入捕获的 ICFilter 从 0 调到 0x08,最后在信号线对地并一个 10 纳法电容做 RC 滤波。改完这三处,毛刺基本消失。判断毛刺是否清除,不要靠看转速数值,要用逻辑分析仪直接看捕获引脚的波形,数一数一个周期内是否只有一个上升沿。

5.2 现象二:电机一冲一冲,PID 震荡或者输出顶满下不来

现象:给定目标转速后,电机不是平稳加速,而是在零转速和最大转速之间来回冲,听起来像电机在喘气;或者转速冲到目标值附近后一路超调,很久才回落到稳定值。

原因:最常见的是 Kp 太大,控制系统处于震荡临界点附近;其次是积分项没有限幅,启动大误差让积分迅速饱和,输出一直顶在满占空比;还有可能是 PID 控制周期和电机的机械惯性完全不匹配,比如控制周期只有 1 毫秒而电机响应要几百毫秒,微分项会把测量噪声放大成剧烈的输出跳动。

解决:把 Ki 和 Kd 清零,只用 Kp 重新整定,按照临界震荡减半的方式收敛;恢复 Ki 时同步加上积分限幅,我一般限在正负 100;控制周期固定成 10 毫秒,不许在中循环里用随机延时替代。给出一个能跑的起始参数表:Kp 0.5,Ki 0.02 到 0.05,Kd 0 到 0.01,输出限幅 0 到 100,积分限幅正负 100。这套参数在多数小直流电机上都能稳定起步。

5.3 现象三:占空比一拉大,单片机直接复位重启

现象:占空比低于 50% 时系统正常,一旦加大到 60% 以上,单片机立刻复位,串口重新打出启动信息,电机也跟着重新起步。反复几次后电源模块发烫。

原因:电机启动或者突然加负载时的电流是额定电流的数倍,如果电机和单片机共用同一路电源,瞬间压降会低于单片机复位门限;另一个可能是共地线太细,电机大电流在地线上产生压降,把霍尔信号和单片机的参考地都拉偏了。

解决:把电机供电和单片机供电彻底分开,电机用独立电源,单片机用独立稳压;两边的地线在电机电源负端单点相连,而且连接线用粗线;电机电源两端并上 470 微法的电解电容吸收瞬态电流;软件上做软启动,占空比从 0 开始每 10 毫秒加 1%,而不是直接跳到一个大步进。软启动这个习惯我后面一直保留,它同时保护了电源、MOSFET 和机械结构。

5.4 现象四:MOSFET 烫手,风扇不吹不敢碰

现象:电机运行一两分钟后,MOSFET 的封装表面温度高到手指不能触碰,即使电机负载并不大。

原因:主要嫌疑有三个。第一是 PWM 频率太高,比如调到 50 千赫兹以上,开关损耗随频率线性上升;第二是栅极驱动能力不足,单片机引脚直接推大栅极电容,边沿变缓,MOSFET 长时间工作在放大区而不是饱和区;第三是选型翻车,用了导通电阻大的普通 MOSFET,额定电流余量不够。

解决:先把 PWM 频率降到 10 到 15 千赫兹,看温度是否明显下降;然后在栅极驱动路径上加推挽三极管或者专用栅极驱动芯片,把栅极充放电电流提上去;最后核对数据手册,确认选的是逻辑电平型且导通电流余量充足。要澄清一个误区:低边单管驱动不存在上下管直通问题,不需要死区时间,网上很多 H 桥调试文章里的死区设置在这里用不上,别浪费时间调那个参数。

6. 把调速系统做扎实:三个进阶验证技巧和我的调试习惯

系统能转起来之后,距离一个可靠的调速系统还有一步。这一章讲三个我每次做调速项目都会做的验证动作,都不复杂,但能把系统从能转提升到心里有数。

6.1 逻辑分析仪同时抓 PWM 与霍尔波形

第一个动作是用逻辑分析仪同时测量 PWM 引脚和霍尔输入引脚。我一般看三件事:PWM 占空比和设置值是否一致,霍尔上升沿间隔是否均匀,以及有没有夹在正常脉冲之间的窄毛刺。占空比计算用高电平时间除以整个周期,和代码里 Pulse 除以重载值的理论值对照。霍尔波形能看到电机在不同负载下脉冲周期是否平稳,负载加重时周期变长,闭环生效后应该被 PID 拉回来。这一条能避免你对着串口转速数据猜半天,因为波形是物理事实,数值是软件产物。

6.2 先开环标定、再闭环调参

第二个动作是在接 PID 之前,先做一次开环标定。把 Kp、Ki、Kd 全部置零,手动设固定占空比,从 20% 到 80% 每档记录一次稳态转速,画一条转速对占空比的曲线。这一步有三个收获:确认每转脉冲数设置得正确,确认霍尔信号在全部调速范围内都有效,更重要的是验证了反馈方向。闭环投入时如果反馈极性接反,会变成正反馈,转速直接冲顶,有了开环标定数据和上下限保护,至少能判断是方向问题还是参数问题。我每次做完这个标定,心里就开始有底了。

6.3 串口打印三个关键变量,看阶跃响应再调参

第三个动作是把目标转速、实测转速、输出占空比三个变量通过串口周期打印出来,观察从零转速阶跃到目标转速的响应曲线。超调大就降 Kp、加 Kd,稳态有误差就加 Ki,这些判断在数据面前会变得非常明确。我习惯串口打印一行文本就够了,别用上位机花哨界面,调试越简单越能聚焦问题。还要养成的习惯是目标转速不做瞬间阶跃,而是让它在程序里做斜坡上升,比如每秒爬升 500 转每分,这能避免启动时的电流冲击和机械冲击。

这三个动作做完,这套霍尔传感器加 STM32 的直流电机调速系统就算真正闭环了。我后来做其他电机项目也都保持着先波形、再开环标定、最后闭环调参的顺序,这个顺序帮我省下过很多排查时间,尤其是电机和单片机共地、霍尔走线混乱这类硬件历史遗留问题多的项目里,少走一半弯路。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询