测量车辆或电动机的速度/ rpm一直是我们尝试的有趣项目。因此,在这个项目中,我们将使用可用于工业环境的PIC微控制器来构建一个。我们将使用一块磁铁和一个霍尔传感器来测量速度。还有其他方法/传感器来测量速度,但是使用霍尔传感器很便宜,并且也可以用于任何类型的电动机/车辆。通过该项目,我们还将提高学习PIC16F877A的技能,因为该项目涉及中断和定时器的使用。在该项目结束时,您将能够计算任何旋转物体所覆盖的速度和距离,并将其显示在16x2 LCD屏幕上。让我们从带有PIC的数字车速表和里程表电路开始。
所需材料:
- PIC16F877A
- 7805稳压器
- 霍尔效应传感器(US1881 / 04E)
- 16 * 2 LCD显示屏
- 一小块磁铁
- 连接线
- 电容器类
- 面包板。
- 电源供应
计算覆盖的速度和距离:
在实际开始构建电路之前,让我们了解如何使用霍尔传感器和磁体来计算车轮速度。以前,我们使用相同的技术来构建Arduino速度计,该速度计可在Android智能手机上显示读数。
霍尔传感器是一种可以根据其极性检测磁体是否存在的设备。我们将一小块磁铁粘在车轮上,然后将霍尔传感器放置在其附近,使得每次车轮旋转时霍尔传感器都会检测到它。然后,我们使用PIC微控制器上的计时器和中断功能来计算砂轮完整旋转所需的时间。
知道所需的时间后,我们可以使用以下公式计算RPM,其中1000 /时间将为我们提供RPS,再将其乘以60将为您提供RPM
rpm =(1000 /耗时)* 60;
其中(1000 / timetaken)给出rps(每秒转数),然后乘以60将rps转换为rpm(每分钟转数)。
现在要计算车辆的速度,我们必须知道车轮的半径。在我们的项目中,我们使用了一个半径仅为3厘米的小型玩具轮。但是,我们假设车轮的半径为30cm(0.3m),以便我们可以可视化读数。
由于我们知道Velocity =(RPM(直径* Pi)/ 60),因此该值也乘以0.37699 。公式简化为
v =车轮半径* rpm * 0.37699;
一旦计算出速度,我们也可以使用类似的方法计算出覆盖的距离。通过霍尔和磁铁的布置,我们知道轮子已经旋转了多少次。我们还知道了车轮的半径,通过它我们可以找到车轮的周长,假设车轮的半径为0.3m(R),则周长Pi * R * R的值为0.2827。这意味着,每次霍尔传感器碰到磁铁时,车轮都会覆盖0.2827米的距离。
覆盖的距离=覆盖的距离+圆周的周长
因为,现在我们知道了该项目的工作方式,因此继续进行电路图并开始构建它。
电路图和硬件设置:
该车速表和里程表项目的电路图非常简单,可以建立在试验板上。如果您一直在关注PIC教程,那么您也可以重用我们用于学习PIC微控制器的硬件。在这里,我们使用了为通过PIC微控制器进行LED闪烁而构建的相同的性能板,如下所示:
下表列出了PIC16F877A MCU的引脚连接。
序号 |
针号 |
引脚名称 |
连接到 |
1个 |
21 |
RD2 |
LCD的RS |
2 |
22 |
RD3 |
LCD的E |
3 |
27 |
RD4 |
LCD D4 |
4 |
28 |
RD5 |
LCD D5 |
5 |
29 |
RD6 |
LCD D6 |
6 |
30 |
RD7 |
LCD D7 |
7 |
33 |
RB0 / INT |
3 RD霍尔传感器的销 |
构建项目后,下图应如下所示
如您所见,我已使用两个盒子将电机和霍尔传感器放置在附近位置。您可以将磁铁固定在旋转的物体上,并以可以检测到磁铁的方式完好地将霍尔传感器靠近它。
注意: 霍尔传感器具有极性,因此请确保其检测到哪个极并将其相应放置。
还要确保在霍尔传感器的输出引脚上使用上拉电阻。
模拟:
此项目的仿真是使用Proteus完成的。由于项目涉及移动物体,因此无法通过仿真演示完整的项目,但可以验证LCD的工作情况。只需将十六进制文件加载到Simulation并对其进行仿真。您将可以注意到LCD的工作如下所示。
为了检查车速表和里程表是否正常工作,我已用逻辑状态设备替换了霍尔传感器。在仿真过程中,您可以单击逻辑状态按钮以触发中断,并检查覆盖的速度和距离是否正在如上所示更新。
对PIC16F877A进行编程:
如前所述,我们将利用PIC16F877A单片机中的定时器和中断来计算砂轮完整旋转所需的时间。在之前的教程中,我们已经学习了如何使用计时器。我在本文结尾给出了该项目的完整代码。此外,我在下面解释了一些重要的内容。
下面的代码行将端口D初始化为LCD接口的输出引脚,并将RB0初始化为用作外部引脚的输入引脚。此外,我们使用OPTION_REG启用了内部上拉电阻,并且还将64设置为预售。然后,我们启用全局和外围中断来启用定时器和外部中断。要将RB0定义为外部中断位,应将INTE设为高。溢出值设置为100,因此每1毫秒将触发定时器中断标志TMR0IF。这将有助于运行毫秒计时器来确定以毫秒为单位的时间:
TRISD = 0x00; //声明PORTD为接口LCD TRISB0 = 1的输出; //定义RB0引脚为输入,以用作中断引脚OPTION_REG = 0b00000101; // Timer0 64作为预分频器// //还使能PULL UP TMR0 = 100; //加载时间值1ms; delayValue只能在0-256之间,只有TMR0IE = 1; //使能PIE1寄存器GIE = 1的定时器中断位; //启用全局中断PEIE = 1; //启用外设中断INTE = 1; //使能RB0作为外部中断引脚
每次检测到中断时,将执行以下功能。我们可以根据需要命名函数,因此我将其命名为 speed_isr()。 该程序处理两个中断,一个是定时器中断,另一个是外部中断。每当发生定时器中断时,标志TMR0IF就会变为高电平,要清除并复位该中断,我们必须通过定义TMR0IF = 0使其变为低电平,如以下代码所示。
void interrupt speed_isr(){if(TMR0IF == 1)//定时器溢出{TMR0IF = 0; //清除定时器中断标志milli_sec ++; }如果(INTF == 1){rpm =(1000 / milli_sec)* 60; 速度= 0.3 * rpm * 0.37699; //(假设车轮半径为30cm)INTF = 0; //清除中断标志milli_sec = 0; 距离=距离+028.2; }}
同样,当发生外部中断时,标志INTF将变高,这也应通过定义INTF = 0来清除。计时器中断将保持所花费的时间,外部中断将确定车轮何时完成一整圈的旋转。利用该数据,可以在每个外部中断期间计算出车轮所覆盖的速度和距离。
一旦计算出速度和距离,就可以使用我们的LCD功能将其简单地显示在LCD屏幕上。如果您不熟悉LCD,请参考我们的LCD与PIC16F877A MCU介面教程。
工作说明:
准备好硬件和软件后,只需将代码上传到PIC16F877A。如果您是PIC的新手,那么您应该只阅读一些教程,以了解如何将程序上传到PIC16F877A单片机。
我已使用变量POT来调整电动机的速度,以进行演示。您也可以使用相同的工具来查找实时应用程序。如果一切正常,那么您应该能够获得以米/小时为单位的“ Km / Hr速度”和“距离”,如以下视频所示。
希望您喜欢这个项目并使它正常工作。如果没有,您可以使用下面的评论部分或论坛发表您的疑问。