ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

霍尔速度方向传感器JSM700:AGV速度闭环的稳定之选

霍尔速度方向传感器JSM700:AGV速度闭环的稳定之选

前阵子做了一台AGV小车的驱动轮速度闭环,一开始图省事用的光电编码器,结果车间里油污和灰尘一多,码盘动不动就丢脉冲,速度反馈跳得没法闭环。后来换了一款体积很小的霍尔速度方向传感器,型号就是“JSM700”,才算把这个事彻底搞定。这块小小的传感器直接输出两路方波A/B相,不光能测转速,还能判断正反转,接口简单到单片机直接读就行,很适合轮式移动设备、自动门、输送线这类需要速度反馈的场合。

这篇文章我就从原理、接线、读数和安装几个角度,把JSM700这类双路霍尔速度方向传感器的完整使用经验整理出来。不管你是第一次接触霍尔测速,还是已经在用但老是遇到方向误判、计数丢脉冲之类的毛病,这篇内容应该都能帮上忙。

1. 为什么测个转速方向,也要专门挑传感器

很多人第一反应是:测转速和方向,那不是编码器的活吗?确实,编码器遍地都是,但用不用得上、用得稳不稳,完全是另一回事。我先讲清楚JSM700这类传感器解决的真实问题,以及它跟光电编码器的分界线到底在哪。

1.1 一个速度反馈信号要携带哪些信息

做闭环控制时,驱动器或控制器需要知道三件事:当前转速是多少、往哪个方向转、信号更新够不够快。转速值决定了比例积分调节器的输出,方向决定了换向控制逻辑,而实时性差的话,稍一延迟整个闭环就会震荡。

JSM700这类霍尔速度方向传感器输出的就是两路方波A和B。转动一圈,A和B会各自输出若干个脉冲,脉冲频率反映转速,A和B之间的相位关系反映方向。也就是说,它天生就把速度和方向打包成了一个双通道信号,一个传感器的输出量里同时包含了两类信息,不需要额外加方向开关。

另外,两路信号本身是方波,不是模拟电压,因此可以直接进单片机的外部中断引脚或定时器捕获引脚,不需要任何调理电路。对很多工业控制器来说,“能直接被数字输入口识别”就是最大的便利。

1.2 霍尔方案和光电编码器的取舍

我承认,光电编码器分辨率可以做得非常高,一圈几百几千脉冲都很正常,而且信号是标准正交波形,方向判断非常成熟。但它有个天然的敌人:灰尘和油污。码盘一旦沾灰,光栅被挡住,波形就开始畸变,严重的直接丢脉冲。

霍尔速度方向传感器的工作原理是检测磁场变化,不依赖光路,因此对灰尘、水汽、油污的耐受性明显更好。结构上,它也不需要精密光栅和轴承,通常就是一个外壳加内部霍尔芯片,抗振动能力也强。

但代价是什么?分辨率低。霍尔传感器靠磁钢极数来决定每圈脉冲数,普通产品做一圈4到16个脉冲居多,更高的也有但指望它赶超光电编码器不现实。所以我的判断是:如果说光电编码器适合高精度高分辨率的伺服应用,那么JSM700这类霍尔传感器就更适合对精度要求没那么苛刻、但工作环境比较恶劣的场合,比如移动机器人轮子测速、输送带启停、转台角度粗测,这些场景不需要每圈几千个脉冲,稳定可靠才是第一位的。

1.3 JSM700这类传感器适合谁用

从实际定位看,它是一个“低速/中速工况的速度方向反馈件”。你在自动门、AGV驱动轮、电动叉车转向轮、锁具位置检测里经常会看到类似结构。因为输出是双路方波,可以直接替换部分增量编码器的信号接口,很多支持正交编码输入的单片机和外设控制器,比如STM32的编码器模式,本质上也是吃这类A/B相信号的。

