如何测量车轮的转速?

电器工程 Arduino 传感器 霍尔效应
2022-01-24 18:22:59

我正在尝试使用 Arduino 或 Lilypad 板为我的自行车制作车载系统。

我想我应该使用霍尔效应传感器,但任何替代品也都不错。

我想将我的速度输出到液晶显示器,我想知道最好的方法。

4个回答

使用 Starliner 建议的霍尔效应传感器将是与车轮接口的一种方式。不过,鉴于霍尔效应传感器需要支持硬件来获得干净的数字信号,Achim 和 Shutterdrone 使用簧片开关的建议更有意义。

您也许可以从损坏的自行车电脑中取出磁铁和传感器,但如果您不能,当地的零部件商店应该有一个库存。回收传感器和磁铁的优点是您已经拥有安装硬件。

arduino wiki 上有一个关于ReadingRPM信号的页面。要计算速度,请将 RPM 值乘以车轮的周长(2 * pi * 半径 [以米为单位])。结果将以米/分钟为单位。

编辑:我注意到链接代码适用于每转两个脉冲的系统。一块磁铁足以完成您的任务。此外,对于自行车计算机,您可能希望结果以 KPH 为单位(如果您居住在仍然认为这是文明的地方,则为 MPH)。我对 wiki 上的代码做了一些(未经测试的)修改,以打印出 KPH 并将它们粘贴在下面。

volatile byte revolutions;

unsigned int rpmilli;
float speed;


unsigned long timeold;

void setup()
{
  Serial.begin(9600);
  attachInterrupt(0, rpm_fun, RISING);

  revolutions = 0;
  rpmilli = 0;
  timeold = 0;
}

void loop()
{
  if (revolutions >= 20) { 
    //Update RPM every 20 counts, increase this for better RPM resolution,
    //decrease for faster update

    // calculate the revolutions per milli(second)
    **rpmilli = (millis() - timeold)/revolutions;** EDIT: it should be revolutions/(millis()-timeold)

    timeold = millis();
    **rpmcount = 0;** (EDIT: revolutions = 0;)

    // WHEELCIRC = 2 * PI * radius (in meters)
    // speed = rpmilli * WHEELCIRC * "milliseconds per hour" / "meters per kilometer"

    // simplify the equation to reduce the number of floating point operations
    // speed = rpmilli * WHEELCIRC * 3600000 / 1000
    // speed = rpmilli * WHEELCIRC * 3600

    speed = rpmilli * WHEELCIRC * 3600;

    Serial.print("RPM:");
    Serial.print(rpmilli * 60000,DEC);
    Serial.print(" Speed:");
    Serial.print(speed,DEC);
    Serial.println(" kph");
  }
}

void rpm_fun()
{
  revolutions++;
}

此外,我在此启用了“社区 wiki”,我认为这意味着其他用户可以编辑它。如果我的数学是错误的(你可以证明它!)跳进去为我解决它。:)

实际上,Achim 在这里提出了一个非常好的观点。

簧片(磁性)继电器(开关)和霍尔效应传感器之间存在很大差异。

首先,只要有足够的磁力作用在开关上,簧片继电器就会连接开关,为您提供开/关信号。霍尔效应传感器提供一个电压电平,指示对其施加了多少磁力。

上面显示的代码只能“直接”与簧片继电器一起使用,这并不是说它对霍尔效应传感器根本不起作用,而是说使用霍尔效应传感器会带来额外的挑战。

主要挑战是您将模拟设备视为数字设备 - 期望在脉冲上升时触发。现在,信号不会被脉冲化——它通常会像一个钟形曲线,有各种各样的波动。当磁铁通过霍尔效应传感器时,您可能会多次超过高信号的最小电压(大约 3.5v,IIRC?)。

当然,使用霍尔效应传感器之类的东西时,我们的第一反应是使用 ADC 并读取模拟引脚上的电压电平。但是,在模拟引脚上大约每秒读取 10,000 次(每次读取需要 100uS)。这还假设您所做的只是循环和读取值 - 不会给您留下太多其他时间来更新显示、计算等。更不用说,如果您在错误的时间阅读,您就会错过信号!

我确信可以使用以某种方式链接到 ADC 的中断,但我手头没有这样的知识。

相反,如果您希望使用实际的霍尔效应传感器,我建议将其输入施密特触发器,以将其转换为校准电平的数字(开/关)信号,指示“直接在磁铁下方”。此外,根据施密特触发器中实施的滞后水平,您可能需要进行一些去抖动,以根据当前速度改变去抖动率。然后你可以把它当作一个普通的 Reed 继电器。

!C

霍尔效应传感器和簧片开关是这里提到的最多的,它们是最好的解决方案。

簧片开关会更便宜,但可能会在自行车受到震动时给您错误的脉冲如果这只是路边骑行中的一个,软件可能很容易将其过滤掉,但是当你骑在鹅卵石上时情况就不同了,这可能会一直给你错误的脉冲。更抗震的簧片开关需要更强的磁场才能激活,但钕磁铁可以解决这个问题。

编辑回答 m.Alin 的问题
簧片开关很快。那是因为簧片的质量低(= 低惯性)和低行程,通常只有十分之几毫米。该簧片开关的操作时间 < 0.6 ms,释放时间 < 0.1 ms。在 36 公里/小时时,当安装在车轮直径的一半时,开关在 1 毫秒内移动 5 毫米。所以它足够快,可以在它通过磁铁时被激活。
这份关于同一个开关的文档给出了 > ​​10\$^7\$ 操作的预期寿命,但这并不像看起来那么多。如果您每天跑 25 公里,您将在 2 年内达到 10\$^7\$ 转换事件。
编辑结束

霍尔效应开关没有这些缺点,但价格稍贵一些。


您可以在 2 个脉冲之间获得时间 \$T\$ 作为来自传感器的信息。然后

速度 \$ v = \dfrac{\pi D}{T} \$

如果车轮直径 \$D\$ 以米为单位,则以 m/s 为单位,而 \$T\$ 以秒为单位。通过除以 3.6 转换为 km/h,除以 5.79 为 mph。

距离 \$ s = \text{脉冲计数} \times \pi \times D \$

如果车轮直径 \$D\$ 以米为单位,则以米为单位。以公里为单位的距离除以 1000,以英里为单位除以 1609。

磁铁可以安装在车轮轮辋的边缘,霍尔效应传感器安装在非常靠近(但不接触)磁铁的位置。当车轮旋转并且磁铁通过传感器时,传感器将接收到磁场的变化。