基于 51 单片机配合霍尔传感器实现计数 + 转速测量

基于 51 单片机(AT89C52 / STC89C52 / STC12C5A60S2 等) 配合 霍尔传感器(A3144 / 44E / OH137 等) 实现 计数 + 转速测量,这是最经典、最稳定的入门级测速方案,广泛用于 电机测速、风扇转速、小车轮速 等场景。


一、系统工作原理

金属齿轮 / 磁铁 → 经过霍尔传感器 → 输出脉冲 → 51 单片机外部中断计数 → 计算转速


二、硬件设计

1、 霍尔传感器选型(必须选对)

型号 类型 输出
A3144 / 44E 开关型霍尔 高/低电平(最常用 )
OH137 开关型 同 A3144
SS495 线性霍尔 模拟量(不适合本方案)

本方案只用开关型霍尔


2、典型接线(5V 系统)

霍尔传感器 51 单片机 说明
VCC 5V
GND GND
OUT P3.2 / INT0 接外部中断

OUT 口建议加上拉电阻(10kΩ)


3、测速安装方式

  • 电机轴贴 1 颗小磁铁
  • 或齿轮每转 1 个齿触发一次
  • 每触发一次 = 1 个脉冲

三、测速原理与公式

1、计数方式

  • 使用 外部中断 0(INT0)
  • 每来一个脉冲,计数变量 +1

2、 转速计算公式

1 秒测速法(简单直观)
复制代码
转速(RPM)= 脉冲数 × 60
多磁铁 / 多齿修正公式
复制代码
RPM = (脉冲数 / 每圈脉冲数) × 60

四、完整示例代码(Keil C)

main.c(可直接烧录)

c 复制代码
#include <reg52.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

sbit LED = P1^0;      // 指示灯
uint pulse_cnt = 0;   // 脉冲计数
uint speed_rpm = 0;   // 转速

/* 定时器0:1秒定时 */
void Timer0_Init(void)
{
    TMOD &= 0xF0;
    TMOD |= 0x01;     // 模式1
    TH0 = 0x3C;       // 50ms
    TL0 = 0xB0;
    ET0 = 1;
    EA  = 1;
    TR0 = 1;
}

/* 外部中断0:霍尔脉冲 */
void Int0_Init(void)
{
    IT0 = 1;   // 下降沿触发
    EX0 = 1;
    EA  = 1;
}

/* 外部中断服务函数 */
void Int0_ISR(void) interrupt 0
{
    pulse_cnt++;
    LED = ~LED;   // 每来一个脉冲翻转一次
}

/* 定时器中断:1秒计算一次转速 */
void Timer0_ISR(void) interrupt 1
{
    static uchar cnt = 0;
    TH0 = 0x3C;
    TL0 = 0xB0;

    if (++cnt >= 20)   // 20×50ms = 1s
    {
        cnt = 0;
        speed_rpm = pulse_cnt * 60; // 1个脉冲/转
        pulse_cnt = 0;
    }
}

void main(void)
{
    Timer0_Init();
    Int0_Init();

    while (1)
    {
        // speed_rpm 即为当前转速
    }
}

五、串口输出转速

c 复制代码
void UART_Init(void)
{
    SCON = 0x50;
    TMOD |= 0x20;
    TH1 = 0xFD;   // 9600bps
    TL1 = 0xFD;
    TR1 = 1;
    EA  = 1;
}

void UART_SendByte(uchar dat)
{
    SBUF = dat;
    while(!TI);
    TI = 0;
}

void Send_Speed(void)
{
    UART_SendByte(speed_rpm / 100 + '0');
    UART_SendByte(speed_rpm % 100 / 10 + '0');
    UART_SendByte(speed_rpm % 10 + '0');
    UART_SendByte('\r');
    UART_SendByte('\n');
}

参考代码 基于51单片机控制霍尔传感器实现计数测速(附仿真) www.youwenfan.com/contentcst/182295.html

六、提高精度的 3 个关键点

1、消抖(非常重要)

霍尔信号在边缘可能产生抖动:

c 复制代码
void Int0_ISR(void) interrupt 0
{
    static uint last_time = 0;
    uint now = TH0;

    if (now - last_time > 5)  // 5ms 消抖
    {
        pulse_cnt++;
    }
    last_time = now;
}

2、多磁铁测速

磁铁数 公式
1 RPM = 脉冲 × 60
2 RPM = 脉冲 × 30
N RPM = (脉冲 / N) × 60

3、低速用"周期法",高速用"频率法"

转速 方法
< 30 RPM 测周期(定时器捕获)
> 30 RPM 测频率(本方案 )

七、常见问题排查

问题 原因
计数不准 未消抖 / 磁铁太近
转速跳动 定时器误差
无反应 霍尔接反 / 磁铁极性不对
一直触发 磁场干扰 / 上拉缺失

八、可扩展方向

LCD1602 / OLED 显示转速

多路霍尔(双电机测速)

PID 电机恒速控制

超低速周期法测速

改成 STC12 / STC15(1T 更快)

相关推荐
深圳市宝华视联5 小时前
Python 读取 IP 视频流简单 Demo
python·嵌入式硬件·opencv·网络协议·tcp/ip·实时音视频·嵌入式实时数据库
恒锐丰科技韩生5 小时前
RB6005A|晶准 单节锂电池内置 MOS 保护芯片 DFN2×3‑8
嵌入式硬件·硬件工程
youshi66685 小时前
stm32-PWR、低功耗模式
stm32·单片机·嵌入式硬件
ACP广源盛139246256736 小时前
Qwen3.8‑2.4T 开源落地@ACP#国产 Serdes 长距离视频传输芯片 GSV5800 在私有化 AI 服务中的价值与应用场景
大数据·数据库·人工智能·嵌入式硬件·矩阵·开源·音视频
Funing76 小时前
STM32 电机动态 PI 控制:从编码器反馈、增量式 PI 到 Matlab 参数拟合与 PWM 输出
stm32·嵌入式硬件·matlab·pi控制算法
云泽8086 小时前
深入浅出 STM32(十八):时钟树、总线与寄存器的底层联动机制
stm32·单片机·嵌入式硬件
米饭不加菜7 小时前
C51 语言参考手册
经验分享·笔记·单片机·嵌入式硬件
深圳市宝华视联7 小时前
院感约束下,手术室音视频布线与设备摆放实施注意事项
嵌入式硬件·音视频·实时音视频·视频编解码·嵌入式实时数据库
科芯创展7 小时前
2.7VIN,5VOUT,360KHz,电荷泵升压芯片,XZ3120
单片机
dozenyaoyida8 小时前
LittleFS 嵌入式文件系统机制拆解与某 RISC-V MCU 实测配置
单片机·嵌入式·文件系统·risc-v·littlefs·flash存储