所以我建议,如果你正在做一个轮式小车或者简单自动化设备,犹豫要不要为测速上编码器,先看看自己对分辨率的真实需求。如果只是想稳定知道“跑多快、往哪转”,霍尔速度方向传感器明显更低成本、更抗造,而且电路设计也简单很多。

2. 霍尔速度方向传感器的工作原理:磁场到90度相位差的方波

这一节我从电磁学角度把原理拆开讲。可能你会觉得传感器就是个黑盒子,接上就好,但搞懂了内部机理,后面遇到波形异常你才知道往哪个方向排查。

2.1 霍尔效应与芯片内部的整形逻辑

霍尔效应的核心我记得很清楚:通电半导体薄片放在垂直磁场中时,电子在洛伦兹力的作用下向一侧偏转,于是薄片两侧积累电荷形成横向电压,这个电压叫霍尔电压。磁场越强、电流越大,霍尔电压就越高。普通的霍尔开关芯片,本质上就是把这么一块半导体和放大器、施密特触发器集成在一起。

那为什么还要施密特触发器?因为霍尔电压本身非常微弱,大概只有毫伏级别,直接拿出去用会噪声一片。施密特触发器在这里的作用是设置一个滞回区间,比如磁场强度超过某个上限时输出低电平,降到某个下限以下时才回到高电平,中间的过渡区内输出状态保持不变。这就像给信号加了条“防抖动走廊”,保证磁钢每次扫过时输出非常陡峭的方波边沿,而不是来回抖动的模拟波形。

2.2 两个探头的位置错开是如何生成A/B相的

速度方向的判断是JSM700这类传感器的核心功能。它不是单霍尔探头,而是内部集成了两个霍尔探头,两个探头之间错开了一定的机械角度。当磁铁旋转扫过这两个探头时,它们各自产出一路方波,也就是A相和B相。

由于位置错开,两路方波的边沿在时间上不会对齐,而是存在一个固定的相位差。设计上通常把这个相位差做成90度电角度,也就是四分之一周期。当磁铁正向转动时,A相上升沿出现时B相还是低电平;反向转动时,相位关系就反过来。这一正一反直接在波形上一眼就能看出来。

我下面用一张状态表说明判断逻辑,假设系统中断捕获的是A相上升沿:

转动方向A相上升沿出现的时刻,B相电平解码结论
正向B相=低电平A领前B,正转
反向B相=高电平B领前A,反转

实际你写程序时不需要判断电平大小,只需要在A相中断里读B相引脚是高还是低,高就是反转,低就是正转,就是这么简单。

2.3 响应频率和测速范围怎么算

选这种传感器时,有个参数特别关键,就是内部霍尔器件的响应频率。普通霍尔开关的响应频率从几十千赫到几百千赫都有,但实际测速时受到机械结构和磁钢极数限制。

假设你用的是一个有四个磁极的测速盘,也就是两对N/S极,转一圈总共输出4个完整方波周期,对应A相和B相各4个脉冲。那么转速和输出频率的关系是:

f = P × n / 60

其中P是每圈脉冲数(4),n是转速(转/分钟)。如果转速是3000转/分钟,那么输出频率就是4×3000/60=200赫兹,很低对吧?但如果用的是一种高速电机,转速上到10000转/分钟,换成8极盘,输出频率就是8×10000/60约等于1333赫兹,这个频率普通霍尔芯片依然轻松应对。真正的问题是:磁钢极数越多,转速越高,输出的方波频率就越接近芯片响应上限,那时候波形会开始变形,边沿变缓甚至漏脉冲,测速数据就开始不准了。

3. 接线与信号整形:拿到传感器后最容易翻车的三个点

这一节是纯实操,全部是我自己趟过雷之后总结的。传感器本身原理简单,真正让你调试到半夜的都是接线和信号边缘的小问题。

3.1 引脚定义与供电

JSM700这个型号的典型引脚是四根线:电源正、电源负、A相输出、B相输出。也有的做成五根线,多了一根屏蔽地。供电电压常见的有5V和12V两种版本,订货时要看清楚。

