ARTICLE DETAIL

资讯详情

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

A3144霍尔传感器测速全攻略:低成本DIY电机转速计

A3144霍尔传感器测速全攻略:低成本DIY电机转速计 搞电子DIY的人估计都经历过这种场景电机装上了转速到底多少转心里没底想加个测速模块一看编码器价格又劝退了。这个需求其实很常见风扇温控、模型车防堵转、泵类设备闭环调速甚至学生课设做电机转速表都需要一个低成本、高可靠、精度还说得过去的测速方案。A3144就是这样一颗很能打的霍尔传感器。它几毛钱一颗在一个小模块的电路里配合一颗小磁铁就能把电机转速变成一串脉冲再用单片机把脉冲频率换算成RPM。整套东西做下来材料成本不超过十块钱精度却能做到很不错低速下用周期法甚至能测到1 RPM以内的分辨率。这篇文章就把我从选型到硬件电路再到软件算法、实际踩坑的完整过程写清楚附上可以直接照抄的电路连接和代码新手看完也能自己做一套。1. 方案选型与整体测量思路1.1 为什么选A3144而不是光电传感器或旋转编码器测转速的路子其实不少最常见的几种无非是反射式光电对管、槽型光耦、干簧管、旋转编码器再加一个今天要说的霍尔传感器。反射式光电对管的问题在于环境光敏感现场稍微有点强光、灰尘波形就开始乱跳而且对安装角度要求高反射面稍微脏一点就丢脉冲。槽型光耦可靠一些但要求在转轴上装一个带齿或带缺口的遮光片机械加工量不小。干簧管就更别提了靠簧片抖动计数低速还行转速一高就彻底跟不上寿命也短。旋转编码器精度确实高但一个带码盘的增量式编码器少说几十块轴径不匹配还得定制联轴器对DIY来说性价比太低。A3144在这几个方案里几乎是平衡点最好的一个封装小、价格便宜、无接触测量、对灰尘和光线不敏感而且输出直接是数字电平不需要额外的运放调理电路。它本质上是一个单极霍尔开关传感器只要把一颗小磁铁固定在电机转轴或联轴器上传感器固定在旁边静止位置电机每转一圈磁铁经过传感器一次输出端就会产生一个脉冲。数脉冲就能算转速。1.2 A3144的内部结构与输出特性我拆过A3144的TO-92小封装它的内部其实是一个小小的集成系统稳压电路、霍尔元件、差分放大器、施密特触发器以及一个集电极开路Open Collector输出三极管全都集成在一个三引脚的小管子里。输出电压特性值得展开说一下。A3144的输出不是推挽结构它是一个OC门也就是当磁铁靠近时内部三极管导通输出端被拉到低电平当磁铁远离时三极管截止输出端处于高阻状态。正因为是高阻状态必须外接一个上拉电阻到VCC输出端才能在高电平和低电平之间正常跳变。这一点很多新手忽略结果发现传感器输出始终是0V或者始终保持高电平。另外它内部有施密特触发器磁感应强度超过某个工作点BOP时输出翻转要降到比工作点更低的释放点BRP才会跳回来。这两个点之间的差值叫迟滞作用就是防止磁铁停在临界位置时输出反复抖动。这个特性对测速很关键直接决定了脉冲边沿是否干净、计数是否可靠。1.3 从脉冲频率换算转速的数学原理测量原理说白了就是一个比例换算电机转一圈传感器输出一个或多个脉冲。假设转轴上只装了一颗磁铁也就是极对数P1那么每秒的脉冲数就等于每秒的转数转换公式为RPM 频率Hz × 60比如输出频率是25Hz转速就是1500 RPM。如果装了P颗磁铁每转一圈会产生P个脉冲那么转速要除以PRPM 频率Hz × 60 / P这里的P就是参考信号里的“极对数”。装多颗磁铁可以提高低速时的测量分辨率但后面会讲到磁铁数量不是越多越好存在动平衡和机械安装的代价。绝大多数场景下P1就够用了。2. 硬件电路设计与关键参数计算2.1 引脚定义与基本接线A3144最常见的是TO-92UA直插封装也有SOT-23贴片版本。直插版本的使用方式很简单但引脚顺序容易被忽视。以最常见的直插封装为例将印字面朝向自己、引脚朝下从左到右的三只引脚依次是1号引脚为GND2号引脚为OUT输出3号引脚为VCC电源。不过我在淘宝买过好几个不同批次的散件丝印和引脚顺序偶尔会有出入稳妥起见焊接前最好用万用表二极管档确认一下或者说直接购买引脚定义标注清楚的模块板。给A3144供电只需要在4.5V到24V之间取一个稳定电压DIY场景我用5V居多兼容所有单片机逻辑电平。基本接线是3号引脚接5V1号引脚接GND2号引脚通过一只10kΩ电阻上拉到5V同时引出到单片机的输入引脚。2.2 上拉电阻和滤波电容的取值分析上拉电阻的选值其实没有想象中那么随意它会直接影响信号上升沿的快慢。上拉电阻越大输出高电平的驱动能力越弱加上后级电路的寄生电容后上升沿会被拉长导致波形变缓高速时容易丢脉冲。我实测对比过用100kΩ上拉时普通杜邦线加面包板的环境下上升沿明显能看出爬坡转速超过3000 RPM就开始不稳定换成10kΩ后明显改善再往下换到4.7kΩ或1kΩ高频表现基本一致但功耗略微增加。综合考虑5V供电时用10kΩ是通用推荐值既保证了低功耗又能在几十kHz的脉冲频率下正常工作完全覆盖电机测速的需求。输出端的滤波电容要特别注意量级必须控制在皮法级别或者干脆不加。我在调试时试过在输出和GND之间加一个10nF电容结果波形上升沿被拖到接近100微秒3000 RPM的脉冲周期才2毫秒影响不大但到10000 RPM以上就会严重变形。建议是输出端最多加不超过100pF的瓷片电容或者直接用示波器确认波形干净不加也不会有问题。电源端倒是要认真滤波。A3144虽然内部有稳压但电源上的毛刺会影响输出切换的阈值判断我习惯在VCC和GND之间并联一个100nF瓷片电容如果电源质量差再加上一个10μF电解电容更稳妥。2.3 完整电路连接与元件清单虽然没有办法直接在这里贴出原理图文件但我把完整的电路连接用文字写清楚照着接就行等效于一份“按图施工”的连接表每个节点对应哪个位置一目了然。连接节点起点终点说明电源A3144的VCC3脚5V传感器电源正极地A3144的GND1脚GND与单片机、电源共地输出A3144的OUT2脚单片机外部中断引脚Arduino UNO为D2脉冲信号输出上拉A3144的OUT2脚5V10kΩ电阻电源滤波A3144的VCC与GND之间-100nF陶瓷电容输出滤波可选A3144的OUT与GND之间-小于100pF电容多数情况不装元件清单非常短A3144霍尔传感器1颗、10kΩ电阻1只、100nF陶瓷电容1只、小磁铁1颗、杜邦线若干。如果用模块板很多板子已经集成了上拉电阻和滤波电容只需要接四根线VCC、GND、OUT有的模块还带一颗LED指示灯更方便判断脉冲输出。2.4 电源与地线的抗干扰设计电机本身就是一个巨大的电磁干扰源尤其是电刷电机启动和堵转瞬间电流很大电刷火花会产生宽频噪声。如果传感器和电机共用一根细地线地线阻抗会导致地电位跳动霍尔输出的脉冲会莫名其妙多出毛刺。我的处理习惯是传感器由独立的5V稳压轨供电即使和电机共用一个电源适配器也保证传感器部分从稳压输出端单独取电而不是直接从电机驱动板的高电流路径上并联取电。如果现场单电源不方便可以在传感器电源入口串一个100Ω电阻再加100μF电容滤波效果也明显。传感器信号线和电机电源线不要扎在一起走走线保持一定距离。如果不得不在狭小空间里布线输出信号线用双绞线或者屏蔽线屏蔽层单端接地能有效减少计数错误。3. 磁铁选型与机械安装细节3.1 磁铁怎么选尺寸和极性磁铁是整个测速系统里容易被低估的一环。很多DIY作品做出来精度差、脉冲乱问题往往不在电路而在磁铁选得不对或者装得不稳。我推荐用钕铁硼强磁材质形状上选小圆柱体最好直径3到5毫米厚度2到3毫米这个尺寸范围非常适合固定在小型电机转轴或联轴器上。磁铁太小磁场太弱距离稍微拉远A3144就触发不了磁铁太大质量和离心力都变大高速时可能把胶甩脱。A3144是单极霍尔开关对特定极性的磁场敏感通常印字面朝向磁铁N极或S极触发方向有差异。具体用哪一面靠近传感器不要靠猜直接拿一颗磁铁在传感器表面慢慢靠近同时用万用表测OUT与GND之间的电压输出从高电平变为低电平的那一面就是正确的有效面。做一个记号安装时让这一面朝向传感器。3.2 安装位置和气隙控制的经验磁铁和传感器之间的距离叫做气隙这个距离直接决定了传感器看到的磁感应强度。气隙越小波动越大强度越强气隙太大磁场低于释放点传感器根本不动作。我实测的参考值是3毫米厚的钕铁硼小圆片配合A3144气隙在2到5毫米范围内工作都很可靠最佳大概在3毫米左右既能容忍一定的安装偏心又保证磁场余量充足。超过8毫米就只能偶发触发完全不适合做测速。固定方式上不要用普通502胶水粘磁铁电机转起来之后轻微振动就能把胶层震裂。我踩过这个坑修了一次又一次。后来用环氧树脂AB胶或者用热缩管把磁铁套在转轴上再配合强力胶双重固定就很稳了。如果转轴是铁磁性材料磁铁可以直接吸附转速不高时不需要额外固定但高速时仍然建议用胶加固。3.3 多磁铁方案的代价与动平衡问题有人为了提高测速分辨率在转轴上均匀贴了好几颗磁铁。这种思路在低速测速时确实有效单位时间脉冲数变多了计数刷新频率也高了但代价在高速时非常明显。每多贴一颗磁铁转轴就多一个质量偏心点。如果磁铁重量不一致或者位置不是绝对对称高速旋转时会产生明显振动轻则测速值抖动重则损伤轴承。我自己给一个无刷电机装过3颗磁铁转速过8000以后示波器上能看到明显的脉冲间隔不等这就是安装不对称导致的。所以除非是极低速场景我一般建议老老实实用一颗磁铁靠算法去解决低速分辨率问题。传感器支架用3D打印或者亚克力板都行关键是支架刚度要够传感器不能跟着电机一起抖。传感器松动一毫米输出波形就多一堆毛刺。4. 软件算法与转速计算实现4.1 三种测速算法怎么选有了脉冲信号剩下的就是把脉冲序列转成转速值。看似简单里面其实藏着不少细节我体感上算法选错测出来的转速能差出好几个百分点。第一种是频率法也叫定时计数法固定一个时间窗口统计窗口内有多少个脉冲再换算成RPM。这种方法实现最简单但低速时很吃亏。比如测速窗口1秒转速10 RPM的情况下每分钟只有10个脉冲1秒内可能只捕获到0到1个脉冲测出来要么是0要么是60完全没法看。第二种是周期法测量两个脉冲之间的时间间隔用间隔时间换算转速。低速时脉冲间隔长测得很准但转速一高脉冲间隔变得很短定时器分辨率限制就开始显现。转速到30000 RPM时周期只有2毫秒普通单片机测量2毫秒内的误差会直接影响读数品质。第三种是多周期平均法测量连续M个脉冲的总时间再用总时间换算转速。它兼顾了前两者的优点低速时通过累加多个脉冲来获得足够时间分辨率高速时又不会因为单个周期太短而出现较大误差。整体最推荐我在代码里用的就是多周期平均法。算法低速表现高速表现实时性实现难度频率法差脉冲太少好中等低周期法好中受计时分辨率限制好低多周期平均法好好中刷新率降低中4.2 Arduino完整测速代码下面给一个基于Arduino UNO的实用示例。硬件连接是A3144的OUT接到D2引脚D2是外部中断0输入。代码实现100ms窗口的多周期平均测速用磁极数P1作为配置值方便更换场景时调整。// A3144霍尔传感器电机测速多周期平均法 // 接线A3144 OUT - Arduino D2VCC - 5VGND - GND // 上拉电阻10kΩOUT到VCC之间 const int MAGNET_COUNT 1; // 转轴上的磁铁颗数P 1 const unsigned long GATE_TIME 100; // 测量窗口100ms volatile unsigned long pulseCount 0; unsigned long lastGateTime 0; float rpm 0.0; void pulseISR() { pulseCount; } void setup() { pinMode(2, INPUT_PULLUP); // 内部上拉配合外部10kΩ上拉更稳 attachInterrupt(digitalPinToInterrupt(2), pulseISR, RISING); Serial.begin(9600); } void loop() { unsigned long now millis(); if (now - lastGateTime GATE_TIME) { // 停中断取走计数防止计数期间数据被改乱 noInterrupts(); unsigned long count pulseCount; pulseCount 0; interrupts(); // 计算转速RPM 脉冲数 / 磁极数 / 窗口秒数 * 60 float seconds GATE_TIME / 1000.0; rpm (count / MAGNET_COUNT) / seconds * 60.0; Serial.print(Pulse: ); Serial.print(count); Serial.print( RPM: ); Serial.println(rpm); lastGateTime now; } }如果想做得更精细可以在窗口内测量第一个脉冲和最后一个脉冲之间的精确时间间隔而不是用固定窗口时间这样可以消除窗口起点和终点不在整数脉冲处带来的截断误差。原理是把定时模式改成测一组完整脉冲的起始时间和结束时间用这两个时间差作为换算分母。4.3 移植到STM32的输入捕获思路用Arduino做原型验证很方便但真正想要高精度我建议直接上带输入捕获功能的STM32。输入捕获的思路是配置一个定时器的通道为上升沿捕获每次捕获都自动把定时器计数值存到寄存器里完全由硬件完成不占用CPU精度也远高于软件中断。具体做法是配置TIM2_CH1为输入捕获模式时钟源内部72MHz预分频按需设置。每次捕获中断时读取当前捕获寄存器的值减去上一次捕获值差值就是脉冲的定时器计数个数。用计数个数乘以定时器时钟周期得到脉冲周期再按多周期平均的思路累加M个周期求平均值。这套方案在实验室里能轻松把测速精度做到千分之几远超这个DIY项目本身的需求。对于大多数场景Arduino那套代码已经够用了STM32方案适合准备做产品原型或者做毕业设计的同学。5. 标定、精度评估与常见问题排查5.1 误差从哪里来精度到底能到多少很多人以为只要电路和代码对了测出来的转速就是准的。实际上误差来源有三个层面脉冲生成环节、计时环节、以及换算环节。脉冲生成环节的主要误差来自磁铁安装的偏心转轴每转一圈磁铁相对于传感器的距离不完全一致导致脉冲间隔不是绝对均匀这在高速时表现为相邻脉冲周期的抖动。计时环节误差来自单片机晶振精度和定时器分辨率。Arduino UNO用的是陶瓷谐振器频率准确度和温漂都一般长时间测量会有千分之几的漂移换成带晶振的STM32最小系统板会好很多。换算环节就是前面讨论的计数截断误差固定时间窗口法如果窗口的起点不在脉冲边沿那么第一个和最后一个脉冲会被多算或少算一部分窗口内脉冲数越少相对误差越大。用多周期平均法后这种截断误差会被大幅压缩。实用结论是用Arduino 多周期平均法在每分钟几百转以上的区间测量误差可以控制在1%以内低速100 RPM以下想做到稳定读数靠单颗磁铁就比较吃力了要么增加磁铁数量要么换更高分辨率的编码器方案。5.2 标定步骤没有转速计也能调准焊接和代码都跑通以后建议做一次完整标定确认测量值和实际转速的关系。最简单的标定方法是找一台带数字转速显示的风扇或电机把传感器对着它的转轴装好设定几个不同档位记录下霍尔模块计算的RPM和面板显示值做几组对照。如果测出来的RPM始终是实际值的一半说明极对数设置错了可能转轴实际装了两颗磁铁或者编码器参考是每圈两个脉冲代码里的MAGNET_COUNT要改成2。如果测量值整体偏大或偏小且呈线性关系优先怀疑晶振频率不准用示波器或频率计测一下Arduino的16MHz时钟输出按偏差比例修正系数。更严谨一点可以用示波器直接查看霍尔输出端波形用示波器自带频率测量功能读出脉冲频率再和单片机串口打印的RPM交叉验证。这一步能快速区分到底是传感器问题、接线问题还是代码问题。5.3 常见问题排查速查表现象可能原因处理办法输出一直是高电平不跳变磁铁极性反了或气隙太大用万用表反向靠近测试缩小磁铁与传感器距离输出一直是低电平磁铁一直停在传感器附近或输出接错检查安装位置核对三个引脚定义万用表测不到任何电平变化上拉电阻没接或供电异常检查VCC和GNDOUT是否通过10kΩ到VCC脉冲信号杂乱、计数明显偏大电机电火花干扰、地线共用独立供电、加RC电源滤波、信号线远离电机线高速时转速明显偏低输出滤波电容过大、上拉电阻太大去掉输出滤波电容上拉电阻换成4.7kΩ转速读数来回跳磁铁松动、支架振动、窗口时间太短重新固定磁铁和支架增加平均窗口时间这几种问题我调试时基本都遇到过尤其是磁铁松动导致的读数跳变排查起来最隐蔽一度让我怀疑是传感器坏了。后来拆开发现磁铁已经歪到一边重新粘好就一切恢复正常。5.4 我做了几次实测后的心得模块搭好以后我拿一台常见的小型直流减速电机做了对比测试霍尔测速模块算出来的转速和手头一只工业光电转速计的读数做对照从几百转到几千转范围内误差基本稳定在1%以内作为DIY级别的电机测速来说完全够用。过程中我最大的体会是这个项目真正决定成败的往往不是电路和代码而是机械安装。磁铁固定得正不正、气隙稳不稳定直接决定波形质量。如果调试时发现脉冲间隔不均匀先不要怀疑魔法回去拧紧磁铁和支架多半就解决了。整套模块成本很低材料备齐一个晚上就能做完你完全可以拿它去做风扇PID闭环或者当作更复杂电机控制项目的前置模块实用性比想象中高很多。
返回列表