Arduino 高速转速计 - 单次检测算法实测 6.5MHz 级响应,红外 + 红激光方案
元器件清单
| 元器件 | 数量 | 关键参数/备注 |
|---|---|---|
| Arduino UNO | 1 | 16MHz 晶振 |
| IR 红外接近传感器 | 1 | 必须对红光激光敏感 (推荐 TCRT5000 或同类) |
| 红色激光二极管 (655nm) | 1 | 或现成红色激光指示器,**必须为红光**,绿/蓝光 IR 分量太弱 |
| DC 电机 + 叶片 | 1 | 测试用,叶片数 n 已知 |
| 9V 电池 + 接线 | 1 | 激光供电 |
| 跳线 | 3 | 传感器连接 |
核心原理:单次检测算法
传统转速计测量一个周期或多个周期取平均,**本项目创新采用“单次阻断检测”**:
- 红激光照射 IR 传感器,基线读数高 (~1023)
- 风扇叶片旋转遮挡激光 → 传感器读数骤降 (~0)
- 每次遮挡对应 1/n 圈 (n=叶片数)
- 测量相邻两次遮挡的时间差 Δt → 角速度 ω = (2π/n) / Δt → RPM = 60 / (n × Δt)
优势:
- **极高灵敏度**:每 1/n 圈输出一次 RPM,实时捕捉微小波动
- **响应快**:< 40ms 完成一次计算,适合高速电机
- **分辨率高**:RPM 显示两位小数

串口每秒输出 ~2 次 RPM 值,精度达 0.01 RPM,清晰显示转速微小变化
硬件接线
| 信号 | Arduino UNO | 备注 |
|---|---|---|
| IR 传感器 VCC | 5V | |
| IR 传感器 GND | GND | |
| IR 传感器 OUT | A0 | 模拟输入,读取电压变化 |
| 激光正极 | 9V 电池 + | 通过开关控制 |
| 激光负极 | 9V 电池 - |
机械对齐:激光束对准 IR 传感器接收面,风扇叶片旋转平面穿过光路。叶片宽度、检测半径需实测填入代码常量。


核心代码
// 高速 RPM 计数器 - 单次阻断检测算法
// 作者: YASH36
const int sensorPin = A0;
const float bladeWidth = 0.012; // 叶片宽度 (米),实测填入
const float detectRadius = 0.045; // 检测点半径 (米),实测填入
const float twoPI = 6.283185307; // 2π
unsigned long t1, t2;
float dt, velocity, period, rpm;
void setup() {
Serial.begin(115200); // 高波特率减少传输延迟
pinMode(sensorPin, INPUT);
Serial.println(F("启动电机,稳定 3 秒后开始测量..."));
delay(3000);
}
void loop() {
// 等待遮挡开始 (信号降低)
if (analogRead(sensorPin) < 950) {
t1 = millis();
delay(30); // 消抖/避免重复触发
}
// 等待遮挡结束 (信号恢复)
if (analogRead(sensorPin) > 950) {
t2 = millis();
dt = t2 - t1; // 遮挡持续时间 (ms)
velocity = bladeWidth / dt; // 线速度 (m/ms)
period = (twoPI * detectRadius) / velocity; // 周期 (ms)
rpm = 60000.0 / period; // RPM = 60秒 / 周期(秒)
}
Serial.print(F("\n RPM = "));
Serial.println(rpm, 2); // 显示两位小数
}
关键参数标定
- 叶片宽度:卡尺测量叶片在检测半径处的弧长宽度
- 检测半径:从电机轴中心到激光束击中叶片的距离
- 阈值 950:根据环境光调整,确保无遮挡时 >950,遮挡时 <100
- 叶片数 n:代码中隐含 n=1 (单叶片);多叶片需将 RPM 结果除以 n,或修改公式 `period = (twoPI * detectRadius) / (velocity * n)`
为什么必须用红色激光?
硅基 IR 传感器对 650-700nm 红光有较强响应,绿光 (532nm) 和蓝光 (450nm) 的 IR 分量极弱,导致基线读数低、信噪比差、无法可靠检测遮挡。实测红光激光指示器即可完美工作。
局限与改进
- 仅适用于有周期性遮挡的旋转体 (风扇、齿轮、带槽转盘)
- 高转速下 `millis()` 精度不足,可改用 `micros()` 或 Timer1 输入捕获
- 环境光干扰:加装遮光罩、调节阈值、或用调制光源+锁相检测
- 多叶片支持:在代码中加入叶片数参数自动换算
作者联系
项目主页:YASH36 项目中心,欢迎交流改进建议。
制造工艺
- 树莓派自动化气雾栽培系统:湿度传感器智能控制
- Portenta H7 对接 MAX6675 热电偶温度传感器教程
- Arduino Nano 与 MPU-6050 构建实时陀螺仪游戏
- DHT11 温湿度传感器项目:LED 指示与压电蜂鸣器报警
- K30 CO₂ 传感器:室内空气质量实时监测
- Unopad:基于 Arduino 的无缝 Ableton Live MIDI 控制器
- Arduino + DHT11 + 以太网盾板温湿度数据记录仪
- 智能物联网罐:ESP8266 + Arduino + 超声波传感器实时监测罐内物位
- 自制简易红外避障传感器:IR LED + 光电二极管 + Arduino
- DFRobot 电容指纹传感器 (ID809) 接入 Arduino/ESP8266 完整教程
- 用 Arduino Uno 和 1Sheeld 构建 4x4x4 LED 立方体 - 互动音乐可视化项目
- Arduino Nano 驱动 128x64 OLED 实时运行康威生命游戏 (元胞自动机)