測量車輛或電機的速度/轉速一直是我們嘗試的迷人項目。因此,在本項目中,我們將使用工業就緒的PIC微控制器構建一個。我們將使用一塊磁鐵和一個霍爾傳感器來測量速度。還有其他方法/傳感器可以測量速度,但是,使用霍爾傳感器很便宜,也可用于任何類型的電機/車輛。通過做這個項目,我們還將提高我們學習PIC16F877A的技能,因為該項目涉及中斷和定時器的使用。在該項目結束時,您將能夠計算任何旋轉物體所覆蓋的速度和距離,并將其顯示在 16x2 LCD 屏幕上。讓我們從這個帶有PIC的數字車速表和里程表電路開始。
所需材料:
計算速度和覆蓋距離:
在我們實際開始構建電路之前,讓我們了解如何使用霍爾傳感器和磁鐵來計算車輪的速度。
霍爾傳感器是一種可以根據磁鐵的極性檢測磁鐵存在的設備。我們將一小塊磁鐵貼在車輪上,并將霍爾傳感器放置在其附近,以便每次車輪旋轉時,霍爾傳感器都會檢測到它。然后,我們使用PIC微控制器上的定時器和中斷來計算車輪完全旋轉所需的時間。
知道所花費的時間后,我們可以使用以下公式計算 RPM,其中 1000/時間將給我們 RPS,進一步將其乘以 60 將得到 RPM
rpm = (1000/timetaken) * 60;
其中(1000/時間)給出rps(每秒轉數),乘以60將rps轉換為rpm(每分鐘轉數)。
現在要計算車輛的速度,我們必須知道車輪的半徑。在我們的項目中,我們使用了半徑僅為3厘米的小玩具輪。但是, 我們假設車輪的半徑為30厘米 (0.3米),以便我們可以可視化讀數。
該值也乘以 0.37699,因為我們知道 速度 = (RPM(直徑 * Pi)/ 60)。 公式簡化為
v= radius_of_wheel * rpm * 0.37699;
一旦我們計算出速度,我們還可以使用類似的方法計算覆蓋的距離。通過我們的霍爾和磁鐵布置,我們知道輪子旋轉了多少次。我們還知道車輪的半徑,使用它我們可以找到車輪的周長,假設車輪的半徑為 0.3m(R),周長 PiRR 的值將為 0.2827。這意味著每次霍爾傳感器與磁體相遇時,車輪都會覆蓋 0.2827 米的距離。
Distance_covered = distance_covered + circumference_of_the_circle
因為,現在我們知道這個項目將如何工作,讓我們繼續我們的電路圖并開始構建它。
電路圖和硬件設置:
這個車速表和里程表項目的電路圖非常簡單,可以構建在面包板上。如果您一直遵循PIC教程,那么您還可以重用我們用于學習PIC微控制器的硬件。在這里,我們使用了與PIC微控制器一起為LED閃爍構建的相同 性能板 ,如下所示:
PIC16F877A MCU 的引腳連接如下表所示。
S.No: | 引腳編號 | 引腳名稱 | 已連接到 |
---|---|---|---|
1 | 21 | RD2 | 液晶顯示器的 RS |
2 | 22 | RD3 | 液晶顯示器的E |
3 | 27 | RD4 | 液晶屏D4 |
4 | 28 | RD5 | 液晶屏D5 |
5 | 29 | RD6 | 液晶屏D6 |
6 | 30 | RD7 | 液晶屏D7 |
7 | 33 | RB0/INT | 3^RD^霍爾傳感器引腳 |
構建項目后,如下圖所示
如您所見,我用兩個盒子將電機和一個霍爾傳感器放置在附近的位置。您可以將磁鐵固定在旋轉物體上,并完好無損地靠近它的霍爾傳感器,使其能夠檢測到磁鐵。
注意: 霍爾傳感器具有極性,因此請確保它正在檢測哪個極并相應地放置它。
還要確保將上拉電阻與霍爾傳感器的輸出引腳一起使用。
模擬:
該項目的模擬是使用 Proteus 完成的。由于該項目涉及移動物體,因此無法使用仿真來演示整個項目,但可以驗證LCD的工作。只需將十六進制文件加載到模擬中并對其進行模擬即可。您將能夠注意到液晶屏工作,如下所示。
為了檢查車速表和里程表是否正常工作,我已將霍爾傳感器更換為邏輯狀態設備。在仿真過程中,您可以單擊邏輯狀態按鈕來觸發中斷,并檢查所覆蓋的速度和距離是否如上所示得到更新。
對 PIC16F877A 進行編程:
如前所述,我們將借助PIC16F877A微控制器中的定時器和中斷來計算車輪完全旋轉所需的時間。我們已經在之前的教程中學習了如何使用計時器。我在本文末尾給出了該項目的完整代碼。此外,我在下面解釋了幾行重要內容。
以下代碼行將端口 D 初始化為用于 LCD 接口的輸出引腳,將 RB0 初始化為輸入引腳,以將其用作外部引腳。此外,我們還使用OPTION_REG啟用了內部上拉電阻,并將64設置為預售。然后,我們啟用全局和外設中斷以啟用定時器和外部中斷。要將RB0定義為外部中斷位,應將INTE設為高電平。溢出值設置為 100,以便每 1 毫秒觸發計時器中斷標志 TMR0IF。這將有助于運行毫秒計時器以確定以毫秒為單位所花費的時間:
TRISD = 0x00; //PORTD declared as output for interfacing LCD
TRISB0 = 1; //DEfine the RB0 pin as input to use as interrupt pin
OPTION_REG = 0b00000101; // Timer0 64 as prescalar // Also Enables PULL UPs
TMR0=100; // Load the time value for 1ms; delayValue can be between 0-256 only
TMR0IE=1; //Enable timer interrupt bit in PIE1 register
GIE=1; //Enable Global Interrupt
PEIE=1; //Enable the Peripheral Interrupt
INTE = 1; //Enable RB0 as external Interrupt pin
每次檢測到中斷時,都會執行以下函數。我們可以根據自己的意愿命名函數,所以我將其命名為 speed_isr()。 該程序處理兩個中斷,一個是定時器中斷,另一個是外部中斷。每當發生定時器中斷時,標志 TMR0IF 都會變高,為了清除和重置中斷,我們必須通過定義 TMR0IF=0 使其變低,如下面的代碼所示。
void interrupt speed_isr()
{
if(TMR0IF==1) // Timer has overflown
{
TMR0IF=0; // Clear timer interrupt flag
milli_sec++;
}
if (INTF==1)
{
rpm = (1000/milli_sec) * 60;
speed = 0.3 * rpm * 0.37699; // (Assuming the wheel radius to be 30cm)
INTF = 0; // clear the interrupt flag
milli_sec=0;
distance= distance+028.2;
}
}
同樣,當發生外部中斷時,標志 INTF 將變為高電平,這也應通過定義 INTF=0 來清除。計時器中斷跟蹤所花費的時間,外部中斷確定車輪何時完成一次完整旋轉。有了這些數據,在每次外部中斷期間計算車輪覆蓋的速度和距離。
計算出速度和距離后,可以使用我們的LCD功能簡單地顯示在LCD屏幕上。如果您不熟悉 LCD,請參閱我們的 LCD 與 PIC16F877A MCU 接口教程。
工作說明:
準備好硬件和軟件后,只需將代碼上傳到PIC16F877A即可。如果您是PIC的新手,那么您應該閱讀一些有關如何將程序上傳到PIC16F877A微控制器的教程。
我使用可變鍋來調整電機的速度以進行演示。您也可以使用相同的查找實時應用程序。如果一切按預期工作,那么您應該能夠以公里/小時為單位獲得速度和以米為單位的距離,如下面的視頻所示。
-
PIC微控制器
+關注
關注
0文章
17瀏覽量
7392 -
車速表
+關注
關注
0文章
14瀏覽量
8301 -
里程表
+關注
關注
1文章
15瀏覽量
9864
發布評論請先 登錄
相關推薦
評論