我拿到的这个型号是5V供电版本,输出电平也是0到5V的方波,直接进单片机的GPIO没问题。如果你用的是12V供电版本,输出高电平可能是12V,那就要加电平转换或者分压电路,否则单片机口线可能受不了。这是我的第一个大教训:拿到传感器先看供电,别插上再说。

3.2 输出类型与上拉电阻:NPN开集一不小心就翻车

JSM700这类传感器的输出形式,市场上大概有两种:一是推挽输出,二是NPN开集电极输出。推挽输出内部有上拉和下拉管,高电平和低电平都是有源驱动的,可以直接接控制器。而NPN开集电极输出,内部只有一个NPN三极管负责把信号拉到低电平,高电平时靠外部上拉电阻才能抬起来。

如果不接上拉电阻,你在示波器上看到的波形就是一个低电平和悬空之间的缓慢爬升信号,极容易误触发。接法也简单:从输出引脚到电源正之间接一个1千欧到10千欧的上拉电阻即可。

判断自己的传感器到底是哪种输出很简单:把输出端悬空,用万用表量输出引脚对地电压。如果悬空时是高电平,大概率是推挽;如果悬空时在低电平或者电压不确定,那就是开集。实在不确定就翻产品手册,注意看“输出类型”这一栏。

3.3 控制器侧的干扰防护

传感器离电机和驱动器很近时,最难搞的是电磁干扰。电机电流换向会产生尖峰噪声,这个噪声会通过电源线传导,也会通过空间辐射耦合到信号线上,导致正常的A/B方波上叠加很多毛刺,方向判断跟着出错。

我的处理方案有三招:第一,传感器供电线上加一个100纳法陶瓷电容和10微法电解电容并联,放在传感器供电端附近;第二,A/B信号线用双绞线,屏蔽层靠近控制器端单点接地;第三,编制程序时开启单片机的输入滤波或施密特触发功能。STM32的GPIO配置里可以开输入滤波,Arduino则可以用软件消抖,实测下来毛刺基本能滤掉。

4. 用单片机读取A/B相:速度与方向的计算逻辑

接线弄完,剩下的核心就是把物理信号变成程序能用的数字。这一节我给出完整的解码思路,分别覆盖方向判断和速度计算,并用Arduino写一个可以直接跑通的示例。虽然题目说的是JSM700,但解码逻辑完全适用于所有双路90度相位差的A/B输出传感器。

4.1 方向判别:中断里读电平,还是用编码器模式

判方向最简单实用的方法是:把A相接外部中断,每次A相上升沿触发中断,在中断服务函数里立刻读取B相当前电平。读到低电平说明正转,读到高电平说明反转。

这套逻辑依赖一个前提:A相和B相的上升沿不会同时出现。90度相位差的设计正是保证这一点。如果速度太快或者程序没开中断优先级,可能会漏掉A相上升沿,方向判断就乱了。此时可以考虑把A和B都接进中断,用状态组合判断,几乎不丢信号。

如果你用的是STM32,还有一个更省事的办法,就是直接用定时器的编码器模式。把A相接CH1,B相接CH2,硬件自己会根据相位差计数,同时在寄存器里得到一个带方向的增量值。软件只需要读这一个值就能同时得到位置变化和方向,精度和速度都远高于中断查电平的软解码。

方案优点缺点适用场合
A中断读B电平实现简单高速可能漏中断Arduino、低速小车
A/B双中断查状态不丢边沿中断占用高中速测速
STM32编码器模式硬件计时需要专用定时器高性能闭环控制

4.2 测速算法选型:M法还是T法

速度值的计算比方向更值得多花一点心思。工程上常用的有两类方法:

