基于 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 更快)

相关推荐
崇山峻岭之间2 小时前
单片机时钟配置01
单片机·嵌入式硬件
踏着七彩祥云的小丑3 小时前
嵌入式——面试题
单片机·嵌入式硬件
椰羊~王小美4 小时前
STM32加密
stm32·单片机·嵌入式硬件
Wave8454 小时前
STM32 启动模式与固件更新机制 (底层深度解析)
stm32·单片机·嵌入式硬件
EVERSPIN4 小时前
国产异步SRAM单片机外扩专用存储芯片
单片机·嵌入式硬件·sram·国产sram·异步sram·国产异步sram
WeeJot嵌入式5 小时前
【中断】深入了解中断
单片机·嵌入式硬件
潜创微科技5 小时前
IT6625 HDMI2.0 转双端口 MIPI CSI/DSI 高清转换芯片方案
嵌入式硬件·音视频
NCABGroup5 小时前
从设计与制造入手,如何对PCB的EMC进行优化?
单片机·嵌入式硬件·物联网·pcb·叠层结构·阻抗计算
VBsemi-专注于MOSFET研发定制5 小时前
高端养老陪伴机器人功率链路设计实战:安全、静音与可靠性的融合之道
单片机·嵌入式硬件