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