第一是M法,也叫频率法。固定一个时间窗口,比如100毫秒,数这个窗口内有多少个脉冲,用脉冲数除以窗口时间就得到频率,再除以每圈脉冲数,就得到转速。M法在高速段分辨率很高,因为窗口内脉冲数多;但低速段如果100毫秒只有一个脉冲,测出来的速度就是10赫兹,量化误差直接跳变,控制上看起来速度一顿一顿的。

第二是T法,也叫周期法。测两个相邻脉冲之间的时间间隔,用高频时钟计数。这种方法低速时每个脉冲间隔很长,计时精度高;但高速时脉冲间距太短,高频时钟数都来不及计几个数,误差又变大。

所以在轮速闭环里,我建议低速优先用T法,高速用M法,或者直接用M/T法自动切换。不过对大多数AGV小车来说,轮速本来就不会太高,直接M法配短窗口就够用了。你要真想做平滑一点,就加上一阶低通滤波,简单可靠,不折腾。

4.3 一个可以直接跑的Arduino示例

下面这段代码实现的是:A相中断计数,B相读方向,每秒计算一次转速并打印。我用的是一个简单的M法:固定1秒时间窗口,累计脉冲数。

// JSM700霍尔速度方向传感器读取示例 // A相 -> 引脚2(外部中断0) // B相 -> 引脚3 const int PIN_A = 2; const int PIN_B = 3; volatile unsigned long pulseCount = 0; volatile bool directionForward = true; // true为正转,false为反转 // 每圈脉冲数,按你实际磁极数改 const float PULSES_PER_REV = 4.0; void setup() { pinMode(PIN_A, INPUT_PULLUP); pinMode(PIN_B, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(PIN_A), onArising, RISING); Serial.begin(115200); } void loop() { unsigned long start = millis(); unsigned long count = 0; bool dir = true; // 每1秒统计一次 while (millis() - start < 1000) { // 读取计数快照放在中断之外 } noInterrupts(); count = pulseCount; dir = directionForward; pulseCount = 0; interrupts(); float rpm = (count / PULSES_PER_REV) * 60.0; Serial.print("RPM:"); Serial.print(rpm); Serial.print(" Dir:"); Serial.println(dir ? "FWD" : "REV"); } void onArising() { // A相上升沿时读取B相:低电平=>正转,高电平=>反转 bool bLevel = digitalRead(PIN_B); directionForward = (bLevel == LOW); pulseCount++; }

需要注意,Arduino的digitalRead在中断里会消耗一些时间,如果转速很高,可能造成下一个边沿丢失。这时可以把B相电平提前缓存到一个volatile变量,或者直接用PORT寄存器读引脚,能快不少。低速场合,上面的代码完全够用。

5. 安装结构的细节:磁铁间距与气隙才是稳定性的关键

传感器接电能用只是第一步,机械安装才是长期稳定的胜负手。我用错过的磁钢和过大的气隙都经历过“刚装好一切正常,跑几天波形就烂了”的尴尬。所以这一节专门讲怎么把测速盘和传感器装好。

5.1 磁钢测速盘的极数选择

磁钢盘有各种规格,从一对极到几十对极都有。极数越多,每圈脉冲数越多,同样的转速下输出频率越高,测速分辨率也越高。但极数多带来的问题是磁钢体积小了,单个磁极的磁场强度可能下降,霍尔触发稳定性会变差。

我的经验是:AGV驱动轮上,4到8极是比较甜的范围,既能获得足够的脉冲分辨率,又不容易因为磁场强度不够出现丢脉冲。10极以上的盘,安装气隙就得压得非常小,否则触发点不稳定,方向判断会变得时好时坏。

5.2 安装气隙与同心度

霍尔传感器对距离非常敏感。磁钢表面和传感器感应面之间的距离,我实际用下来最推荐2到3毫米。太近了在振动环境下会蹭到,太远了磁场强度衰减,波形不确定。你可以用塞尺或者卡尺先调到这个范围,再通电看波形验证。

