简介:这是一份基于霍尔传感器与STM32的直流电机调速系统课程设计报告,以PDF电子文档形式提供,适合自动化、电气工程、嵌入式等相关专业学生用于课程设计或毕业设计参考。报告完整覆盖系统设计全过程,包括控制器模块选型、电源方案选择、键盘与显示模块设计、驱动模块选择以及PWM调速控制方法。硬件部分重点介绍霍尔传感器信号转换电路、转速采样电路与数码管显示电路的原理和制作流程,软件部分则围绕STM32微控制器(Cortex-M3内核)的程序编写与数据处理展开,帮助读者掌握将脉冲信号转换为实际转速的算法。此外还包含系统测试与误差分析内容,展示了如何实现200rpm—3000rpm测量范围、误差不超过10rpm的设计目标。压缩包内共1个PDF文件,大小为762KB,目录层次分明,便于按章节查阅。该资源已有803人学习,是一份理论结合工程实践的高质量参考资料。
1. 转速测量的瓶颈:霍尔传感器只是把转速变成脉冲,精度由数脉冲的方式决定
把霍尔传感器、STM32、直流电机这些词摆在一起,直觉上会认为测量转速的核心是那颗传感器。反转这个结论:转速测量真正难的不是“感应”,而是“数数”。霍尔传感器做的只是把一圈旋转变成一串脉冲,之后的计数器窗口、脉冲密度、读数时序才决定你最终看到的转速准不准。用同一颗霍尔传感器,把每圈脉冲数从 2 个提到 12 个,低速段误差能缩小一个数量级;反过来,传感器再高级,采样窗口只有 0.5 秒、每圈只有 2 个脉冲时,低速误差被量化误差卡死在 60rpm。这套课程设计报告最值得拆的,不是它的成品,而是这条完整的信号链:霍尔效应到 TTL 方波、脉冲计数到转速换算、PWM 寄存器到 H 桥驱动,每一环都暴露了一个典型的嵌入式设计取舍。把它拆完,等于把数字测速系统的底层骨架摸了一遍。
2. 信号链路:霍尔效应如何变成一颗能被 STM32 计数的干净脉冲
2.1 霍尔效应的物理本质与开关型霍尔的选择逻辑
霍尔效应的核心事实是:当一块通有电流的半导体薄片被置于垂直磁场中时,载流子在洛伦兹力作用下发生偏转,在薄片两侧形成横向电势差,这就是霍尔电压。这个电压的大小正比于磁感应强度和驱动电流的乘积。电机转轴上装磁铁,磁铁每扫过传感器一次,霍尔电压就经历一次“升高—峰值—回落”的波形。报告里提到的霍尔传感器 30344E 输出正弦波,描述的就是这个原始物理量。
但单片机不关心正弦波中间的连续变化,它只认 TTL 电平的 0 和 1。于是这里出现第一个设计选择:用线性霍尔还是开关型霍尔。线性霍尔输出的模拟电压随磁场强度连续变化,要把它接进单片机,后面必须跟 ADC 采样、阈值判断、软件消抖,成本很高。开关型霍尔在内部集成了比较器和施密特触发器,磁场超过动作点输出翻转、低于释放点输出回翻,直接产生方波。课程设计选开关型霍尔,本质上是把“判断磁场有没有来”这件事从软件搬到了硬件里,用滞回特性换掉了抖动。
我一般会这么理解这个选择:开关型霍尔相当于一个无接触的接近开关,它把连续的磁场强度映射成离散事件。对转速测量来说,我们只需要“磁铁来了”这个事件发生的时刻,不需要磁场强度的绝对值。所以线性霍尔的信息冗余在这里没用,反而引入噪声;开关型霍尔是“够用且最简”的那个选项。
2.2 信号转换电路:正弦波到 TTL 方波的整形机制
报告提到传感器模块自动将正弦波转换为方波输出,这里值得展开的是“自动转换”到底做了什么。常见实现思路是:霍尔元件输出的小幅正弦信号先经过一个带有正反馈的比较器电路,比较器将信号与阈值电压比较,超过阈值输出高、低于阈值输出低,完成第一次整形。但单阈值比较有一个隐患:如果信号在阈值附近缓慢变化,输入噪声会让输出在高低电平之间反复跳动,形成一串毛刺。所以整形电路里通常会再接一级施密特触发器,引入两个阈值——动作阈值高于释放阈值,形成一个滞回窗口。
滞回窗口的意义可以这样理解:输入信号必须先超过高阈值才认定“来了”,之后必须跌回低阈值才认定“走了”。只要噪声幅度小于滞回宽度,输出就不会抖动。这颗传感器模块把比较器和施密特整形集成在一起,输出已经是干净的方波,外部电路只需要考虑电平匹配和上拉。
这里有一个经常被忽视的细节:霍尔开关的内部输出级通常不是推挽结构,而是集电极开路。模块如果是这种结构,外部必须接一个上拉电阻,才能把输出拉到逻辑高电平。上拉电阻的取值也有讲究:太小则灌电流大、增加功耗;太大会让边沿变缓,高速脉冲时上升沿跟不上信号的翻转频率。常见的做法是 4.7kΩ 到 10kΩ,兼顾边沿速度和功耗。如果模块内部已经内置了上拉,外部可以省掉,但你要先确认它的数据手册。
提示:判断霍尔输出是否需要外部上拉,最直接的方法是拿示波器看输出引脚空闲时的电平。如果悬空时呈不确定状态,或者上升沿有明显拖尾,就是缺上拉。
2.3 每圈两个脉冲:磁铁安装方式的测速代价
报告里有一个很具体的参数:在电机的扇叶上安装两组相对的磁铁,每转一圈产生 2 个下降沿。这个“2”不是随意定的,它直接决定了测速的分辨率。每转脉冲数 K 是测速系统最核心的机械参数,K 越大,每个脉冲代表的转角越小,转速量化粒度越细。装 2 组磁铁而不是 1 组,一个原因是减少“盲区”——如果只装 1 组磁铁,磁铁扫过传感器的时间只占一圈的很小比例,传感器大部分时间输出同一电平,万一磁铁位置停在传感器感应不到的角度,启动瞬间可能读不到第一个脉冲;两组相对放置后,每半圈就有一个事件,系统响应更快。
另一个原因是脉冲频率翻倍。同样的转速下,K=2 比 K=1 输出的脉冲数多一倍,测速的量化误差在数值上缩小一半。但代价也很直接:每圈只有 2 个脉冲,意味着低速时采样窗口内只能数到个位数的脉冲。200rpm 转速下,每秒约 3.3 转,0.5 秒窗口内只有 3.3 个脉冲——这在第 3 章里会被量化误差公式无限放大。想让精度再上一个台阶,就得加磁铁对数或者用带齿的码盘,把 K 从 2 提到 12 甚至更高。硬件上改一个磁铁,数学上立刻改一个精度指标,这就是机械参数与信号处理耦合的典型例子。
3. 转速换算:M 法测速的量化误差为什么在低速段失控
3.1 为什么选 M 法而不是 T 法
数字测速有两种基本思路。M 法也叫定时计数法:固定一个时间窗口 T,在这个窗口内数霍尔脉冲的个数 N,转速正比于 N。T 法也叫测周法:测量相邻两个脉冲之间的时间间隔,用高频时钟去数这个间隔里走了多少个时钟周期。两种方法各有优势区间,背后的权衡是“数脉冲”和“数时间”哪个数值更大、量化误差更小。
M 法的转速公式是 n = 60N / (T·K),其中 T 是采样窗口秒数,K 是每转脉冲数。转速越高,N 越大,量化误差占比越小。T 法则相反:转速越高,脉冲间隔越短,时钟计数值越小,量化误差反而变大。所以工程上有一句口诀:高速用 M 法,低速用 T 法。课程设计选 M 法,是因为它的目标量程是 200-3000rpm,中高速段占了大头;而且 M 法的实现极度简单——一个外部计数定时器加一个定时中断,不涉及输入捕获和边沿时间戳,对 Cortex-M3 这样的内核来说负担极轻。
但这也埋下了低速段的隐患。报告给出了测量范围 200rpm 起步,而 M 法恰恰在量程最低端最吃力。课程设计里“只用 M 法”这个决定,等于默认接受低速精度打折,换实现简单。T 法作为补充方案在报告里没出现,这属于典型的“用设计简单换指标余量”的取舍。
3.2 0.5 秒采样窗口与计数同步:读数时序的竞争条件
报告设定的采样节奏是:定时器每 0.5 秒向 STM32 发出中断请求,中断里完成计数读取和转速换算。这是一个固定窗口的 M 法实现。霍尔传感器每输出一个下降沿,外部计数定时器就加 1;中断来临时,CPU 从计数寄存器里把窗口内累计的脉冲数取走。这个流程看起来顺理成章,但读写时序上藏着一个竞争条件:假如中断发生的那一刻,一个霍尔脉冲正好到达计数引脚,那么这个脉冲算上一个窗口还是下一个窗口?
常见的实现思路是在中断服务函数里“先读计数、后清零”。示例代码如下:
extern volatile uint16_t rpm; void TIM3_IRQHandler(void) // 定时器中断,每0.5s触发一次 { uint16_t n; if (TIM3->SR & TIM_SR_UIF) { // 确认更新标志 TIM3->SR &= ~TIM_SR_UIF; // 清标志,必须在读计数前操作 n = TIM2->CNT; // 步骤1:读取窗口内的脉冲数 TIM2->CNT = 0; // 步骤2:清零,准备下一个窗口 r_g = (uint16_t)((n * 60u) / 2u); // 每转2脉冲,窗口0.5s rpm = r_g; // 实测:rpm = n × 60 } }公式推导很直接:0.5 秒内数到 n 个脉冲,每秒脉冲数是 2n;每转 2 个脉冲,每秒转数是 n;转速就是 60n rpm。所以代码里的乘法因子是 60,不是 30,也不是 120。很多第一次做这个的人在这里算错,把每转脉冲数和采样窗口混进同一个系数里。这套参数下,3000rpm 对应 n=50,200rpm 对应 n≈3.3。
但“先读后清”并非无懈可击。步骤 1 读取完 CNT、步骤 2 清零之前,如果外部计数引脚正好来了一个脉冲,这个脉冲会被计入 CNT 的旧值,然后被清零动作一起抹掉——它既不属于上一个窗口(已经被读走了),也没有留到下一个窗口,直接丢失。0.5 秒窗口在低速时只数几个脉冲,丢 1 个就偏 60rpm。要彻底消除这个竞争,得用定时器自带的“读清零”硬件联动,或者干脆把外部脉冲接到输入捕获通道,用捕获事件的时间戳来算转速,绕开清零动作。课程设计没有处理到这一层,属于硬件方案上的知识盲区。
3.3 误差预算:200rpm 时量化误差为什么远超 10rpm
量化误差是 M 法测速的天花板。窗口内脉冲数 N 一定是整数,而真实的转速对应的 N 可能是 3.3 或 3.7,取整后要么 3 要么 4。相邻整数值对应的转速差,就是量化误差的步长。公式为:
| 采样窗口 T | 每转脉冲数 K | 量化步长 Δn (rpm) | 200rpm 时相对误差 |
|---|---|---|---|
| 0.5s | 2 | 60 | 30% |
| 0.5s | 12 | 10 | 5% |
| 1.0s | 6 | 10 | 5% |
| 0.05s | 100 | 12 | 6% |
Δn = 60 / (T × K),单位是 rpm。在报告给定的 T=0.5s、K=2 下,Δn=60rpm。这意味着 200rpm 的实际转速,读数要么是 180、要么是 240,绝对误差可达 60rpm,而课程设计要求的误差是 10rpm,差了整整 6 倍。要让 Δn≤10rpm,必须满足 T×K≥6。也就是说,在 0.5s 窗口下每转至少需要 12 个脉冲;或者保持 2 个脉冲把窗口拉长到 3 秒——但 3 秒刷新一次转速显示,实时性就没了。
这个矛盾不是课程设计独有的,它是所有 M 法测速的共同约束。要打破它只有一个办法:低速段自动切换到 T 法。T 法测的是相邻脉冲的时间间隔,200rpm 时每个脉冲间隔 150ms,用 1MHz 的高频时钟去数,能数到 150000 个计数,量化误差只有 1/150000,远优于 M 法。工程上成熟的做法是 M/T 法混合:中高速跑 M 法,转速掉到阈值以下切 T 法,切换点放在两种方法误差曲线的交点附近。报告里“误差 10rpm”的指标没错,错的是固定窗口 M 法这一条路。
提示:以后看任何测速方案的指标,先算一遍 T×K 的乘积。如果数值小于 6,那 10rpm 的精度大概率只是纸面数字。
4. 调速执行:PWM 从寄存器配置到 H 桥电机驱动的完整通路
4.1 定时器 PWM 生成链:ARR、CCR、预装载与影子寄存器
测速解决的是“读转速”,调速解决的是“改转速”。这套系统调速的手段是 PWM——脉冲宽度调制,本质是直流斩波。STM32 的定时器产生 PWM 依赖于一组寄存器链,报告对这一段有非常准确的表述:ARR 决定频率、CCR 决定占空比、OCxPE 使能预装载、ARPE 使能自动重装载影子寄存器。这一串术语背后是一个“双缓冲”机制。
PWM 信号由计数器 CNT 和比较寄存器 CCR 的持续比较产生。向上计数模式下,CNT 从 0 计到 ARR 再回 0,一个周期结束。当 CNT < CCR 时输出有效电平,CNT ≥ CCR 时输出无效电平,于是 CCR/ARR 就是占空比。真正容易踩坑的是:直接写 ARR 和 CCR,新值不是立刻生效的——它们先进入预装载寄存器,等到“更新事件”才被批量搬运到影子寄存器。更新事件通常就是计数器溢出回 0 的时刻。为什么要绕这么一圈?为了让参数修改发生在周期的边界上,避免一个 PWM 周期中途突然改变频率或占空比,造成波形撕裂、电机电流冲击。
配置代码可以写成这样:
void PWM_Init(void) { RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // 开启TIM2时钟,APB1总线 TIM2->PSC = 71; // 预分频:36MHz ÷ (71+1) = 0.5MHz TIM2->ARR = 999; // 重装载值:PWM频率 = 0.5MHz ÷ 1000 = 500Hz TIM2->CCMR1 |= (6 << 4) | (1 << 3); // CH1 PWM模式1,OC1PE=1使能预装载 TIM2->CCER |= 1; // CH1输出使能,极性高电平有效 TIM2->CR1 |= TIM_CR1_ARPE; // ARPE=1:ARR影子寄存器在更新事件时装载 TIM2->EGR |= TIM_EGR_UG; // 强制产生更新事件,把ARR初值送入影子 TIM2->CR1 |= TIM_CR1_CEN; // 启动计数器 }PWM 模式 1 的定义是:向上计数时,CNT < CCR 输出有效、CNT ≥ CCR 输出无效。这里的“有效”由 CCER 里的 CCxP 位决定极性,可以是高电平有效或低电平有效,对应 H 桥上管导通还是下管导通。PSC 预分频和 ARR 共同决定了 PWM 周期:PSC 把 36MHz 时钟降下来,ARR 决定计数到多少溢出。示例里配出 500Hz 的 PWM,对直流电机是一个听感上无声、又能被绕组电感平滑滤波的频率。电机转速与占空比近似成正比,改 CCR 就能改平均电压。
4.2 占空比与电机转速:斩波的平均电压模型
直流电机的转速与电枢两端电压近似成正比,这是 PWM 调速的物理基础。PWM 不是把电压调小了,而是把电源电压以极高的频率切成一开一关的方波。电枢回路上有电阻和电感,电感对电流有平滑作用。方波的“开”阶段,电源通过 H 桥向电机输送能量;方波的“关”阶段,绕组电感维持电流继续流动。净效果是电机感受到的等效电压约为占空比乘以电源电压,比如 9V 电源、占空比 50%,等效电压约 4.5V。
但“近似成正比”里有一个非线性区:当占空比很低时,平均电压低于电机启动所需的转矩电压,电机可能静止不动;占空比接近满值时空载转速逼近理想转速。所以这套系统的调速曲线不是严格线性的,而是有一个起始死区和末段饱和。控制上如果要精确设定转速,不能直接“要 1500rpm 就把 CCR 调到 70%”,而要先标定出占空比—转速的对应关系,或者干脆加转速闭环(第 6 章会展开)。报告里“通过按键设定期望转速”只描述了用户输入,没有描述期望转速如何转换到占空比——这中间的标定和补偿,是调速系统里最容易被省略、却最影响手感的一环。
4.3 H 桥死区与续流:直通短路如何烧掉开关管
H 桥用 4 个开关管的通断组合实现电机的四象限运行。报告列出的是两组对角关系:正转时一对对角管导通,反转时另一对;同一侧的上下桥臂绝不允许同时导通,否则电源正负极直接短路。切换方向时有个物理上的麻烦:晶体管的开通时间通常比关断时间短。也就是说,下管已经导通了,上管可能还没完全关断,两管之间短暂直通,形成巨大的短路电流,足以在几个微秒内把管子烧掉。
解决的办法就是死区时间——两路控制信号都保持断开的一小段间隙,让先关断的管子彻底关断,再打开另一侧的管子。报告说这个间隙既可以用硬件延时实现,也可以用软件实现,这是完全正确的表述。硬件实现是 PWM 互补输出模式下配置死区生成器,由定时器硬件在插入死区;软件实现则是在切换步骤之间插入延时,典型代码如下:
void H_Bridge_SetDirection(uint8_t dir) { // 先关断所有桥臂,防止直通 GPIOA->BRR = PIN_HIGH_SIDE_A; GPIOA->BRR = PIN_LOW_SIDE_A; GPIOA->BRR = PIN_HIGH_SIDE_B; GPIOA->BRR = PIN_LOW_SIDE_B; for (volatile int i = 0; i < 200; i++); // 软件死区:等待管子完全关断 if (dir == 1) { // 正转:对角管H_A和L_B导通 GPIOA->BSRR = PIN_HIGH_SIDE_A; GPIOA->BSRR = PIN_LOW_SIDE_B; } else { // 反转:另一组对角管 GPIOA->BSRR = PIN_HIGH_SIDE_B; GPIOA->BSRR = PIN_LOW_SIDE_A; } }注意事项在于这个延时不是一个伪代码玩笑,它实际上就是软件死区的全部。延时长度的选取要以最慢管子的关断时间为准,通常看数据手册里的存储时间加 2 倍余量。延时太短不起作用,太长会降低 PWM 最高有效占空比、影响高速段性能。
续流二极管是另一半保命设计。当电机制动时,电机工作在发电状态,转子电流方向与驱动电压相反,如果电流没有通路,电感会产生极高的反向电动势。H 桥里每个开关管反向并联的续流二极管提供了这条通路,让电流在制动时通过二极管回流,把能量耗散掉。报告特别强调“否则电机就会发热,严重时烧毁”,这就是反电动势无处释放的后果。死区管的是“直通短路”,续流管的是“电感续流”,两者缺一不可,一个保开关管、一个保电机。
5. 排查实践:五个让测速翻车的典型坑位
5.1 坑 1:霍尔输出没有上拉,计数乱跳
现象:手转电机时转速读数乱跳,明明转得很均匀,显示值忽高忽低,甚至短暂归零。
原因:霍尔开关输出级是集电极开路结构,缺少外部上拉电阻时,输出高电平靠线路寄生电容慢慢充上去,上升沿极缓。STM32 的输入引脚在电平阈值附近出现多次翻转判定,一个干净的下落沿被数成好几个脉冲。PWM 驱动线的辐射耦合进来,进一步加剧边沿抖动。
解决:在霍尔输出与 GND 之间加 4.7kΩ 上拉电阻,把空闲电平固定在高位。如果信号线较长,再串一个 1kΩ 电阻加 100pF 电容做 RC 滤波。更彻底的做法是把信号接到定时器输入捕获引脚,利用定时器的数字滤波功能——输入捕获滤波器按采样周期连续采样多次一致才认定有效,从硬件层面滤掉窄毛刺。
5.2 坑 2:磁铁气隙过大,低速丢脉冲
现象:高速时转速正常,低速时读数周期性偏低,有时是实际值的一半。
原因:磁铁与霍尔传感器之间的距离超出规格书标称动作距离,脉冲幅值余量不足。转速低时磁铁扫过传感器的速度慢,磁场变化率低,霍尔开关的输出翻转变得不可靠,偶发丢失脉冲。每组磁铁安装半径不一致时,离得远的那组先开始丢,转速显示呈现周期性的波动而不是均匀偏小。
解决:把磁铁压到传感器封装表面 1-3mm 的范围内,并确认两组磁铁的半径一致。用示波器同时看霍尔输出和转速波形,低速时如果出现“该有脉冲却平坦”的区间,就是丢脉冲。改机械装配比改软件有效得多——先确认每一圈的 2 个脉冲都在,再谈滤波算法。
5.3 坑 3:数码管动态扫描刷新率不够
现象:TM1638 驱动的 8 位数码管看起来亮度不均,拍照有横条暗纹,眼睛疲劳时觉得数字在轻微闪动。
原因:显示刷新率低于 50Hz 时,人眼能感知到闪烁。8 位数码管如果轮流点亮每一位,完整扫完 8 位需要 8 个时间片,时间片间隔不均匀或者主循环里插入耗时计算会导致刷新率掉到 30Hz 以下。
解决:把扫描动作放进 1ms 定时器中断,每次中断点亮一位,8 位一轮正好 8ms,刷新率 125Hz,远远高于闪烁阈值。主循环只负责更新段码缓冲区的数据,不参与 IO 翻转。TM1638 的优势在于扫描显示和键扫都不需要单片机干预,占用是 3 个 IO 口,但中断里写显示寄存器的动作仍然要遵循固定节拍。
5.4 坑 4:H 桥死区缺失,开关管发热电源跌落
现象:电机一启动,9V 电源电压掉到 7V 以下,开关管外壳烫手,持续几十秒后烧管。
原因:上下桥臂切换时没有死区,导通时间短的管子还没关断,另一只已经打开,电源到 GND 直通。直通电流不受电机绕组限流,幅值巨大,PWM 周期内多次直通足以让管子结温飙升。电源电压跌落的元凶也是直通电流——稳压源被瞬间短路拉低。
解决:PWM 互补输出模式下配置定时器的死区寄存器,让硬件自动在两路信号之间插入死区间隙;或者如 4.3 节的软件方式,在每次切换前先关断所有桥臂、延时后再开目标管子。验证方法:用示波器同时量上下桥臂的栅极波形,放大到微秒级,观察是否存在两路同时为高的瞬间。
5.5 坑 5:读计数与清零的竞争条件
现象:转速读数周期性偏低,误差固定为 60rpm 的整数倍,和手动数圈对不上。
原因:中断里“读 CNT 再清 CNT”的两步操作之间存在窗口期,窗口内到达的霍尔脉冲会被读进旧值、又被清零抹掉。每丢 1 个脉冲,0.5s 窗口下转速就偏 60rpm,低速时尤其致命。
解决:优先选用硬件联动方案——把外部脉冲配置到定时器的外部时钟模式,由硬件完成计数和复位;或者用输入捕获记录边沿时间戳,用相邻时间差算转速,彻底不再依赖“读后清零”的中断流程。如果固件上必须保留读清操作,至少把外部脉冲切换到定时器闸门控制的从模式,让停止、读取、清零、重启四个动作由硬件触发器一次性完成。
注意:这五个坑的共性在于,它们都不是“代码写错”,而是“信号完整性或时序假设错了”。排查测速系统时,先拿示波器盯霍尔输出波形,再盯 PWM 栅极波形,最后才看软件计算逻辑,顺序不要反。
6. 设计取舍:重做这套系统,我会改掉三处
把整套方案的用户手册翻完,有三个地方我必须推翻重来。第一处是测速方法。固定窗口 M 法在 0.5s 和每圈 2 脉冲的参数下,量化误差 60rpm,与 10rpm 的指标硬性矛盾。我的改法是:低速段切 T 法或者提高每转脉冲数。加磁铁对是最便宜的改动——把 K 从 2 提到 12,量化步长直接压到 10rpm;再不行就 1s 采样窗口只在低速段启用。T 法不增加任何硬件成本,只多一个输入捕获中断,但能让 200rpm 的精度从天壤之别变回可用。
第二处是补上转速闭环。原报告的“调速”实际上是开环电压调节:按键设定占空比,电机转速随负载漂移。负载一变,转速跟着掉,霍尔测到的转速只用于显示,没有送回去控制 PWM,这颗反馈信号的价值被浪费了。真正的调速系统应该是:霍尔脉冲计算实际转速 → 与目标转速比较 → PID 输出修正 CCR → 占空比变化抵消负载扰动。改动量不大——把第 3 章算出来的 rpm 值接进一个 PID 函数,输出限幅后写 CCR 就行。
第三处是电源与信号路径的隔离。报告已经在控制与驱动之间加了光耦,但光耦应该放在 PWM 信号路径上,也就是单片机输出的 PWM 先过光耦再进 H 桥,这样功率级的开关噪声就不会通过共地回流干扰控制侧的霍尔计数。霍尔信号线要紧挨地线走,磁铁安装在转轴末端而不是靠近电刷的一侧,减少换向火花产生的电磁干扰。这三处改动没有一处需要换主控,成本基本为零,收益却是精度和稳定性的量级提升。
第一次带这个课程设计时,我盯着“误差 10rpm”的指标和 0.5 秒采样窗口看了半天,总觉得哪里不对,后来把量化误差公式一推,才发现低速段根本压不住。从那以后,我做任何测速方案,第一件事是先写一行“采样窗口 × 每转脉冲数”的误差预算,算出来的步长不满足指标就回头改机械参数,而不是抱着代码调滤波器。希望帮到你。
本文还有配套的精品资源,点击获取