霍尔编码器电机怎么测速?Arduino读脉冲算转速加闭环调速

算法老K硬件DIY 2026-10-10 16:20:21 7阅读 举报

攒车攒了半个月,机器狗四腿都能动了,可一让它走直线就歪,加一点油门又窜出去,怎么调都像喝多了。朋友听完只点了一句:你没给电机装个"眼睛",它在瞎走。这句话点醒了我——光给PWM调速没用,得让控制板知道电机到底转了多少圈,这就是今天想聊的霍尔编码器电机测速。

先搞懂:霍尔编码器电机到底多了个啥

普通直流减速电机只有两根电源线,给多少电压转多快,全靠猜。霍尔编码器电机就是在电机尾部或者减速箱输出轴上,多装了一个带磁环的小圆盘,旁边放两个霍尔传感器(A、B相),电机一转,磁环跟着转,霍尔能数出"过了几颗磁极"。就这么一数,转速就有了依据。

市面上常见的是带霍尔编码器的直流减速电机,比如JGB37-520这类,减速比常见1:30,编码器每圈输出11线或20线(PPR)。记住一个换算:电机每转一圈,编码器实际输出的脉冲数 = PPR × 减速比。拿减速比30、PPR20的算,输出轴转一圈,控制板能收到600个脉冲。这就是测速的基础。

为什么要两相(A、B)?因为A相和B相之间相位差90度,不仅能数转了多少,还能靠谁先跳来判断转向,这就是编码器能判正反转的原理。想精确定位,就再插一根Z相做每圈零点,但一般DIY小车用A/B两相就够。

Arduino怎么读脉冲算转速:两种测法

测速本质就一句:在固定时间内数脉冲数,再换算成圈数和分秒。Arduino上最推荐用外部中断,把电机A相接到支持中断的引脚(uno的2和3号脚),每来一个脉冲进一次中断函数,用变量做累加计数。

测法一:定时计数法。用millis()或者定时器,固定每200毫秒读一次累加器,减掉上次值,得到这段时间的脉冲增量,再套公式:转速(rpm) = 增量 × 60000 / (200 × PPR × 减速比)。这样算出来的是平均转速,够定位和调速用。

转速(rpm) = 计数脉冲 × 60000 ÷ (测速毫秒 × PPR × 减速比)

测法二:测周法。测两个脉冲之间的时间间隔,适合低速精准测速,但高速时脉冲太密反而容易丢。新手先从定时计数法入门,直观也够用。判断转向就两个引脚,A比B先跳是正转,B先跳是反转,用if判断加一个小状态机就行。

从"测速"到"闭环调速":让小车真正听话

光能测转速只是第一步,真正的价值在闭环。你要的目标转速是100转,实际测出来80转,那就加PWM;测出来120转,就减PWM。这个"目标减实际再调输出"的循环,就是最朴素的PID里的P(比例)。

具体做法:把实测转速和目标转速的差值,乘上一个系数Kp,加到PWM输出上。Kp太小响应慢,太大容易震荡、一抖一抖。先只调P,调到稳定直行不抖动,再考虑加I(积分消稳态误差)和D(微分防超调)。我自己踩的坑是:一开始Kp拍脑袋给了个0.5,结果小车在目标值附近抖得像筛子,降到0.1才稳下来。

跑了闭环之后,机器狗走直线的歪斜问题基本就解决了一大半。同一套代码,把"速度"换成"位置"也能做位置闭环,这就是后面做云台、做机械臂舵机预紧的同一套思路。

新手常踩的几个坑,提前排干净

第一个是共地问题。编码器的地、电机的电源地、单片机的GND必须连到一起,不然霍尔信号会乱跳,数出来的脉冲全是野的,这是掉进频率最高的一类坑。

第二个是上拉电阻。很多霍尔传感器是开漏输出,不接上拉或干脆用模块自带就没事;用裸片就得在信号脚对VCC接个10k上拉,否则电平悬空乱跳。

第三个是中断函数要短。中断里别干串口打印、别写delay这些耗时操作,只做简单计数,不然高转速下脉冲一来就丢,测出来的转速虚高偏低都有。还有去抖,脉冲噪声大就在硬件上加个电容或在软件里做短延时确认。

第四个是别把编码器线和电机大电流线靠太近。PWM调速的电磁干扰会窜进编码器信号线,轻则丢脉冲重则计数错乱,布线时分开走,必要时套屏蔽线。

说在最后

霍尔编码器电机测速,是DIY机器人从"能动"跨到"可控"的那道门槛。硬件上多花十几二十块、接线多两根,换来的是小车不跑偏、速度能闭环、后面所有精确控制都有了基础。新手照着"定时计数→套公式→加PID"这条路走,半天能跑通,比反复换舵机试错强多了。

版权声明:
作者:算法老K
链接:https://www.aiddithome.com/p/49f86849ca63f.html
来源:硬件DIY
实践版权归作者所有,未经允许请勿转载,若此实践存在违规行为,您可以点击 “举报”。


登录 后发表评论
4条评论
线比代码多
1楼 · 13小时前

共地那条真是血泪,我上次编码器数字乱跳查了一晚上,最后发现地没连一起,接上就好了。

参数党小马
2楼 · 13小时前

公式其实就一个:增量×60000÷(毫秒×PPR×减速比)。参数党表示记下这句就够入门了。

电烙铁爱好者
3楼 · 13小时前

霍尔编码器和光电编码器其实都能测速,霍尔便宜耐脏适合小车,这篇说透了。

入门没多久的新手
4楼 · 13小时前

中断函数别放delay这句太对了,我加了个打印结果直接丢脉冲,新手真别学。