新闻详情

新闻详情

首页 / 资讯中心 / 详情

A3144霍尔传感器+LM393自制电机转速测量模块:从原理到Arduino代码实现

发布时间:2026/9/28 1:26:06来源:尧图网络
A3144霍尔传感器+LM393自制电机转速测量模块:从原理到Arduino代码实现
1. 项目缘起与核心需求拆解搞电机控制的人都有一个共识转速这个参数拿不到就等于闭着眼睛开车。不管是做智能小车、自制CNC主轴还是搞一个简单的传送带调速系统你总得知道电机到底转多快才能决定下一步是加速、减速还是维持。市面上一大堆现成的编码器模块价格从十几块到几百块不等但如果你手头正好有A3144霍尔传感器和LM393电压比较器花不到五块钱就能自己搭一个精度相当能打的转速测量模块。这个项目的核心思路很直接用A3144霍尔传感器感应磁铁经过时的磁场变化输出一个脉冲信号这个信号往往波形不够干净边沿不够陡峭直接送给单片机计数容易误触发所以中间加一级LM393电压比较器做整形把模拟世界里的“毛刺”变成数字世界里的“方波”最后单片机通过外部中断或者输入捕获功能计算单位时间内的脉冲数换算成转速。适合谁来参考如果你正在做Arduino智能小车、DIY电主轴、自制绕线机或者任何需要闭环调速的项目这套方案基本可以照搬。哪怕你之前没怎么接触过霍尔传感器只要会插面包板、会烧录Arduino程序跟着走一遍就能跑通。我前后做过三版从最初的面包板飞线到后来的PCB打样踩过的坑不少下面把完整的设计思路、电路细节、代码实现和调试经验全部摊开讲。2. 核心器件选型与工作原理深度解析2.1 A3144霍尔传感器为什么选它而不是别的A3144是一款开关型霍尔效应传感器TO-92封装三个引脚分别是VCC、GND和OUT。它的工作电压范围宽3.5V到24V都能跑输出是集电极开路结构也就是说输出脚内部是一个NPN三极管的集电极需要外接上拉电阻才能输出高电平。这一点很关键很多新手直接把OUT接到单片机引脚发现读不到变化就是因为没加上拉。它的工作原理基于霍尔效应当垂直于芯片表面的磁场强度超过一定阈值典型值几十高斯输出三极管导通OUT被拉到低电平磁场消失后三极管截止OUT被上拉电阻拉高。A3144是单极性霍尔只对某一个磁极通常是S极面向标记面有响应这一点在安装磁铁时要注意方向。为什么不用线性霍尔线性霍尔输出的是模拟电压随磁场强度连续变化适合测位移或者角度但测转速需要的是“有磁铁经过就出一个脉冲”开关型更合适。为什么不用光电编码器光电的对射式结构需要额外的遮光片和光耦安装精度要求高灰尘环境下容易失效霍尔方案非接触、抗污染能力强成本也低得多。2.2 LM393电压比较器信号整形的关键一环LM393是双电压比较器内部有两个独立的比较单元我们只用其中一个。它的核心功能是比较同相输入端和反相输入端的电压输出高或者低。当同相端电压高于反相端输出高阻态需要上拉反之输出低电平。在这个项目里A3144的输出信号虽然已经是数字量但实际波形往往不理想。原因有几个一是霍尔传感器输出经过长导线传输后边沿变缓可能带有振铃二是电机运行时电磁干扰大信号上会叠加尖峰噪声三是如果磁铁距离传感器较远输出脉冲幅度可能不够。LM393的作用就是设定一个参考电压比如2.5V当输入信号超过这个阈值时输出干净的高电平低于阈值时输出干净的低电平把缓慢变化的边沿“切”成陡峭的方波。LM393还有一个好处是响应速度快传播延迟典型值1.3微秒对于转速测量来说绰绰有余。它的输出也是集电极开路同样需要上拉电阻这个上拉电阻和A3144的上拉电阻可以共用一路电源但建议分开走线避免相互干扰。2.3 整体信号链设计逻辑整个信号链是这样的磁铁固定在电机转轴上随轴旋转A3144固定在旁边磁铁每经过一次传感器输出一个脉冲脉冲信号进入LM393的同相输入端反相输入端接一个由电位器分压得到的参考电压LM393输出经过上拉电阻后送入Arduino的外部中断引脚。这里有一个设计取舍参考电压用固定电阻分压还是电位器我建议用10K电位器因为不同磁铁强度、不同安装距离下A3144输出脉冲的幅度和基线会有差异电位器可以现场调节阈值适应性更强。固定分压虽然简单但一旦安装条件变化就得换电阻不灵活。另一个取舍是要不要加RC低通滤波我在第一版里加了后来发现对于高转速测量反而有害因为RC会延迟边沿导致脉冲宽度失真。正确的做法是在LM393输出之后加一个施密特触发器比如74HC14做二次整形但那是锦上添花对于大多数应用LM393加上拉电阻已经足够。3. 完整电路设计与参数计算3.1 电路原理图与元件清单先列元件清单方便你一次性备齐元件规格数量备注A3144TO-921霍尔传感器LM393DIP-81电压比较器电阻10KΩ3上拉和分压电位器10KΩ1参考电压调节电容100nF2电源去耦电容10μF1电源滤波磁铁钕铁硼小圆片2-4直径5mm左右ArduinoUno/Nano1主控面包板/洞洞板-1搭建电路电路连接分三部分电源部分、传感器部分、比较器部分。电源部分Arduino的5V输出接到面包板的正极轨GND接到负极轨。在LM393的VCC和GND之间就近放一个100nF电容在电源入口处放一个10μF电解电容这两个电容的作用是滤除电源上的高频噪声和低频波动电机启动时电流冲击大没有这两个电容比较器输出会乱跳。传感器部分A3144的1脚接5V2脚接GND3脚接一个10K上拉电阻到5V同时3脚接到LM393的3脚同相输入端。注意A3144的引脚排列有字的一面朝向自己从左到右是1、2、3不同厂家可能略有差异拿万用表测一下最保险。比较器部分LM393的8脚接5V4脚接GND。3脚是同相输入接A3144输出2脚是反相输入接电位器的中间脚。电位器两端分别接5V和GND这样中间脚电压可以在0到5V之间调节。1脚是输出接一个10K上拉电阻到5V同时接到Arduino的2号引脚外部中断0。LM393的另外一半比较器不用把5、6、7脚悬空即可但建议把5脚接GND6脚接5V防止干扰。3.2 上拉电阻的取值计算上拉电阻取10K是经过计算的。A3144输出三极管导通时集电极电流最大20mA但实际我们只需要驱动LM393的输入输入电流很小所以10K完全够用。上拉电阻上的压降等于漏电流乘以电阻值A3144输出截止时漏电流最大10μA10K乘以10μA等于0.1V也就是说高电平最低也有4.9V完全满足LM393的输入高电平要求。如果上拉电阻取太大比如100K虽然功耗低但边沿变缓因为导线电容和输入电容的存在RC时间常数变大脉冲边沿会变圆。取太小比如1K功耗增加A3144输出三极管导通时灌电流增大长期运行可能发热。10K是一个折中值实测波形干净。LM393输出上拉电阻同样取10K原因类似。但要注意如果Arduino引脚内部有上拉电阻比如使用INPUT_PULLUP模式可以省掉外部上拉但内部上拉阻值较大20K-50K边沿质量不如外部10K所以我还是建议加外部上拉。3.3 参考电压的设定与调节方法参考电压的设定直接决定了测量灵敏度和抗干扰能力。理想情况下参考电压应该设在A3144输出脉冲的中间值附近。A3144输出低电平接近0V高电平接近5V所以参考电压设在2.5V左右比较合适。但实际安装中由于磁铁距离、磁铁强度、传感器个体差异输出脉冲的幅度可能不是满幅的。比如磁铁距离较远时输出高电平可能只有3V低电平可能0.5V这时候参考电压设在2.5V就偏高会导致脉冲宽度变窄甚至丢失。正确的调节方法是先不接电机手动用磁铁靠近再远离传感器用万用表测A3144输出脚电压记录高电平值和低电平值然后取中间值作为参考电压。调节电位器时用万用表测LM393的2脚电压慢慢旋转直到达到计算出的中间值。如果没有万用表可以接上Arduino用串口打印LM393输出状态调节电位器直到串口数据在磁铁经过时稳定翻转。注意调节电位器时不要用力过猛碳膜电位器容易损坏。调好后可以用热熔胶固定一下防止振动导致阻值漂移。4. Arduino代码实现与转速计算4.1 外部中断方式读取脉冲Arduino Uno有两个外部中断引脚2号和3号。我们用的是2号对应中断0。代码的核心是每次脉冲下降沿或上升沿触发中断中断服务函数里对计数器加一主循环里每隔固定时间比如1秒读取计数器计算转速然后清零计数器。volatile unsigned int pulseCount 0; unsigned long lastTime 0; float rpm 0; void setup() { Serial.begin(9600); pinMode(2, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(2), countPulse, FALLING); } void countPulse() { pulseCount; } void loop() { unsigned long now millis(); if (now - lastTime 1000) { noInterrupts(); unsigned int count pulseCount; pulseCount 0; interrupts(); // 假设转轴上装了1个磁铁每转一圈产生1个脉冲 rpm count * 60.0; Serial.print(RPM: ); Serial.println(rpm); lastTime now; } }这段代码里几个关键点volatile关键字告诉编译器这个变量会在中断里被修改不要优化掉noInterrupts()和interrupts()包裹读取和清零操作防止中断在读取过程中触发导致计数错误FALLING表示下降沿触发因为A3144输出经过LM393后磁铁靠近时输出低电平远离时输出高电平下降沿对应磁铁靠近的瞬间比较稳定。4.2 多磁铁安装与转速换算如果转轴上只装一个磁铁每转一圈产生一个脉冲那么转速就是每秒脉冲数乘以60。但一个脉冲的情况下低速时分辨率很差比如每秒只有几个脉冲转速波动会很大。解决办法是在转轴上均匀安装多个磁铁比如4个这样每转一圈产生4个脉冲分辨率提高4倍。换算公式变成rpm count * 60.0 / MAGNET_COUNT其中MAGNET_COUNT是磁铁数量。安装多个磁铁时要注意极性一致A3144只对S极或N极取决于型号响应如果磁铁装反了那个位置就不会产生脉冲导致计数不均匀。我试过在直径30mm的转轴上装4个直径5mm的钕铁硼磁铁用AB胶固定动平衡影响很小转速测量很稳。如果转轴直径更小可以用2个磁铁对装。4.3 定时器中断方式实现更精确的测量外部中断加1秒定时的方式在低速时精度尚可但在高速时1秒内可能积累几千个脉冲计数器可能溢出Arduino Uno的unsigned int最大65535。而且1秒的采样周期对于需要快速响应的闭环控制来说太慢了。更精确的方式是用定时器输入捕获功能测量两个脉冲之间的时间间隔然后计算瞬时转速。Arduino Uno的Timer1支持输入捕获但操作比较复杂。一个折中方案是用micros()函数在中断里记录时间戳计算脉冲周期。volatile unsigned long lastPulseTime 0; volatile unsigned long pulsePeriod 0; void countPulse() { unsigned long now micros(); pulsePeriod now - lastPulseTime; lastPulseTime now; }然后在主循环里用pulsePeriod计算转速rpm 60.0 * 1000000.0 / (pulsePeriod * MAGNET_COUNT)。这种方式响应快每个脉冲都能更新转速适合闭环控制。但要注意如果电机停转pulsePeriod不会更新需要加超时判断超过一定时间没有脉冲就认为转速为零。4.4 串口绘图与数据可视化调试阶段用Arduino IDE自带的串口绘图器Serial Plotter非常方便。把Serial.println(rpm)改成Serial.println(rpm)打开串口绘图器就能看到转速曲线。如果曲线毛刺多说明参考电压没调好或者磁铁安装偏心如果曲线有周期性波动说明磁铁数量不对或者某个磁铁没触发。我习惯在代码里加一个滤波连续读5次去掉最大值和最小值取平均。这样曲线会平滑很多但会引入一点延迟。对于显示用途延迟无所谓对于闭环控制延迟要控制在可接受范围内。5. 安装调试与常见问题排查5.1 磁铁安装的偏心问题与解决磁铁安装偏心是导致测量误差的最大元凶。如果磁铁没有均匀分布在以转轴为中心的圆周上每个脉冲的时间间隔就不相等计算出的转速会周期性波动。解决方法是做一个简单的定位工装用3D打印或者用硬纸板剪一个圆盘在圆盘上按等角度打孔把磁铁嵌进去然后把圆盘固定在转轴上。如果没有条件做圆盘至少要用游标卡尺测量每个磁铁到转轴中心的距离确保一致。我试过用手直接贴磁铁结果转速波动达到正负20%后来做了个纸板定位盘波动降到正负2%以内。5.2 电磁干扰的屏蔽与滤波电机运行时电刷火花和PWM开关都会产生强烈的电磁干扰。干扰会通过两种途径进入信号链传导干扰通过电源线传入辐射干扰通过空间耦合到传感器导线上。传导干扰的抑制在电机电源两端并联一个100nF陶瓷电容和一个100μF电解电容靠近电机接线端子放置。如果电机电流大再加一个共模电感。辐射干扰的抑制A3144到LM393的导线尽量短如果必须延长用屏蔽线屏蔽层单端接地。LM393到Arduino的导线同样尽量短。我在一个24V直流电机项目里最初导线长了20cm转速读数乱跳缩短到5cm并加屏蔽后问题消失。5.3 常见问题速查表现象可能原因排查方法解决措施串口无数据电源未接通万用表测LM393的8脚电压检查5V连接转速始终为0参考电压过高测LM393的2脚电压调低电位器转速始终为0磁铁极性不对翻转磁铁试试换另一面朝向传感器转速波动大磁铁偏心观察脉冲间隔重新安装磁铁高速时计数丢失中断响应不过来降低串口波特率改用输入捕获低速时转速为0采样周期太长观察1秒内脉冲数改用脉冲周期法上电后输出一直低上拉电阻未接测输出脚电压补接10K上拉电机启动时读数乱电源干扰示波器看电源纹波加去耦电容5.4 用Wokwi仿真平台验证电路如果你手头暂时没有元件可以用Wokwi在线仿真平台先验证逻辑。Wokwi支持Arduino Uno、霍尔传感器模型和LM393模型。在Wokwi里搭建电路用信号发生器模拟霍尔输出观察Arduino串口输出。仿真的好处是不怕烧元件可以随便试参数。但要注意仿真里的霍尔模型是理想化的没有噪声和边沿变缓的问题所以仿真通过不代表实物一定通过实物调试时还是要按上面的方法调参考电压。6. 性能优化与进阶扩展6.1 提高低速测量精度的技巧低速时1秒采样周期内可能只有几个脉冲转速分辨率很低。比如每秒2个脉冲转速就是120RPM但如果实际转速是150RPM每秒2.5个脉冲计数器只能读到2或者3误差很大。提高低速精度的方法有两个一是增加磁铁数量比如从1个增加到8个分辨率提高8倍二是改用脉冲周期测量法测量两个脉冲之间的时间用micros()计时分辨率可以达到微秒级。比如两个脉冲间隔100ms对应转速就是600RPM单磁铁如果间隔101ms对应转速约594RPM分辨率约6RPM比1秒采样法好得多。但脉冲周期法在高速时micros()会溢出约70分钟溢出一次而且中断频繁触发会占用大量CPU时间。所以最佳方案是混合策略低速时用周期法高速时用计数法根据转速范围自动切换。6.2 增加LCD显示与按键设置把转速显示在1602 LCD上比串口更直观。接线很简单LCD的RS、EN、D4-D7接Arduino的数字引脚V0接电位器调对比度。代码里用LiquidCrystal库几行就能驱动。再加两个按键一个用来切换显示模式RPM/Hz/周期一个用来清零或者校准。按键接在数字引脚上用内部上拉按下时读低电平。注意按键消抖可以在代码里加20ms延时或者用硬件RC滤波。6.3 与电机闭环调速的对接测转速的最终目的往往是调速。把转速值送给PID控制器输出PWM给电机驱动模块就能实现恒速控制。Arduino的PID库很好用但参数要自己调。我的经验是先调P让转速能跟上设定值但有静差再加I消除静差最后加D抑制超调。采样周期要和转速测量周期匹配如果转速测量每秒更新一次PID采样周期也设1秒否则会振荡。注意闭环调速时电机启动瞬间电流很大可能拉低电源电压导致Arduino复位。建议电机和Arduino分开供电或者加一个大电容缓冲。6.4 从面包板到PCB的升级建议面包板适合验证但长期运行不可靠接触电阻会变化导线容易松。升级到PCB时注意几点模拟部分LM393参考电压分压和数字部分Arduino的地线要分开走最后单点接地电源入口加TVS二极管防浪涌A3144的引脚走线尽量短包地处理LM393输出到Arduino的走线远离电机驱动走线。我打样过一版双面板尺寸50mm x 30mm成本不到10块钱5片起稳定性比面包板好太多。如果你只是做一两个洞洞板焊接也够用但要注意焊点质量虚焊会导致间歇性故障。7. 实操心得与避坑经验第一个坑A3144的引脚顺序。不同厂家的A3144引脚定义可能不同有的从左到右是VCC、GND、OUT有的是OUT、GND、VCC。我买过一批便宜的按常规接法上电就发烫后来查手册才发现引脚反了。所以拿到元件第一件事是查手册或者用万用表二极管档测。第二个坑LM393的输出上拉电阻。LM393是集电极开路输出没有上拉电阻输出永远是低电平。我第一版忘了加上拉调了半天以为比较器坏了。记住A3144和LM393的输出都需要上拉这是集电极开路器件的共性。第三个坑参考电压的调节。电位器调好后电机一振动就漂移。后来我用固定电阻分压代替电位器先用电位器调好测出阻值再用固定电阻焊上去。这样虽然不能现场调节但稳定性好很多。如果确实需要现场调节用多圈精密电位器比单圈碳膜电位器稳定得多。第四个坑中断服务函数的执行时间。中断里尽量只做计数不要做串口打印或者浮点运算。我一开始在中断里算转速结果高速时Arduino直接死机。后来改成中断只计数主循环算转速问题解决。第五个坑磁铁数量与转速上限。磁铁越多分辨率越高但脉冲频率也越高。Arduino Uno的外部中断在16MHz主频下能可靠响应的脉冲频率大约在50kHz左右。如果磁铁8个转速3000RPM脉冲频率就是8乘以3000除以60等于400Hz远低于上限没问题。但如果转速30000RPM脉冲频率4kHz也还能应付。真正要注意的是中断服务函数的执行时间如果超过脉冲间隔就会丢脉冲。第六个坑电源去耦电容的位置。100nF电容要尽量靠近LM393的电源引脚引线长了就失去作用。我试过把电容放在面包板另一头结果输出还是有毛刺挪到芯片旁边就好了。10μF电解电容放在电源入口处负责低频滤波两者配合使用。第七个坑串口绘图器的波特率。Arduino IDE的串口绘图器默认波特率是9600如果代码里用115200绘图器会显示乱码。要么改代码里的波特率要么在绘图器里改设置。我习惯统一用9600虽然慢一点但兼容性好。第八个坑电机PWM频率与转速测量的相互干扰。如果电机驱动用的PWM频率正好在转速脉冲频率附近可能会产生拍频干扰。解决办法是让PWM频率远离转速脉冲频率比如PWM用1kHz转速脉冲在100Hz以下就不会互相干扰。这套方案我从最初的面包板飞线到后来的PCB成品前后迭代了三次现在用在自制的绕线机上连续运行几个月没出过问题。转速测量范围从30RPM到5000RPM误差在正负1%以内对于大多数DIY项目来说完全够用。如果你也在做类似的东西希望这些经验能帮你少走点弯路。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Harness Handbook 实战:用 TaoToken 统一 Key 让 Agent Harness 可读可查可改 2026/9/28 4:01:43

Harness Handbook 实战:用 TaoToken 统一 Key 让 Agent Harness 可读可查可改

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Flutter 三方库 dart_amqp_client 鸿蒙适配指南:TaoToken 统一 Key 打通 OpenHarmony 工业级 AMQP 消息队列通讯 2026/9/28 4:01:43

Flutter 三方库 dart_amqp_client 鸿蒙适配指南:TaoToken 统一 Key 打通 OpenHarmony 工业级 AMQP 消息队列通讯

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
问答型内容到底是什么?一次讲清楚 2026/9/28 4:01:43

问答型内容到底是什么?一次讲清楚

问答型内容到底是什么?一次讲清楚 核心摘要- 问答型内容在生成式引擎优化(GEO)中具有独特价值,是中国生成式人工智能用户规模达6.02亿人的重要信息来源。- 覆盖27个省级行政区的285个典型案例表明,问答型内容能直接带动…

阅读更多 →
Ethan开发者创新项目日报 | 2025-09-03:用 TaoToken 统一 Key 打通 Cline 与 CC Switch 配置 2026/9/28 4:01:43

Ethan开发者创新项目日报 | 2025-09-03:用 TaoToken 统一 Key 打通 Cline 与 CC Switch 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
mongoose 7.2 HTTPS TLS 握手失败排查:从 SSL_accept 报错到 config.toml 骨架 2026/9/28 4:01:43

mongoose 7.2 HTTPS TLS 握手失败排查:从 SSL_accept 报错到 config.toml 骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
百度“龙虾”全家桶亮相,多款龙虾产品上新,家用小度虾也来了:TaoToken 统一 Key 接入小度虾配置骨架 2026/9/28 4:01:37

百度“龙虾”全家桶亮相,多款龙虾产品上新,家用小度虾也来了:TaoToken 统一 Key 接入小度虾配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