同心度同样重要。如果磁钢盘没有和旋转轴同心,磁钢在转动时离传感器的距离会周期性变化,表现为输出脉冲宽窄不一,这也是丢脉冲的一个隐藏原因。所以安装时必须保证测速盘与轴的同轴度,最好用带定位止口的支架。

5.3 支架刚度与防振

机械振动会直接表现为信号抖动。你想想,磁钢每秒钟转那么多次,传感器支架如果跟着颤,气隙就在波动,输出的方波占空比就跟着乱。因此传感器支架越短越好,材料越刚越好,尽量直接用螺丝锁在电机端盖上,而不是加一根长悬臂。

锁传感器和磁钢盘的螺丝要加弹垫或螺纹胶,我亲眼见过一颗传感器支架螺丝松了之后,波形出现周期性异常,排查了整整一个下午。最后发现是螺丝松了导致传感器探头角度偏了,重新锁紧校位之后波形完全恢复正常。

6. 实测踩坑记录:速度值跳变、方向误判的排查链路

这一节我把实测中遇到的三个典型问题完整复盘一遍。你现在觉得这些坑离你很远,等设备装到现场你就会发现,示波器探头没地方夹、干扰找不到源头、换个人机器就正常,才是工程常态。

6.1 故障现象一:静止时输出信号抖动

设备停着不动,但控制器上显示的速度值偶尔跳一下,方向也会随机翻转。刚开始我怀疑传感器坏了,换了一个新的还是一样。后来发现传感器供电线很长,直接跟电机动力电缆捆在同一根线槽里走了一段,电机一上电,动力线里的电流变化就在传感器供电线上感生出了干扰毛刺。

处理办法是把传感器供电单独走线,和动力电缆分开至少二十厘米;同时在传感器供电端加了一个100纳法陶瓷电容,毛刺明显消失。这个事给我的教训是:传感器这种弱信号器件,供电端的滤波和走线布局往往比传感器本身还重要。

6.2 故障现象二:高速段丢脉冲

设备加速到一定转速之后,测出来的速度反而比实际值低,数据开始不规则跳动。排查过程我用到了逻辑分析仪:直接抓A/B方波,发现在高速段A相偶尔会出现一整段桥式低电平,中间没有完整的高电平恢复,看起来像是霍尔芯片“卡住”了。

最后定位到是磁钢盘极数选多了,转速拉高后输出频率逼近了芯片响应上限。换个4极盘之后问题消失。这个案例说明选型书上的最大响应频率不能卡着上限用,通常要留至少两倍余量。比如你预期最高输出频率1千赫,那就选响应频率5千赫以上的型号。

6.3 故障现象三:方向偶尔反转

控制器显示小车明明往前跑,方向位却偶尔闪一下REV,跑得很顺的时候也时不时抽风。排查发现是启动瞬间电机电流冲击特别大,导致整个控制板的电平基准被抬高,B相输入引脚在A相中断读电平的瞬间误判成了高电平。

解决办法是双管齐下:硬件上在B相引脚对地加了一个100pF到1nF的小电容,滤掉高频冲击;软件上方向判断加了“连续三次一致才算有效”的逻辑,也就是方向确认滤波。这样瞬时抖动会被过滤掉,而真正的换向因为方向状态会持续保持,不会被滤掉。实测后再也没出现误判。

写在最后,一个小技巧

如果你第一次用这类霍尔速度方向传感器,我强烈建议调试阶段先拿一个手电钻或小电机临时接上,用示波器看A/B波形,确认相位差接近90度、高低电平干净,再去接单片机和闭环。别跳这一步,它省的时间和精力远超你想象。

再分享一个小技巧:如果你的控制器接口支持定时器编码器模式,哪怕只是软件模拟的小车,也用上硬件解码。不是说中断解码不行,而是硬件解码的稳定性、实时性都不是中断软解码能比的,而且CPU还能省出来干别的事。把JSM700输出的A/B相接进编码器接口,你会觉得整个项目的测速部分一下子变得非常干净。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进